@cyanheads/brapi-mcp-server 0.4.14 → 0.5.0

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 (115) hide show
  1. package/CLAUDE.md +23 -19
  2. package/README.md +40 -26
  3. package/changelog/0.5.x/0.5.0.md +59 -0
  4. package/dist/config/builtin-aliases.d.ts +1 -1
  5. package/dist/config/builtin-aliases.js +1 -1
  6. package/dist/config/server-config.d.ts +3 -3
  7. package/dist/config/server-config.d.ts.map +1 -1
  8. package/dist/config/server-config.js +13 -13
  9. package/dist/config/server-config.js.map +1 -1
  10. package/dist/index.js +62 -15
  11. package/dist/index.js.map +1 -1
  12. package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js +1 -1
  13. package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js.map +1 -1
  14. package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js +3 -3
  15. package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js.map +1 -1
  16. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.d.ts +8 -11
  17. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.d.ts.map +1 -1
  18. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.js +15 -25
  19. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.js.map +1 -1
  20. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.d.ts +6 -10
  21. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.d.ts.map +1 -1
  22. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.js +6 -16
  23. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.js.map +1 -1
  24. package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.d.ts +69 -0
  25. package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.d.ts.map +1 -0
  26. package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.js +233 -0
  27. package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.d.ts +19 -11
  29. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.d.ts.map +1 -1
  30. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.js +80 -28
  31. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.js.map +1 -1
  32. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts +4 -6
  33. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts.map +1 -1
  34. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js +28 -36
  35. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js.map +1 -1
  36. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts +3 -5
  37. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts.map +1 -1
  38. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js +19 -19
  39. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js.map +1 -1
  40. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts +4 -6
  41. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts.map +1 -1
  42. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js +16 -16
  43. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js.map +1 -1
  44. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts +3 -5
  45. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts.map +1 -1
  46. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js +15 -15
  47. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js.map +1 -1
  48. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts +4 -6
  49. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts.map +1 -1
  50. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js +17 -17
  51. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js.map +1 -1
  52. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts +4 -6
  53. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts.map +1 -1
  54. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js +17 -17
  55. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js.map +1 -1
  56. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts +2 -4
  57. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts.map +1 -1
  58. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js +17 -17
  59. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js.map +1 -1
  60. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts +3 -5
  61. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts.map +1 -1
  62. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js +15 -15
  63. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js.map +1 -1
  64. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts +17 -2
  65. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts.map +1 -1
  66. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js +51 -7
  67. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js.map +1 -1
  68. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts +16 -2
  69. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts.map +1 -1
  70. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js +51 -5
  71. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js.map +1 -1
  72. package/dist/mcp-server/tools/definitions/index.d.ts +141 -165
  73. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  74. package/dist/mcp-server/tools/definitions/index.js +28 -17
  75. package/dist/mcp-server/tools/definitions/index.js.map +1 -1
  76. package/dist/mcp-server/tools/shared/find-helpers.d.ts +52 -41
  77. package/dist/mcp-server/tools/shared/find-helpers.d.ts.map +1 -1
  78. package/dist/mcp-server/tools/shared/find-helpers.js +89 -66
  79. package/dist/mcp-server/tools/shared/find-helpers.js.map +1 -1
  80. package/dist/mcp-server/tools/shared/raw-routing-hints.d.ts.map +1 -1
  81. package/dist/mcp-server/tools/shared/raw-routing-hints.js +6 -6
  82. package/dist/mcp-server/tools/shared/raw-routing-hints.js.map +1 -1
  83. package/dist/services/canvas-bridge/canvas-bridge.d.ts +69 -44
  84. package/dist/services/canvas-bridge/canvas-bridge.d.ts.map +1 -1
  85. package/dist/services/canvas-bridge/canvas-bridge.js +143 -112
  86. package/dist/services/canvas-bridge/canvas-bridge.js.map +1 -1
  87. package/dist/services/canvas-bridge/index.d.ts +1 -1
  88. package/dist/services/canvas-bridge/index.d.ts.map +1 -1
  89. package/dist/services/canvas-bridge/index.js +1 -1
  90. package/dist/services/canvas-bridge/index.js.map +1 -1
  91. package/dist/services/canvas-bridge/types.d.ts +11 -12
  92. package/dist/services/canvas-bridge/types.d.ts.map +1 -1
  93. package/dist/services/canvas-bridge/types.js +4 -4
  94. package/package.json +3 -11
  95. package/server.json +3 -3
  96. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts +0 -13
  97. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts.map +0 -1
  98. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js +0 -26
  99. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js.map +0 -1
  100. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts +0 -89
  101. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts.map +0 -1
  102. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js +0 -306
  103. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js.map +0 -1
  104. package/dist/services/dataset-store/dataset-store.d.ts +0 -44
  105. package/dist/services/dataset-store/dataset-store.d.ts.map +0 -1
  106. package/dist/services/dataset-store/dataset-store.js +0 -208
  107. package/dist/services/dataset-store/dataset-store.js.map +0 -1
  108. package/dist/services/dataset-store/index.d.ts +0 -8
  109. package/dist/services/dataset-store/index.d.ts.map +0 -1
  110. package/dist/services/dataset-store/index.js +0 -7
  111. package/dist/services/dataset-store/index.js.map +0 -1
  112. package/dist/services/dataset-store/types.d.ts +0 -72
  113. package/dist/services/dataset-store/types.d.ts.map +0 -1
  114. package/dist/services/dataset-store/types.js +0 -8
  115. package/dist/services/dataset-store/types.js.map +0 -1
@@ -2,16 +2,17 @@
2
2
  * @fileoverview CanvasBridge — server-side adapter over the framework's
3
3
  * `DataCanvas` primitive. Owns three concerns the framework leaves to the
4
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.
5
+ * `canvas_id`; the bridge caches and reuses it via `ctx.state`), (2) generating
6
+ * SQL-safe `df_<uuid>` table names for spilled find_* results, and (3) tracking
7
+ * originating-source provenance so `brapi_dataframe_describe` can surface it.
8
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.
9
+ * Canvas is mandatory — `core.canvas` must be configured (DuckDB) for the
10
+ * server to start. There is no on/off toggle; spillover always lands on the
11
+ * canvas.
12
12
  *
13
13
  * @module services/canvas-bridge/canvas-bridge
14
14
  */
15
+ import { unlink } from 'node:fs/promises';
15
16
  import { JsonRpcErrorCode, McpError } from '@cyanheads/mcp-ts-core/errors';
16
17
  /**
17
18
  * Construct a `RequestContext` slice from the handler `Context`. The
@@ -36,8 +37,17 @@ function asRequestContext(ctx) {
36
37
  const DEFAULT_CANVAS_KEY = 'brapi/canvas/default';
37
38
  /** Prefix for per-table provenance entries — keyed by canvas table name. */
38
39
  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_';
40
+ /**
41
+ * Prefix for export-path tracking entries — keyed by canvas table name. The
42
+ * value is a list of absolute paths written by `brapi_dataframe_export` for
43
+ * that dataframe, persisted with the same TTL as the dataframe's provenance.
44
+ * Used by `drop()` to remove paired files when an explicit drop happens; if
45
+ * the dataframe expires via TTL the state entry simply disappears and the
46
+ * file is reaped opportunistically by the export tool's mtime sweep.
47
+ */
48
+ const EXPORT_PATHS_PREFIX = 'brapi/canvas/exports/';
49
+ /** Auto-registered dataframe-table prefix. Anything else is user-derived (registerAs). */
50
+ const DATAFRAME_TABLE_PREFIX = 'df_';
41
51
  /** Bridge for `core.canvas` that adds per-tenant default-canvas semantics. */
42
52
  export class CanvasBridge {
43
53
  canvas;
@@ -46,13 +56,6 @@ export class CanvasBridge {
46
56
  this.canvas = canvas;
47
57
  this.serverConfig = serverConfig;
48
58
  }
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
59
  /**
57
60
  * Acquire the per-tenant default canvas. The canvasId is cached in
58
61
  * `ctx.state` so subsequent calls reuse the same canvas (sliding TTL on the
@@ -61,10 +64,9 @@ export class CanvasBridge {
61
64
  * "omit on retry" recovery hint without surfacing the token to the agent.
62
65
  */
63
66
  async getInstance(ctx) {
64
- const canvas = this.requireCanvas();
65
67
  const cached = await ctx.state.get(DEFAULT_CANVAS_KEY);
66
68
  try {
67
- const instance = await canvas.acquire(cached ?? undefined, asRequestContext(ctx));
69
+ const instance = await this.canvas.acquire(cached ?? undefined, asRequestContext(ctx));
68
70
  if (!cached || instance.isNew) {
69
71
  await ctx.state.set(DEFAULT_CANVAS_KEY, instance.canvasId);
70
72
  }
@@ -73,7 +75,7 @@ export class CanvasBridge {
73
75
  catch (err) {
74
76
  if (cached && isCanvasNotFound(err)) {
75
77
  await ctx.state.delete(DEFAULT_CANVAS_KEY);
76
- const fresh = await canvas.acquire(undefined, asRequestContext(ctx));
78
+ const fresh = await this.canvas.acquire(undefined, asRequestContext(ctx));
77
79
  await ctx.state.set(DEFAULT_CANVAS_KEY, fresh.canvasId);
78
80
  return fresh;
79
81
  }
@@ -81,76 +83,54 @@ export class CanvasBridge {
81
83
  }
82
84
  }
83
85
  /**
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.
86
+ * Materialize a spilled `find_*` result as a canvas dataframe. Generates a
87
+ * `df_<uuid>` table name, registers the rows with an all-nullable schema,
88
+ * persists provenance metadata in `ctx.state`, and returns the full
89
+ * dataframe handle.
88
90
  */
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
- // Pre-compute an explicit all-nullable schema. The framework's default
96
- // path sniffs the first N rows and infers `nullable: false` for any
97
- // column that happened to be non-null in the sample — DuckDB then
98
- // creates the table with NOT NULL constraints, and the appender rolls
99
- // back the entire batch the first time a later row carries a null for
100
- // that column. Sniffed schemas can never prove non-nullability from a
101
- // sample, so we walk every row, classify types ourselves, and emit
102
- // `nullable: true` for every column.
103
- const schema = deriveAllNullableSchema(rows);
104
- await instance.registerTable(tableName, rows, { schema });
105
- const tableMeta = {
106
- datasetId: metadata.datasetId,
107
- source: metadata.source,
108
- baseUrl: metadata.baseUrl,
109
- query: metadata.query,
110
- createdAt: metadata.createdAt,
111
- expiresAt: metadata.expiresAt,
112
- };
113
- await ctx.state.set(tableMetaKey(tableName), tableMeta, {
114
- ttl: this.serverConfig.datasetTtlSeconds,
115
- });
116
- ctx.log.debug('Canvas auto-register succeeded', {
117
- datasetId: metadata.datasetId,
118
- tableName,
119
- rowCount: metadata.rowCount,
120
- });
121
- return { registered: true, tableName };
122
- }
123
- catch (err) {
124
- ctx.log.warning('Canvas auto-register failed; dataset still available via brapi_manage_dataset', {
125
- datasetId: metadata.datasetId,
126
- tableName,
127
- error: err instanceof Error ? err.message : String(err),
128
- });
129
- return { registered: false };
130
- }
131
- }
132
- /**
133
- * Drop the canvas table corresponding to a deleted dataset. Mirrors
134
- * `registerDataset` — best-effort, never throws.
135
- */
136
- async dropDataset(ctx, datasetId) {
137
- if (!this.isEnabled())
138
- return { dropped: false };
139
- const tableName = datasetTableName(datasetId);
140
- try {
141
- const instance = await this.getInstance(ctx);
142
- const dropped = await instance.drop(tableName);
143
- await ctx.state.delete(tableMetaKey(tableName));
144
- return { dropped };
145
- }
146
- catch (err) {
147
- ctx.log.warning('Canvas auto-drop failed', {
148
- datasetId,
149
- tableName,
150
- error: err instanceof Error ? err.message : String(err),
151
- });
152
- return { dropped: false };
153
- }
91
+ async registerDataframe(ctx, input) {
92
+ const tableName = generateDataframeName();
93
+ const ttl = this.serverConfig.datasetTtlSeconds;
94
+ const now = new Date();
95
+ const expiresAt = new Date(now.getTime() + ttl * 1000);
96
+ const createdAt = now.toISOString();
97
+ const expiresAtIso = expiresAt.toISOString();
98
+ const instance = await this.getInstance(ctx);
99
+ // Pre-compute an explicit all-nullable schema. The framework's default
100
+ // path sniffs the first N rows and infers `nullable: false` for any
101
+ // column that happened to be non-null in the sample — DuckDB then
102
+ // creates the table with NOT NULL constraints, and the appender rolls
103
+ // back the entire batch the first time a later row carries a null for
104
+ // that column. Sniffed schemas can never prove non-nullability from a
105
+ // sample, so we walk every row, classify types ourselves, and emit
106
+ // `nullable: true` for every column.
107
+ const schema = deriveAllNullableSchema(input.rows);
108
+ const registered = await instance.registerTable(tableName, input.rows, { schema });
109
+ const tableMeta = {
110
+ source: input.source,
111
+ baseUrl: input.baseUrl,
112
+ query: input.query,
113
+ createdAt,
114
+ expiresAt: expiresAtIso,
115
+ };
116
+ await ctx.state.set(tableMetaKey(tableName), tableMeta, { ttl });
117
+ ctx.log.debug('Canvas dataframe registered', {
118
+ tableName,
119
+ rowCount: registered.rowCount,
120
+ source: input.source,
121
+ });
122
+ const result = {
123
+ tableName,
124
+ rowCount: registered.rowCount,
125
+ columns: registered.columns,
126
+ createdAt,
127
+ expiresAt: expiresAtIso,
128
+ };
129
+ if (input.truncated)
130
+ result.truncated = true;
131
+ if (typeof input.maxRows === 'number')
132
+ result.maxRows = input.maxRows;
133
+ return result;
154
134
  }
155
135
  /**
156
136
  * Run a SQL query against the per-tenant default canvas. Caps `rowLimit` to
@@ -174,7 +154,7 @@ export class CanvasBridge {
174
154
  }
175
155
  /**
176
156
  * Register an explicitly-named table (used by the rare consumer that wants
177
- * to push rows directly without going through DatasetStore spillover).
157
+ * to push rows directly without going through the spillover path).
178
158
  */
179
159
  async registerTable(ctx, name, rows) {
180
160
  const instance = await this.getInstance(ctx);
@@ -184,13 +164,73 @@ export class CanvasBridge {
184
164
  async drop(ctx, name) {
185
165
  const instance = await this.getInstance(ctx);
186
166
  const dropped = await instance.drop(name);
187
- if (dropped)
167
+ if (dropped) {
188
168
  await ctx.state.delete(tableMetaKey(name));
169
+ await this.unlinkTrackedExports(ctx, name);
170
+ }
189
171
  return dropped;
190
172
  }
173
+ /**
174
+ * Export a canvas table to a path target. The framework resolves the
175
+ * relative path against `CANVAS_EXPORT_PATH` and rejects absolute /
176
+ * traversal inputs — the bridge only forwards.
177
+ *
178
+ * Tracking the resulting path under the *source* dataframe name (so a
179
+ * subsequent `drop(sourceName)` can unlink it) is the caller's job. The
180
+ * bridge can't infer "source name" when the export reads from a transient
181
+ * derived table (e.g. a projection materialized for one export call) —
182
+ * auto-tracking under whatever `tableName` was passed would unlink the
183
+ * file the moment the derived table is dropped. See
184
+ * `pairExportToSourceDataframe` in `brapi-dataframe-export.tool.ts`.
185
+ */
186
+ async export(ctx, tableName, target, options = {}) {
187
+ const instance = await this.getInstance(ctx);
188
+ const exportOpts = {};
189
+ if (options.signal !== undefined)
190
+ exportOpts.signal = options.signal;
191
+ return await instance.export(tableName, target, exportOpts);
192
+ }
193
+ /**
194
+ * Track an exported file path under a source dataframe name so that a
195
+ * later `drop(sourceName)` unlinks it. Persisted in `ctx.state` with the
196
+ * remaining TTL of the source dataframe; if the dataframe expires via
197
+ * TTL, the entry disappears and the file is reaped opportunistically by
198
+ * the export tool's mtime sweep.
199
+ */
200
+ async trackExport(ctx, sourceName, path) {
201
+ const key = exportPathsKey(sourceName);
202
+ const meta = await ctx.state.get(tableMetaKey(sourceName));
203
+ const remainingTtlSeconds = meta
204
+ ? Math.max(1, Math.floor((Date.parse(meta.expiresAt) - Date.now()) / 1000))
205
+ : this.serverConfig.datasetTtlSeconds;
206
+ const existing = (await ctx.state.get(key)) ?? [];
207
+ if (existing.includes(path))
208
+ return;
209
+ existing.push(path);
210
+ await ctx.state.set(key, existing, { ttl: remainingTtlSeconds });
211
+ }
212
+ async unlinkTrackedExports(ctx, tableName) {
213
+ const key = exportPathsKey(tableName);
214
+ const paths = await ctx.state.get(key);
215
+ if (!paths || paths.length === 0)
216
+ return;
217
+ await Promise.allSettled(paths.map(async (path) => {
218
+ try {
219
+ await unlink(path);
220
+ }
221
+ catch (err) {
222
+ ctx.log.debug('Paired export unlink failed (likely already removed)', {
223
+ tableName,
224
+ path,
225
+ error: err instanceof Error ? err.message : String(err),
226
+ });
227
+ }
228
+ }));
229
+ await ctx.state.delete(key);
230
+ }
191
231
  /**
192
232
  * Describe one or all canvas tables, augmenting the framework's `TableInfo`
193
- * with originating-dataset provenance for auto-registered tables.
233
+ * with originating-source provenance for auto-registered tables.
194
234
  */
195
235
  async describe(ctx, options = {}) {
196
236
  const instance = await this.getInstance(ctx);
@@ -212,38 +252,28 @@ export class CanvasBridge {
212
252
  };
213
253
  if (table.approxSizeBytes !== undefined)
214
254
  out.approxSizeBytes = table.approxSizeBytes;
215
- if (table.name.startsWith(DATASET_TABLE_PREFIX)) {
255
+ if (table.name.startsWith(DATAFRAME_TABLE_PREFIX)) {
216
256
  const meta = await ctx.state.get(tableMetaKey(table.name));
217
257
  if (meta)
218
258
  out.provenance = meta;
219
259
  }
220
260
  return out;
221
261
  }
222
- requireCanvas() {
223
- if (!this.canvas) {
224
- throw new Error('CanvasBridge.getInstance() called while canvas is disabled. Call isEnabled() first.');
225
- }
226
- return this.canvas;
227
- }
228
262
  }
229
263
  /**
230
- * Derive a SQL-safe table name from a DatasetStore dataset ID. UUIDs from
231
- * `crypto.randomUUID()` carry hyphens which fail the canvas identifier gate;
232
- * we replace them with underscores and prefix with `ds_` so the namespace is
233
- * unambiguous. Reversible — `tableNameToDatasetId(datasetTableName(id)) === id`.
264
+ * Generate a fresh canvas-safe dataframe name. Hyphens in `crypto.randomUUID()`
265
+ * fail the canvas identifier gate, so we replace them with underscores and
266
+ * prefix with `df_` to mark the namespace as auto-registered.
234
267
  */
235
- export function datasetTableName(datasetId) {
236
- return `${DATASET_TABLE_PREFIX}${datasetId.replace(/-/g, '_')}`;
237
- }
238
- /** Inverse of {@link datasetTableName}. Returns `undefined` for non-`ds_` names. */
239
- export function tableNameToDatasetId(tableName) {
240
- if (!tableName.startsWith(DATASET_TABLE_PREFIX))
241
- return;
242
- return tableName.slice(DATASET_TABLE_PREFIX.length).replace(/_/g, '-');
268
+ function generateDataframeName() {
269
+ return `${DATAFRAME_TABLE_PREFIX}${crypto.randomUUID().replace(/-/g, '_')}`;
243
270
  }
244
271
  function tableMetaKey(tableName) {
245
272
  return `${TABLE_META_PREFIX}${tableName}`;
246
273
  }
274
+ function exportPathsKey(tableName) {
275
+ return `${EXPORT_PATHS_PREFIX}${tableName}`;
276
+ }
247
277
  function isCanvasNotFound(err) {
248
278
  return err instanceof McpError && err.code === JsonRpcErrorCode.NotFound;
249
279
  }
@@ -338,7 +368,7 @@ function composeSignal(parent, timeoutMs) {
338
368
  return parent;
339
369
  const controller = new AbortController();
340
370
  const timer = setTimeout(() => {
341
- controller.abort(new Error(`Canvas query timed out after ${timeoutMs}ms`));
371
+ controller.abort(new Error(`Dataframe query timed out after ${timeoutMs}ms`));
342
372
  }, timeoutMs);
343
373
  // Forward parent abort; `signal: controller.signal` auto-removes this
344
374
  // listener if the controller aborts first (timer fire), so it can't fire
@@ -352,8 +382,9 @@ function composeSignal(parent, timeoutMs) {
352
382
  }
353
383
  let _bridge;
354
384
  /**
355
- * Initialize the singleton bridge. Pass the framework canvas (which is
356
- * `undefined` when `CANVAS_PROVIDER_TYPE !== 'duckdb'` or on Workers).
385
+ * Initialize the singleton bridge. The framework canvas is mandatory — the
386
+ * caller is responsible for ensuring `core.canvas` is defined before this
387
+ * runs (`createApp` setup hook should fail closed when it isn't).
357
388
  */
358
389
  export function initCanvasBridge(canvas, serverConfig) {
359
390
  _bridge = new CanvasBridge(canvas, serverConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-bridge.js","sourceRoot":"","sources":["../../../src/services/canvas-bridge/canvas-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canvas-bridge.js","sourceRoot":"","sources":["../../../src/services/canvas-bridge/canvas-bridge.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,6 @@
3
3
  *
4
4
  * @module services/canvas-bridge
5
5
  */
6
- export { CanvasBridge, datasetTableName, getCanvasBridge, initCanvasBridge, resetCanvasBridge, tableNameToDatasetId, } from './canvas-bridge.js';
6
+ export { CanvasBridge, getCanvasBridge, initCanvasBridge, type RegisterDataframeInput, type RegisterDataframeResult, resetCanvasBridge, } from './canvas-bridge.js';
7
7
  export type { CanvasTableMeta, DescribedTable } from './types.js';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/canvas-bridge/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -3,5 +3,5 @@
3
3
  *
4
4
  * @module services/canvas-bridge
5
5
  */
6
- export { CanvasBridge, datasetTableName, getCanvasBridge, initCanvasBridge, resetCanvasBridge, tableNameToDatasetId, } from './canvas-bridge.js';
6
+ export { CanvasBridge, getCanvasBridge, initCanvasBridge, resetCanvasBridge, } from './canvas-bridge.js';
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/canvas-bridge/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAGhB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC"}
@@ -1,25 +1,24 @@
1
1
  /**
2
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.
3
+ * provenance metadata persisted alongside an auto-registered dataframe — the
4
+ * canvas itself only knows table names, columns, and row counts; this service
5
+ * tracks the originating tool, baseUrl, and query so `brapi_dataframe_describe`
6
+ * can surface full provenance.
7
7
  *
8
8
  * @module services/canvas-bridge/types
9
9
  */
10
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.
11
+ * Source-of-truth provenance persisted alongside an auto-registered dataframe.
12
+ * Stored under `brapi/canvas/tablemeta/<tableName>` in `ctx.state` with the
13
+ * same TTL as the originating spillover. The dataframe name (e.g. `df_<uuid>`)
14
+ * is the identity key — there is no separate dataset ID.
14
15
  */
15
16
  export interface CanvasTableMeta {
16
17
  /** Originating BrAPI baseUrl. */
17
18
  baseUrl: string;
18
- /** ISO 8601 timestamp the dataset was created. */
19
+ /** ISO 8601 timestamp the dataframe was created. */
19
20
  createdAt: string;
20
- /** Originating dataset ID (UUID from DatasetStore). */
21
- datasetId: string;
22
- /** ISO 8601 timestamp the dataset will expire from DatasetStore. */
21
+ /** ISO 8601 timestamp the provenance metadata expires. */
23
22
  expiresAt: string;
24
23
  /** Original filter map / query — provenance for reproducibility. */
25
24
  query: unknown;
@@ -38,7 +37,7 @@ export interface DescribedTable {
38
37
  type: string;
39
38
  }[];
40
39
  name: string;
41
- /** Provenance, present when this table was auto-registered from a dataset. */
40
+ /** Provenance, present when this table was auto-registered from a spillover. */
42
41
  provenance?: CanvasTableMeta;
43
42
  rowCount: number;
44
43
  }
@@ -1 +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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/canvas-bridge/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,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,gFAAgF;IAChF,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB"}
@@ -1,9 +1,9 @@
1
1
  /**
2
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.
3
+ * provenance metadata persisted alongside an auto-registered dataframe — the
4
+ * canvas itself only knows table names, columns, and row counts; this service
5
+ * tracks the originating tool, baseUrl, and query so `brapi_dataframe_describe`
6
+ * can surface full provenance.
7
7
  *
8
8
  * @module services/canvas-bridge/types
9
9
  */
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.14",
4
+ "version": "0.5.0",
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,25 +71,17 @@
71
71
  "access": "public"
72
72
  },
73
73
  "dependencies": {
74
- "@cyanheads/mcp-ts-core": "^0.8.14",
74
+ "@cyanheads/mcp-ts-core": "^0.8.15",
75
+ "@duckdb/node-api": "^1.5.2-r.1",
75
76
  "pino-pretty": "^13.1.3"
76
77
  },
77
78
  "devDependencies": {
78
79
  "@biomejs/biome": "^2.4.14",
79
- "@duckdb/node-api": "^1.5.2-r.1",
80
80
  "@types/node": "^25.6.0",
81
81
  "depcheck": "^1.4.7",
82
82
  "ignore": "^7.0.5",
83
83
  "tsc-alias": "^1.8.17",
84
84
  "typescript": "^6.0.3",
85
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
- }
94
86
  }
95
87
  }
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.14",
9
+ "version": "0.5.0",
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.14",
16
+ "version": "0.5.0",
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.14",
52
+ "version": "0.5.0",
53
53
  "packageArguments": [
54
54
  { "type": "positional", "value": "run" },
55
55
  { "type": "positional", "value": "start:http" }
@@ -1,13 +0,0 @@
1
- /**
2
- * @fileoverview `brapi://dataset/{datasetId}` — metadata + provenance for a
3
- * persisted dataset (rows omitted; use `brapi_manage_dataset` mode `load` to
4
- * page through rows). Dataset IDs are unbounded and tenant-scoped — clients
5
- * obtain them from a `find_*` tool's spillover handle, then read this URI.
6
- *
7
- * @module mcp-server/resources/definitions/brapi-dataset.resource
8
- */
9
- import { z } from '@cyanheads/mcp-ts-core';
10
- export declare const brapiDatasetResource: import("@cyanheads/mcp-ts-core").ResourceDefinition<z.ZodObject<{
11
- datasetId: z.ZodString;
12
- }, z.core.$strip>, undefined, undefined>;
13
- //# sourceMappingURL=brapi-dataset.resource.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"brapi-dataset.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/brapi-dataset.resource.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAGrD,eAAO,MAAM,oBAAoB;;wCAe/B,CAAC"}
@@ -1,26 +0,0 @@
1
- /**
2
- * @fileoverview `brapi://dataset/{datasetId}` — metadata + provenance for a
3
- * persisted dataset (rows omitted; use `brapi_manage_dataset` mode `load` to
4
- * page through rows). Dataset IDs are unbounded and tenant-scoped — clients
5
- * obtain them from a `find_*` tool's spillover handle, then read this URI.
6
- *
7
- * @module mcp-server/resources/definitions/brapi-dataset.resource
8
- */
9
- import { resource, z } from '@cyanheads/mcp-ts-core';
10
- import { getDatasetStore } from '../../../services/dataset-store/index.js';
11
- export const brapiDatasetResource = resource('brapi://dataset/{datasetId}', {
12
- name: 'brapi-dataset',
13
- title: 'BrAPI dataset metadata',
14
- description: 'Persisted dataset metadata + provenance (source tool, baseUrl, original query, row count, columns, expiry). Rows themselves are accessible via brapi_manage_dataset (mode: load). IDs come from the spillover handle on find_* tools.',
15
- mimeType: 'application/json',
16
- params: z.object({
17
- datasetId: z.string().min(1).describe('Dataset UUID returned by a find_* tool spillover.'),
18
- }),
19
- handler(params, ctx) {
20
- return getDatasetStore().summary(ctx, params.datasetId);
21
- },
22
- list: async () => ({
23
- resources: [],
24
- }),
25
- });
26
- //# sourceMappingURL=brapi-dataset.resource.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"brapi-dataset.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/brapi-dataset.resource.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC,6BAA6B,EAAE;IAC1E,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,wBAAwB;IAC/B,WAAW,EACT,uOAAuO;IACzO,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;KAC3F,CAAC;IACF,OAAO,CAAC,MAAM,EAAE,GAAG;QACjB,OAAO,eAAe,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACjB,SAAS,EAAE,EAAE;KACd,CAAC;CACH,CAAC,CAAC"}