@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.
Files changed (75) hide show
  1. package/CLAUDE.md +1 -1
  2. package/Dockerfile +9 -0
  3. package/README.md +58 -8
  4. package/changelog/0.4.x/0.4.10.md +30 -0
  5. package/changelog/0.4.x/0.4.11.md +19 -0
  6. package/dist/config/server-config.d.ts +7 -0
  7. package/dist/config/server-config.d.ts.map +1 -1
  8. package/dist/config/server-config.js +28 -0
  9. package/dist/config/server-config.js.map +1 -1
  10. package/dist/index.js +26 -6
  11. package/dist/index.js.map +1 -1
  12. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.d.ts +39 -0
  13. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.d.ts.map +1 -0
  14. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.js +107 -0
  15. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.js.map +1 -0
  16. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.d.ts +23 -0
  17. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.d.ts.map +1 -0
  18. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.js +55 -0
  19. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.js.map +1 -0
  20. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.d.ts +38 -0
  21. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.d.ts.map +1 -0
  22. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.js +157 -0
  23. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.js.map +1 -0
  24. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts +8 -4
  25. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts.map +1 -1
  26. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js +14 -17
  27. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js.map +1 -1
  28. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts +1 -0
  29. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts.map +1 -1
  30. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts +1 -0
  31. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts.map +1 -1
  32. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts +1 -0
  33. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts.map +1 -1
  34. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts +1 -0
  35. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts.map +1 -1
  36. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts +1 -0
  37. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts.map +1 -1
  38. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts +1 -0
  39. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts.map +1 -1
  40. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts +1 -0
  41. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts.map +1 -1
  42. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts +2 -0
  43. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts.map +1 -1
  44. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js +10 -0
  45. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js.map +1 -1
  46. package/dist/mcp-server/tools/definitions/index.d.ts +75 -2
  47. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  48. package/dist/mcp-server/tools/definitions/index.js +15 -0
  49. package/dist/mcp-server/tools/definitions/index.js.map +1 -1
  50. package/dist/mcp-server/tools/shared/find-helpers.d.ts +1 -0
  51. package/dist/mcp-server/tools/shared/find-helpers.d.ts.map +1 -1
  52. package/dist/mcp-server/tools/shared/find-helpers.js +9 -0
  53. package/dist/mcp-server/tools/shared/find-helpers.js.map +1 -1
  54. package/dist/mcp-server/tools/shared/raw-routing-hints.js +1 -1
  55. package/dist/mcp-server/tools/shared/raw-routing-hints.js.map +1 -1
  56. package/dist/services/canvas-bridge/canvas-bridge.d.ts +100 -0
  57. package/dist/services/canvas-bridge/canvas-bridge.d.ts.map +1 -0
  58. package/dist/services/canvas-bridge/canvas-bridge.js +286 -0
  59. package/dist/services/canvas-bridge/canvas-bridge.js.map +1 -0
  60. package/dist/services/canvas-bridge/index.d.ts +8 -0
  61. package/dist/services/canvas-bridge/index.d.ts.map +1 -0
  62. package/dist/services/canvas-bridge/index.js +7 -0
  63. package/dist/services/canvas-bridge/index.js.map +1 -0
  64. package/dist/services/canvas-bridge/types.d.ts +45 -0
  65. package/dist/services/canvas-bridge/types.d.ts.map +1 -0
  66. package/dist/services/canvas-bridge/types.js +11 -0
  67. package/dist/services/canvas-bridge/types.js.map +1 -0
  68. package/dist/services/dataset-store/dataset-store.d.ts +12 -3
  69. package/dist/services/dataset-store/dataset-store.d.ts.map +1 -1
  70. package/dist/services/dataset-store/dataset-store.js +22 -4
  71. package/dist/services/dataset-store/dataset-store.js.map +1 -1
  72. package/dist/services/dataset-store/types.d.ts +7 -0
  73. package/dist/services/dataset-store/types.d.ts.map +1 -1
  74. package/package.json +11 -2
  75. 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
- constructor(serverConfig: ServerConfig);
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;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,WAAW,EACZ,MAAM,YAAY,CAAC;AAQpB,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAEvD;;;;OAIG;IACG,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;IAkC/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;CAG7D;AAkED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,CAEjE;AAED,wBAAgB,eAAe,IAAI,YAAY,CAK9C;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
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
- constructor(serverConfig) {
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":"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"}
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.9",
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.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",
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.9",
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.9",
52
+ "version": "0.4.11",
53
53
  "packageArguments": [
54
54
  { "type": "positional", "value": "run" },
55
55
  { "type": "positional", "value": "start:http" }