@cyanheads/brapi-mcp-server 0.4.9 → 0.4.11
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 +1 -1
- package/Dockerfile +9 -0
- package/README.md +58 -8
- package/changelog/0.4.x/0.4.10.md +30 -0
- package/changelog/0.4.x/0.4.11.md +19 -0
- package/dist/config/server-config.d.ts +7 -0
- package/dist/config/server-config.d.ts.map +1 -1
- package/dist/config/server-config.js +28 -0
- package/dist/config/server-config.js.map +1 -1
- package/dist/index.js +26 -6
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.d.ts +39 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.js +107 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.d.ts +23 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.js +55 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.d.ts +38 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.js +157 -0
- package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts +8 -4
- 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 +14 -17
- 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 +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts +2 -0
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js +10 -0
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/index.d.ts +75 -2
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/index.js +15 -0
- package/dist/mcp-server/tools/definitions/index.js.map +1 -1
- package/dist/mcp-server/tools/shared/find-helpers.d.ts +1 -0
- package/dist/mcp-server/tools/shared/find-helpers.d.ts.map +1 -1
- package/dist/mcp-server/tools/shared/find-helpers.js +9 -0
- package/dist/mcp-server/tools/shared/find-helpers.js.map +1 -1
- package/dist/mcp-server/tools/shared/raw-routing-hints.js +1 -1
- package/dist/mcp-server/tools/shared/raw-routing-hints.js.map +1 -1
- package/dist/services/canvas-bridge/canvas-bridge.d.ts +100 -0
- package/dist/services/canvas-bridge/canvas-bridge.d.ts.map +1 -0
- package/dist/services/canvas-bridge/canvas-bridge.js +286 -0
- package/dist/services/canvas-bridge/canvas-bridge.js.map +1 -0
- package/dist/services/canvas-bridge/index.d.ts +8 -0
- package/dist/services/canvas-bridge/index.d.ts.map +1 -0
- package/dist/services/canvas-bridge/index.js +7 -0
- package/dist/services/canvas-bridge/index.js.map +1 -0
- package/dist/services/canvas-bridge/types.d.ts +45 -0
- package/dist/services/canvas-bridge/types.d.ts.map +1 -0
- package/dist/services/canvas-bridge/types.js +11 -0
- package/dist/services/canvas-bridge/types.js.map +1 -0
- package/dist/services/dataset-store/dataset-store.d.ts +12 -3
- package/dist/services/dataset-store/dataset-store.d.ts.map +1 -1
- package/dist/services/dataset-store/dataset-store.js +22 -4
- package/dist/services/dataset-store/dataset-store.js.map +1 -1
- package/dist/services/dataset-store/types.d.ts +7 -0
- package/dist/services/dataset-store/types.d.ts.map +1 -1
- package/package.json +11 -2
- package/server.json +3 -3
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CanvasBridge — server-side adapter over the framework's
|
|
3
|
+
* `DataCanvas` primitive. Owns three concerns the framework leaves to the
|
|
4
|
+
* consumer: (1) per-tenant default canvas resolution (the agent never passes
|
|
5
|
+
* `canvas_id`; the bridge caches and reuses it via `ctx.state`), (2) deriving
|
|
6
|
+
* SQL-safe table names from UUID-shaped dataset IDs, and (3) tracking
|
|
7
|
+
* originating-dataset provenance so `brapi_dataframe_describe` can surface it.
|
|
8
|
+
*
|
|
9
|
+
* No-ops cleanly when the framework canvas service is undefined or when
|
|
10
|
+
* `BRAPI_CANVAS_ENABLED=false` — `isEnabled()` is the single gate every caller
|
|
11
|
+
* checks before hitting any canvas op.
|
|
12
|
+
*
|
|
13
|
+
* @module services/canvas-bridge/canvas-bridge
|
|
14
|
+
*/
|
|
15
|
+
import { JsonRpcErrorCode, McpError } from '@cyanheads/mcp-ts-core/errors';
|
|
16
|
+
/**
|
|
17
|
+
* Construct a `RequestContext` slice from the handler `Context`. The
|
|
18
|
+
* framework's `RequestContext` carries an `[key: string]: unknown` index
|
|
19
|
+
* signature which the strict `Context` interface lacks, so direct
|
|
20
|
+
* assignment fails despite the 0.8.12 optional-field widening.
|
|
21
|
+
*/
|
|
22
|
+
function asRequestContext(ctx) {
|
|
23
|
+
const rc = {
|
|
24
|
+
requestId: ctx.requestId,
|
|
25
|
+
timestamp: ctx.timestamp,
|
|
26
|
+
};
|
|
27
|
+
if (ctx.tenantId !== undefined)
|
|
28
|
+
rc.tenantId = ctx.tenantId;
|
|
29
|
+
if (ctx.traceId !== undefined)
|
|
30
|
+
rc.traceId = ctx.traceId;
|
|
31
|
+
if (ctx.spanId !== undefined)
|
|
32
|
+
rc.spanId = ctx.spanId;
|
|
33
|
+
return rc;
|
|
34
|
+
}
|
|
35
|
+
/** State key holding the per-tenant default canvasId (opaque 10-char token). */
|
|
36
|
+
const DEFAULT_CANVAS_KEY = 'brapi/canvas/default';
|
|
37
|
+
/** Prefix for per-table provenance entries — keyed by canvas table name. */
|
|
38
|
+
const TABLE_META_PREFIX = 'brapi/canvas/tablemeta/';
|
|
39
|
+
/** Auto-registered dataset-table prefix. Anything else is user-derived (registerAs). */
|
|
40
|
+
const DATASET_TABLE_PREFIX = 'ds_';
|
|
41
|
+
/** Bridge for `core.canvas` that adds per-tenant default-canvas semantics. */
|
|
42
|
+
export class CanvasBridge {
|
|
43
|
+
canvas;
|
|
44
|
+
serverConfig;
|
|
45
|
+
constructor(canvas, serverConfig) {
|
|
46
|
+
this.canvas = canvas;
|
|
47
|
+
this.serverConfig = serverConfig;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* True when both the framework canvas service and the server-side gate are
|
|
51
|
+
* on. Every caller must check this before any canvas op.
|
|
52
|
+
*/
|
|
53
|
+
isEnabled() {
|
|
54
|
+
return this.canvas !== undefined && this.serverConfig.canvasEnabled;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Acquire the per-tenant default canvas. The canvasId is cached in
|
|
58
|
+
* `ctx.state` so subsequent calls reuse the same canvas (sliding TTL on the
|
|
59
|
+
* canvas itself keeps it warm). On stale-id errors (NotFound), clears the
|
|
60
|
+
* cache and acquires a fresh canvas — matches the spirit of the framework's
|
|
61
|
+
* "omit on retry" recovery hint without surfacing the token to the agent.
|
|
62
|
+
*/
|
|
63
|
+
async getInstance(ctx) {
|
|
64
|
+
const canvas = this.requireCanvas();
|
|
65
|
+
const cached = await ctx.state.get(DEFAULT_CANVAS_KEY);
|
|
66
|
+
try {
|
|
67
|
+
const instance = await canvas.acquire(cached ?? undefined, asRequestContext(ctx));
|
|
68
|
+
if (!cached || instance.isNew) {
|
|
69
|
+
await ctx.state.set(DEFAULT_CANVAS_KEY, instance.canvasId);
|
|
70
|
+
}
|
|
71
|
+
return instance;
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
if (cached && isCanvasNotFound(err)) {
|
|
75
|
+
await ctx.state.delete(DEFAULT_CANVAS_KEY);
|
|
76
|
+
const fresh = await canvas.acquire(undefined, asRequestContext(ctx));
|
|
77
|
+
await ctx.state.set(DEFAULT_CANVAS_KEY, fresh.canvasId);
|
|
78
|
+
return fresh;
|
|
79
|
+
}
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Auto-register a spilled dataset on the canvas. Called from `DatasetStore`
|
|
85
|
+
* after a successful create. Logs a warning and swallows on failure —
|
|
86
|
+
* canvas registration is a best-effort enrichment of the spillover, not a
|
|
87
|
+
* blocking step.
|
|
88
|
+
*/
|
|
89
|
+
async registerDataset(ctx, metadata, rows) {
|
|
90
|
+
if (!this.isEnabled())
|
|
91
|
+
return { registered: false };
|
|
92
|
+
const tableName = datasetTableName(metadata.datasetId);
|
|
93
|
+
try {
|
|
94
|
+
const instance = await this.getInstance(ctx);
|
|
95
|
+
await instance.registerTable(tableName, rows);
|
|
96
|
+
const tableMeta = {
|
|
97
|
+
datasetId: metadata.datasetId,
|
|
98
|
+
source: metadata.source,
|
|
99
|
+
baseUrl: metadata.baseUrl,
|
|
100
|
+
query: metadata.query,
|
|
101
|
+
createdAt: metadata.createdAt,
|
|
102
|
+
expiresAt: metadata.expiresAt,
|
|
103
|
+
};
|
|
104
|
+
await ctx.state.set(tableMetaKey(tableName), tableMeta, {
|
|
105
|
+
ttl: this.serverConfig.datasetTtlSeconds,
|
|
106
|
+
});
|
|
107
|
+
ctx.log.debug('Canvas auto-register succeeded', {
|
|
108
|
+
datasetId: metadata.datasetId,
|
|
109
|
+
tableName,
|
|
110
|
+
rowCount: metadata.rowCount,
|
|
111
|
+
});
|
|
112
|
+
return { registered: true, tableName };
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
ctx.log.warning('Canvas auto-register failed; dataset still available via brapi_manage_dataset', {
|
|
116
|
+
datasetId: metadata.datasetId,
|
|
117
|
+
tableName,
|
|
118
|
+
error: err instanceof Error ? err.message : String(err),
|
|
119
|
+
});
|
|
120
|
+
return { registered: false };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Drop the canvas table corresponding to a deleted dataset. Mirrors
|
|
125
|
+
* `registerDataset` — best-effort, never throws.
|
|
126
|
+
*/
|
|
127
|
+
async dropDataset(ctx, datasetId) {
|
|
128
|
+
if (!this.isEnabled())
|
|
129
|
+
return { dropped: false };
|
|
130
|
+
const tableName = datasetTableName(datasetId);
|
|
131
|
+
try {
|
|
132
|
+
const instance = await this.getInstance(ctx);
|
|
133
|
+
const dropped = await instance.drop(tableName);
|
|
134
|
+
await ctx.state.delete(tableMetaKey(tableName));
|
|
135
|
+
return { dropped };
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
ctx.log.warning('Canvas auto-drop failed', {
|
|
139
|
+
datasetId,
|
|
140
|
+
tableName,
|
|
141
|
+
error: err instanceof Error ? err.message : String(err),
|
|
142
|
+
});
|
|
143
|
+
return { dropped: false };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Run a SQL query against the per-tenant default canvas. Caps `rowLimit` to
|
|
148
|
+
* `BRAPI_CANVAS_MAX_ROWS` so a missing/excessive caller value can't bypass
|
|
149
|
+
* the response-size budget. Cancellation flows through `ctx.signal`; the
|
|
150
|
+
* timeout wraps the AbortSignal with a wall-clock cap.
|
|
151
|
+
*/
|
|
152
|
+
async query(ctx, sql, options = {}) {
|
|
153
|
+
const instance = await this.getInstance(ctx);
|
|
154
|
+
const cap = this.serverConfig.canvasMaxRows;
|
|
155
|
+
const rowLimit = Math.min(options.rowLimit ?? cap, cap);
|
|
156
|
+
const queryOpts = {
|
|
157
|
+
rowLimit,
|
|
158
|
+
signal: composeSignal(ctx.signal, this.serverConfig.canvasQueryTimeoutMs),
|
|
159
|
+
};
|
|
160
|
+
if (options.preview !== undefined)
|
|
161
|
+
queryOpts.preview = options.preview;
|
|
162
|
+
if (options.registerAs !== undefined)
|
|
163
|
+
queryOpts.registerAs = options.registerAs;
|
|
164
|
+
return await instance.query(sql, queryOpts);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Register an explicitly-named table (used by the rare consumer that wants
|
|
168
|
+
* to push rows directly without going through DatasetStore spillover).
|
|
169
|
+
*/
|
|
170
|
+
async registerTable(ctx, name, rows) {
|
|
171
|
+
const instance = await this.getInstance(ctx);
|
|
172
|
+
return await instance.registerTable(name, rows);
|
|
173
|
+
}
|
|
174
|
+
/** Drop a single canvas table by name. Returns true when found and removed. */
|
|
175
|
+
async drop(ctx, name) {
|
|
176
|
+
const instance = await this.getInstance(ctx);
|
|
177
|
+
const dropped = await instance.drop(name);
|
|
178
|
+
if (dropped)
|
|
179
|
+
await ctx.state.delete(tableMetaKey(name));
|
|
180
|
+
return dropped;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Describe one or all canvas tables, augmenting the framework's `TableInfo`
|
|
184
|
+
* with originating-dataset provenance for auto-registered tables.
|
|
185
|
+
*/
|
|
186
|
+
async describe(ctx, options = {}) {
|
|
187
|
+
const instance = await this.getInstance(ctx);
|
|
188
|
+
const describeOpts = {};
|
|
189
|
+
if (options.tableName !== undefined)
|
|
190
|
+
describeOpts.tableName = options.tableName;
|
|
191
|
+
const tables = await instance.describe(describeOpts);
|
|
192
|
+
return Promise.all(tables.map((t) => this.augmentTableInfo(ctx, t)));
|
|
193
|
+
}
|
|
194
|
+
async augmentTableInfo(ctx, table) {
|
|
195
|
+
const out = {
|
|
196
|
+
name: table.name,
|
|
197
|
+
rowCount: table.rowCount,
|
|
198
|
+
columns: table.columns.map((c) => ({
|
|
199
|
+
name: c.name,
|
|
200
|
+
type: c.type,
|
|
201
|
+
...(c.nullable !== undefined ? { nullable: c.nullable } : {}),
|
|
202
|
+
})),
|
|
203
|
+
};
|
|
204
|
+
if (table.approxSizeBytes !== undefined)
|
|
205
|
+
out.approxSizeBytes = table.approxSizeBytes;
|
|
206
|
+
if (table.name.startsWith(DATASET_TABLE_PREFIX)) {
|
|
207
|
+
const meta = await ctx.state.get(tableMetaKey(table.name));
|
|
208
|
+
if (meta)
|
|
209
|
+
out.provenance = meta;
|
|
210
|
+
}
|
|
211
|
+
return out;
|
|
212
|
+
}
|
|
213
|
+
requireCanvas() {
|
|
214
|
+
if (!this.canvas) {
|
|
215
|
+
throw new Error('CanvasBridge.getInstance() called while canvas is disabled. Call isEnabled() first.');
|
|
216
|
+
}
|
|
217
|
+
return this.canvas;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Derive a SQL-safe table name from a DatasetStore dataset ID. UUIDs from
|
|
222
|
+
* `crypto.randomUUID()` carry hyphens which fail the canvas identifier gate;
|
|
223
|
+
* we replace them with underscores and prefix with `ds_` so the namespace is
|
|
224
|
+
* unambiguous. Reversible — `tableNameToDatasetId(datasetTableName(id)) === id`.
|
|
225
|
+
*/
|
|
226
|
+
export function datasetTableName(datasetId) {
|
|
227
|
+
return `${DATASET_TABLE_PREFIX}${datasetId.replace(/-/g, '_')}`;
|
|
228
|
+
}
|
|
229
|
+
/** Inverse of {@link datasetTableName}. Returns `undefined` for non-`ds_` names. */
|
|
230
|
+
export function tableNameToDatasetId(tableName) {
|
|
231
|
+
if (!tableName.startsWith(DATASET_TABLE_PREFIX))
|
|
232
|
+
return;
|
|
233
|
+
return tableName.slice(DATASET_TABLE_PREFIX.length).replace(/_/g, '-');
|
|
234
|
+
}
|
|
235
|
+
function tableMetaKey(tableName) {
|
|
236
|
+
return `${TABLE_META_PREFIX}${tableName}`;
|
|
237
|
+
}
|
|
238
|
+
function isCanvasNotFound(err) {
|
|
239
|
+
return err instanceof McpError && err.code === JsonRpcErrorCode.NotFound;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Compose the caller's AbortSignal with a wall-clock timeout. Returns the
|
|
243
|
+
* caller's signal directly when no timeout is configured or the parent is
|
|
244
|
+
* already aborted (no point wrapping a dead signal — and doing so would leak
|
|
245
|
+
* the timer until it fires, since the cleanup listener can't fire on an
|
|
246
|
+
* already-aborted signal). Mirrors the manual-AbortController pattern from
|
|
247
|
+
* the framework's `fetchWithTimeout` — `AbortSignal.timeout()` is avoided
|
|
248
|
+
* because it can fail in Bun stdio due to realm mismatch.
|
|
249
|
+
*/
|
|
250
|
+
function composeSignal(parent, timeoutMs) {
|
|
251
|
+
if (timeoutMs <= 0 || parent.aborted)
|
|
252
|
+
return parent;
|
|
253
|
+
const controller = new AbortController();
|
|
254
|
+
const timer = setTimeout(() => {
|
|
255
|
+
controller.abort(new Error(`Canvas query timed out after ${timeoutMs}ms`));
|
|
256
|
+
}, timeoutMs);
|
|
257
|
+
// Forward parent abort; `signal: controller.signal` auto-removes this
|
|
258
|
+
// listener if the controller aborts first (timer fire), so it can't fire
|
|
259
|
+
// a second time when the parent later aborts.
|
|
260
|
+
parent.addEventListener('abort', () => controller.abort(parent.reason), {
|
|
261
|
+
once: true,
|
|
262
|
+
signal: controller.signal,
|
|
263
|
+
});
|
|
264
|
+
controller.signal.addEventListener('abort', () => clearTimeout(timer), { once: true });
|
|
265
|
+
return controller.signal;
|
|
266
|
+
}
|
|
267
|
+
let _bridge;
|
|
268
|
+
/**
|
|
269
|
+
* Initialize the singleton bridge. Pass the framework canvas (which is
|
|
270
|
+
* `undefined` when `CANVAS_PROVIDER_TYPE !== 'duckdb'` or on Workers).
|
|
271
|
+
*/
|
|
272
|
+
export function initCanvasBridge(canvas, serverConfig) {
|
|
273
|
+
_bridge = new CanvasBridge(canvas, serverConfig);
|
|
274
|
+
return _bridge;
|
|
275
|
+
}
|
|
276
|
+
export function getCanvasBridge() {
|
|
277
|
+
if (!_bridge) {
|
|
278
|
+
throw new Error('CanvasBridge not initialized — call initCanvasBridge() in setup()');
|
|
279
|
+
}
|
|
280
|
+
return _bridge;
|
|
281
|
+
}
|
|
282
|
+
/** Test-only — clear the singleton between suites. */
|
|
283
|
+
export function resetCanvasBridge() {
|
|
284
|
+
_bridge = undefined;
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=canvas-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-bridge.js","sourceRoot":"","sources":["../../../src/services/canvas-bridge/canvas-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Public barrel for the canvas-bridge service.
|
|
3
|
+
*
|
|
4
|
+
* @module services/canvas-bridge
|
|
5
|
+
*/
|
|
6
|
+
export { CanvasBridge, datasetTableName, getCanvasBridge, initCanvasBridge, resetCanvasBridge, tableNameToDatasetId, } from './canvas-bridge.js';
|
|
7
|
+
export type { CanvasTableMeta, DescribedTable } from './types.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/canvas-bridge/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Public barrel for the canvas-bridge service.
|
|
3
|
+
*
|
|
4
|
+
* @module services/canvas-bridge
|
|
5
|
+
*/
|
|
6
|
+
export { CanvasBridge, datasetTableName, getCanvasBridge, initCanvasBridge, resetCanvasBridge, tableNameToDatasetId, } from './canvas-bridge.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/canvas-bridge/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Internal types for the canvas-bridge service. Encodes the
|
|
3
|
+
* mapping between BrAPI dataset metadata and canvas-side table provenance —
|
|
4
|
+
* the canvas itself only knows table names, columns, and row counts; this
|
|
5
|
+
* service tracks the originating dataset (source tool, baseUrl, query) so
|
|
6
|
+
* `brapi_dataframe_describe` can surface full provenance.
|
|
7
|
+
*
|
|
8
|
+
* @module services/canvas-bridge/types
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Source-of-truth metadata persisted alongside an auto-registered canvas
|
|
12
|
+
* table. Mirrors `DatasetMetadata` for the fields the agent cares about,
|
|
13
|
+
* trimmed to what's actually useful in canvas describe output.
|
|
14
|
+
*/
|
|
15
|
+
export interface CanvasTableMeta {
|
|
16
|
+
/** Originating BrAPI baseUrl. */
|
|
17
|
+
baseUrl: string;
|
|
18
|
+
/** ISO 8601 timestamp the dataset was created. */
|
|
19
|
+
createdAt: string;
|
|
20
|
+
/** Originating dataset ID (UUID from DatasetStore). */
|
|
21
|
+
datasetId: string;
|
|
22
|
+
/** ISO 8601 timestamp the dataset will expire from DatasetStore. */
|
|
23
|
+
expiresAt: string;
|
|
24
|
+
/** Original filter map / query — provenance for reproducibility. */
|
|
25
|
+
query: unknown;
|
|
26
|
+
/** Originating source tool (e.g. `find_observations`). */
|
|
27
|
+
source: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Describe output augmented with auto-register provenance. `provenance` is
|
|
31
|
+
* absent for user-derived tables (created via `query({ registerAs })`).
|
|
32
|
+
*/
|
|
33
|
+
export interface DescribedTable {
|
|
34
|
+
approxSizeBytes?: number;
|
|
35
|
+
columns: {
|
|
36
|
+
name: string;
|
|
37
|
+
nullable?: boolean;
|
|
38
|
+
type: string;
|
|
39
|
+
}[];
|
|
40
|
+
name: string;
|
|
41
|
+
/** Provenance, present when this table was auto-registered from a dataset. */
|
|
42
|
+
provenance?: CanvasTableMeta;
|
|
43
|
+
rowCount: number;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/canvas-bridge/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,KAAK,EAAE,OAAO,CAAC;IACf,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Internal types for the canvas-bridge service. Encodes the
|
|
3
|
+
* mapping between BrAPI dataset metadata and canvas-side table provenance —
|
|
4
|
+
* the canvas itself only knows table names, columns, and row counts; this
|
|
5
|
+
* service tracks the originating dataset (source tool, baseUrl, query) so
|
|
6
|
+
* `brapi_dataframe_describe` can surface full provenance.
|
|
7
|
+
*
|
|
8
|
+
* @module services/canvas-bridge/types
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/canvas-bridge/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -6,18 +6,27 @@
|
|
|
6
6
|
* `BRAPI_LOAD_LIMIT`. Provenance (source, baseUrl, query) is mandatory on
|
|
7
7
|
* create — research workflows require reproducibility.
|
|
8
8
|
*
|
|
9
|
+
* When the optional `CanvasBridge` is wired in, `create()` auto-registers
|
|
10
|
+
* the row payload as a SQL-queryable table and `delete()` drops it again.
|
|
11
|
+
* Failures in either path log a warning but never break the dataset op —
|
|
12
|
+
* the canvas surface is an enrichment, not a precondition.
|
|
13
|
+
*
|
|
9
14
|
* @module services/dataset-store/dataset-store
|
|
10
15
|
*/
|
|
11
16
|
import type { Context } from '@cyanheads/mcp-ts-core';
|
|
12
17
|
import type { ServerConfig } from '../../config/server-config.js';
|
|
18
|
+
import type { CanvasBridge } from '../../services/canvas-bridge/index.js';
|
|
13
19
|
import type { CreateDatasetInput, DatasetListOptions, DatasetListPage, DatasetLoadOptions, DatasetMetadata, DatasetPage } from './types.js';
|
|
14
20
|
export declare class DatasetStore {
|
|
15
21
|
private readonly serverConfig;
|
|
16
|
-
|
|
22
|
+
private readonly canvasBridge?;
|
|
23
|
+
constructor(serverConfig: ServerConfig, canvasBridge?: CanvasBridge | undefined);
|
|
17
24
|
/**
|
|
18
25
|
* Persist a new dataset and return its metadata. Rows and metadata are
|
|
19
26
|
* written under separate keys so `summary` / `list` can avoid paying the
|
|
20
|
-
* row-payload read cost.
|
|
27
|
+
* row-payload read cost. When the canvas-bridge is wired and enabled,
|
|
28
|
+
* the rows are auto-registered as a SQL-queryable canvas table; failure
|
|
29
|
+
* there only logs a warning.
|
|
21
30
|
*/
|
|
22
31
|
create(ctx: Context, input: CreateDatasetInput): Promise<DatasetMetadata>;
|
|
23
32
|
/** Return just the metadata for a dataset. Throws `NotFound` when missing. */
|
|
@@ -29,7 +38,7 @@ export declare class DatasetStore {
|
|
|
29
38
|
/** Delete a dataset's metadata and row payload. Idempotent. */
|
|
30
39
|
delete(ctx: Context, datasetId: string): Promise<void>;
|
|
31
40
|
}
|
|
32
|
-
export declare function initDatasetStore(serverConfig: ServerConfig): void;
|
|
41
|
+
export declare function initDatasetStore(serverConfig: ServerConfig, canvasBridge?: CanvasBridge | undefined): void;
|
|
33
42
|
export declare function getDatasetStore(): DatasetStore;
|
|
34
43
|
export declare function resetDatasetStore(): void;
|
|
35
44
|
//# sourceMappingURL=dataset-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-store.d.ts","sourceRoot":"","sources":["../../../src/services/dataset-store/dataset-store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dataset-store.d.ts","sourceRoot":"","sources":["../../../src/services/dataset-store/dataset-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,WAAW,EACZ,MAAM,YAAY,CAAC;AAQpB,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;gBADb,YAAY,EAAE,YAAY,EAC1B,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS;IAG1D;;;;;;OAMG;IACG,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;IA2C/E,8EAA8E;IACxE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAYxE,qFAAqF;IAC/E,IAAI,CACR,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,WAAW,CAAC;IA4CvB,uEAAuE;IACjE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,eAAe,CAAC;IAgBpF,+DAA+D;IACzD,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAI7D;AAkED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,YAAY,EAC1B,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,GACtC,IAAI,CAEN;AAED,wBAAgB,eAAe,IAAI,YAAY,CAK9C;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
* `BRAPI_LOAD_LIMIT`. Provenance (source, baseUrl, query) is mandatory on
|
|
7
7
|
* create — research workflows require reproducibility.
|
|
8
8
|
*
|
|
9
|
+
* When the optional `CanvasBridge` is wired in, `create()` auto-registers
|
|
10
|
+
* the row payload as a SQL-queryable table and `delete()` drops it again.
|
|
11
|
+
* Failures in either path log a warning but never break the dataset op —
|
|
12
|
+
* the canvas surface is an enrichment, not a precondition.
|
|
13
|
+
*
|
|
9
14
|
* @module services/dataset-store/dataset-store
|
|
10
15
|
*/
|
|
11
16
|
import { notFound, validationError } from '@cyanheads/mcp-ts-core/errors';
|
|
@@ -15,13 +20,17 @@ const DEFAULT_PAGE_SIZE = 100;
|
|
|
15
20
|
const MAX_PAGE_SIZE = 1_000;
|
|
16
21
|
export class DatasetStore {
|
|
17
22
|
serverConfig;
|
|
18
|
-
|
|
23
|
+
canvasBridge;
|
|
24
|
+
constructor(serverConfig, canvasBridge) {
|
|
19
25
|
this.serverConfig = serverConfig;
|
|
26
|
+
this.canvasBridge = canvasBridge;
|
|
20
27
|
}
|
|
21
28
|
/**
|
|
22
29
|
* Persist a new dataset and return its metadata. Rows and metadata are
|
|
23
30
|
* written under separate keys so `summary` / `list` can avoid paying the
|
|
24
|
-
* row-payload read cost.
|
|
31
|
+
* row-payload read cost. When the canvas-bridge is wired and enabled,
|
|
32
|
+
* the rows are auto-registered as a SQL-queryable canvas table; failure
|
|
33
|
+
* there only logs a warning.
|
|
25
34
|
*/
|
|
26
35
|
async create(ctx, input) {
|
|
27
36
|
if (!input.source)
|
|
@@ -50,6 +59,14 @@ export class DatasetStore {
|
|
|
50
59
|
metadata.truncated = true;
|
|
51
60
|
if (typeof input.maxRows === 'number')
|
|
52
61
|
metadata.maxRows = input.maxRows;
|
|
62
|
+
// Auto-register on the canvas first so the persisted metadata can carry
|
|
63
|
+
// the dataframe name. Best-effort: a failed registration logs a warning
|
|
64
|
+
// inside the bridge and returns { registered: false }, leaving
|
|
65
|
+
// `dataframe` absent on the dataset.
|
|
66
|
+
const registration = await this.canvasBridge?.registerDataset(ctx, metadata, input.rows);
|
|
67
|
+
if (registration?.registered && registration.tableName) {
|
|
68
|
+
metadata.dataframe = registration.tableName;
|
|
69
|
+
}
|
|
53
70
|
await Promise.all([
|
|
54
71
|
ctx.state.set(metaKey(datasetId), metadata, { ttl }),
|
|
55
72
|
ctx.state.set(rowsKey(datasetId), input.rows, { ttl }),
|
|
@@ -122,6 +139,7 @@ export class DatasetStore {
|
|
|
122
139
|
/** Delete a dataset's metadata and row payload. Idempotent. */
|
|
123
140
|
async delete(ctx, datasetId) {
|
|
124
141
|
await ctx.state.deleteMany([metaKey(datasetId), rowsKey(datasetId)]);
|
|
142
|
+
await this.canvasBridge?.dropDataset(ctx, datasetId);
|
|
125
143
|
}
|
|
126
144
|
}
|
|
127
145
|
function metaKey(id) {
|
|
@@ -175,8 +193,8 @@ function isDatasetMetadata(value) {
|
|
|
175
193
|
typeof value.datasetId === 'string');
|
|
176
194
|
}
|
|
177
195
|
let _store;
|
|
178
|
-
export function initDatasetStore(serverConfig) {
|
|
179
|
-
_store = new DatasetStore(serverConfig);
|
|
196
|
+
export function initDatasetStore(serverConfig, canvasBridge) {
|
|
197
|
+
_store = new DatasetStore(serverConfig, canvasBridge);
|
|
180
198
|
}
|
|
181
199
|
export function getDatasetStore() {
|
|
182
200
|
if (!_store) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-store.js","sourceRoot":"","sources":["../../../src/services/dataset-store/dataset-store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dataset-store.js","sourceRoot":"","sources":["../../../src/services/dataset-store/dataset-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,13 @@ export interface DatasetMetadata {
|
|
|
25
25
|
columns: string[];
|
|
26
26
|
/** ISO 8601 create timestamp. */
|
|
27
27
|
createdAt: string;
|
|
28
|
+
/**
|
|
29
|
+
* Dataframe name when the dataset was auto-registered as a SQL-queryable
|
|
30
|
+
* dataframe (`ds_<datasetId_with_underscores>`). Omitted when the dataframe
|
|
31
|
+
* surface is disabled or registration failed. Use with
|
|
32
|
+
* `brapi_dataframe_query` to run SQL across the rows.
|
|
33
|
+
*/
|
|
34
|
+
dataframe?: string;
|
|
28
35
|
datasetId: string;
|
|
29
36
|
/** ISO 8601 expiry — when the TTL will evict the dataset. */
|
|
30
37
|
expiresAt: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/dataset-store/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,8HAA8H;IAC9H,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,KAAK,EAAE,OAAO,CAAC;IACf,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/dataset-store/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,8HAA8H;IAC9H,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,KAAK,EAAE,OAAO,CAAC;IACf,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B"}
|
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.
|
|
4
|
+
"version": "0.4.11",
|
|
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",
|
|
@@ -71,16 +71,25 @@
|
|
|
71
71
|
"access": "public"
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
74
|
-
"@cyanheads/mcp-ts-core": "^0.8.
|
|
74
|
+
"@cyanheads/mcp-ts-core": "^0.8.13",
|
|
75
75
|
"pino-pretty": "^13.1.3"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
78
|
"@biomejs/biome": "^2.4.14",
|
|
79
|
+
"@duckdb/node-api": "^1.5.2-r.1",
|
|
79
80
|
"@types/node": "^25.6.0",
|
|
80
81
|
"depcheck": "^1.4.7",
|
|
81
82
|
"ignore": "^7.0.5",
|
|
82
83
|
"tsc-alias": "^1.8.17",
|
|
83
84
|
"typescript": "^6.0.3",
|
|
84
85
|
"vitest": "^4.1.5"
|
|
86
|
+
},
|
|
87
|
+
"peerDependencies": {
|
|
88
|
+
"@duckdb/node-api": "^1.5.0"
|
|
89
|
+
},
|
|
90
|
+
"peerDependenciesMeta": {
|
|
91
|
+
"@duckdb/node-api": {
|
|
92
|
+
"optional": true
|
|
93
|
+
}
|
|
85
94
|
}
|
|
86
95
|
}
|
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.4.
|
|
9
|
+
"version": "0.4.11",
|
|
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.4.
|
|
16
|
+
"version": "0.4.11",
|
|
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.4.
|
|
52
|
+
"version": "0.4.11",
|
|
53
53
|
"packageArguments": [
|
|
54
54
|
{ "type": "positional", "value": "run" },
|
|
55
55
|
{ "type": "positional", "value": "start:http" }
|