@cyanheads/brapi-mcp-server 0.4.13 → 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 (120) hide show
  1. package/CLAUDE.md +25 -19
  2. package/README.md +40 -26
  3. package/changelog/0.4.x/0.4.13.md +15 -0
  4. package/changelog/0.4.x/0.4.14.md +22 -0
  5. package/changelog/0.5.x/0.5.0.md +59 -0
  6. package/dist/config/builtin-aliases.d.ts +1 -1
  7. package/dist/config/builtin-aliases.js +1 -1
  8. package/dist/config/server-config.d.ts +3 -3
  9. package/dist/config/server-config.d.ts.map +1 -1
  10. package/dist/config/server-config.js +13 -13
  11. package/dist/config/server-config.js.map +1 -1
  12. package/dist/index.js +62 -15
  13. package/dist/index.js.map +1 -1
  14. package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js +1 -1
  15. package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js.map +1 -1
  16. package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js +3 -3
  17. package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js.map +1 -1
  18. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.d.ts +8 -11
  19. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.d.ts.map +1 -1
  20. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.js +15 -25
  21. package/dist/mcp-server/tools/definitions/brapi-dataframe-describe.tool.js.map +1 -1
  22. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.d.ts +6 -10
  23. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.d.ts.map +1 -1
  24. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.js +6 -16
  25. package/dist/mcp-server/tools/definitions/brapi-dataframe-drop.tool.js.map +1 -1
  26. package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.d.ts +69 -0
  27. package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.d.ts.map +1 -0
  28. package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.js +233 -0
  29. package/dist/mcp-server/tools/definitions/brapi-dataframe-export.tool.js.map +1 -0
  30. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.d.ts +19 -11
  31. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.d.ts.map +1 -1
  32. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.js +80 -28
  33. package/dist/mcp-server/tools/definitions/brapi-dataframe-query.tool.js.map +1 -1
  34. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts +4 -6
  35. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts.map +1 -1
  36. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js +28 -36
  37. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js.map +1 -1
  38. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts +3 -5
  39. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts.map +1 -1
  40. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js +21 -17
  41. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js.map +1 -1
  42. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts +4 -6
  43. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts.map +1 -1
  44. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js +16 -16
  45. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js.map +1 -1
  46. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts +3 -5
  47. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts.map +1 -1
  48. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js +15 -15
  49. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js.map +1 -1
  50. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts +4 -6
  51. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts.map +1 -1
  52. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js +17 -17
  53. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js.map +1 -1
  54. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts +4 -6
  55. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts.map +1 -1
  56. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js +17 -17
  57. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js.map +1 -1
  58. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts +2 -4
  59. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts.map +1 -1
  60. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js +60 -19
  61. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js.map +1 -1
  62. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts +3 -5
  63. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts.map +1 -1
  64. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js +15 -15
  65. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js.map +1 -1
  66. package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.d.ts.map +1 -1
  67. package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.js +6 -2
  68. package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.js.map +1 -1
  69. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts +17 -2
  70. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts.map +1 -1
  71. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js +51 -7
  72. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js.map +1 -1
  73. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts +16 -2
  74. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts.map +1 -1
  75. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js +51 -5
  76. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js.map +1 -1
  77. package/dist/mcp-server/tools/definitions/index.d.ts +141 -165
  78. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  79. package/dist/mcp-server/tools/definitions/index.js +28 -17
  80. package/dist/mcp-server/tools/definitions/index.js.map +1 -1
  81. package/dist/mcp-server/tools/shared/find-helpers.d.ts +79 -39
  82. package/dist/mcp-server/tools/shared/find-helpers.d.ts.map +1 -1
  83. package/dist/mcp-server/tools/shared/find-helpers.js +167 -70
  84. package/dist/mcp-server/tools/shared/find-helpers.js.map +1 -1
  85. package/dist/mcp-server/tools/shared/raw-routing-hints.d.ts.map +1 -1
  86. package/dist/mcp-server/tools/shared/raw-routing-hints.js +6 -6
  87. package/dist/mcp-server/tools/shared/raw-routing-hints.js.map +1 -1
  88. package/dist/services/canvas-bridge/canvas-bridge.d.ts +69 -44
  89. package/dist/services/canvas-bridge/canvas-bridge.d.ts.map +1 -1
  90. package/dist/services/canvas-bridge/canvas-bridge.js +220 -103
  91. package/dist/services/canvas-bridge/canvas-bridge.js.map +1 -1
  92. package/dist/services/canvas-bridge/index.d.ts +1 -1
  93. package/dist/services/canvas-bridge/index.d.ts.map +1 -1
  94. package/dist/services/canvas-bridge/index.js +1 -1
  95. package/dist/services/canvas-bridge/index.js.map +1 -1
  96. package/dist/services/canvas-bridge/types.d.ts +11 -12
  97. package/dist/services/canvas-bridge/types.d.ts.map +1 -1
  98. package/dist/services/canvas-bridge/types.js +4 -4
  99. package/package.json +3 -11
  100. package/server.json +3 -3
  101. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts +0 -13
  102. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts.map +0 -1
  103. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js +0 -26
  104. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js.map +0 -1
  105. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts +0 -89
  106. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts.map +0 -1
  107. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js +0 -306
  108. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js.map +0 -1
  109. package/dist/services/dataset-store/dataset-store.d.ts +0 -44
  110. package/dist/services/dataset-store/dataset-store.d.ts.map +0 -1
  111. package/dist/services/dataset-store/dataset-store.js +0 -208
  112. package/dist/services/dataset-store/dataset-store.js.map +0 -1
  113. package/dist/services/dataset-store/index.d.ts +0 -8
  114. package/dist/services/dataset-store/index.d.ts.map +0 -1
  115. package/dist/services/dataset-store/index.js +0 -7
  116. package/dist/services/dataset-store/index.js.map +0 -1
  117. package/dist/services/dataset-store/types.d.ts +0 -72
  118. package/dist/services/dataset-store/types.d.ts.map +0 -1
  119. package/dist/services/dataset-store/types.js +0 -8
  120. package/dist/services/dataset-store/types.js.map +0 -1
@@ -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.13",
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.13",
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.13",
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.13",
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.13",
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"}
@@ -1,89 +0,0 @@
1
- /**
2
- * @fileoverview `brapi_manage_dataset` — consolidated lifecycle tool for
3
- * datasets created by `find_*` spillovers. Four modes discriminated by
4
- * `mode`: list (enumerate with provenance), summary (metadata only), load
5
- * (paged rows with optional column projection), delete (drop metadata +
6
- * payload). Export (CSV/Parquet) is deferred until storage backends for the
7
- * write path are wired up.
8
- *
9
- * @module mcp-server/tools/definitions/brapi-manage-dataset.tool
10
- */
11
- import { z } from '@cyanheads/mcp-ts-core';
12
- import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
13
- export declare const brapiManageDataset: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
14
- mode: z.ZodEnum<{
15
- delete: "delete";
16
- list: "list";
17
- summary: "summary";
18
- load: "load";
19
- }>;
20
- datasetId: z.ZodOptional<z.ZodString>;
21
- cursor: z.ZodOptional<z.ZodString>;
22
- limit: z.ZodOptional<z.ZodNumber>;
23
- page: z.ZodOptional<z.ZodNumber>;
24
- pageSize: z.ZodOptional<z.ZodNumber>;
25
- columns: z.ZodOptional<z.ZodArray<z.ZodString>>;
26
- }, z.core.$strip>, z.ZodObject<{
27
- result: z.ZodDiscriminatedUnion<[z.ZodObject<{
28
- mode: z.ZodLiteral<"list">;
29
- datasets: z.ZodArray<z.ZodObject<{
30
- datasetId: z.ZodString;
31
- source: z.ZodString;
32
- baseUrl: z.ZodString;
33
- query: z.ZodUnknown;
34
- rowCount: z.ZodNumber;
35
- columns: z.ZodArray<z.ZodString>;
36
- sizeBytes: z.ZodNumber;
37
- createdAt: z.ZodString;
38
- expiresAt: z.ZodString;
39
- truncated: z.ZodOptional<z.ZodBoolean>;
40
- maxRows: z.ZodOptional<z.ZodNumber>;
41
- dataframe: z.ZodOptional<z.ZodString>;
42
- }, z.core.$strip>>;
43
- cursor: z.ZodOptional<z.ZodString>;
44
- }, z.core.$strip>, z.ZodObject<{
45
- mode: z.ZodLiteral<"summary">;
46
- dataset: z.ZodObject<{
47
- datasetId: z.ZodString;
48
- source: z.ZodString;
49
- baseUrl: z.ZodString;
50
- query: z.ZodUnknown;
51
- rowCount: z.ZodNumber;
52
- columns: z.ZodArray<z.ZodString>;
53
- sizeBytes: z.ZodNumber;
54
- createdAt: z.ZodString;
55
- expiresAt: z.ZodString;
56
- truncated: z.ZodOptional<z.ZodBoolean>;
57
- maxRows: z.ZodOptional<z.ZodNumber>;
58
- dataframe: z.ZodOptional<z.ZodString>;
59
- }, z.core.$strip>;
60
- }, z.core.$strip>, z.ZodObject<{
61
- mode: z.ZodLiteral<"load">;
62
- datasetId: z.ZodString;
63
- page: z.ZodNumber;
64
- pageSize: z.ZodNumber;
65
- totalRows: z.ZodNumber;
66
- totalPages: z.ZodNumber;
67
- rows: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
68
- }, z.core.$strip>, z.ZodObject<{
69
- mode: z.ZodLiteral<"delete">;
70
- datasetId: z.ZodString;
71
- deleted: z.ZodLiteral<true>;
72
- }, z.core.$strip>], "mode">;
73
- }, z.core.$strip>, readonly [{
74
- readonly reason: "datasetid_required";
75
- readonly code: JsonRpcErrorCode.ValidationError;
76
- readonly when: "Mode summary, load, or delete was selected without a datasetId";
77
- readonly recovery: "Call mode=list first to discover available dataset IDs, then retry with one.";
78
- }, {
79
- readonly reason: "dataset_not_found";
80
- readonly code: JsonRpcErrorCode.NotFound;
81
- readonly when: "Requested dataset is not present in the store (never existed or already expired)";
82
- readonly recovery: "Run mode=list to confirm available datasets, or rerun the find_* tool that produced it.";
83
- }, {
84
- readonly reason: "dataset_rows_missing";
85
- readonly code: JsonRpcErrorCode.NotFound;
86
- readonly when: "Dataset metadata is present but the row payload was lost or partially expired";
87
- readonly recovery: "Delete the stale dataset via mode=delete and rerun the find_* tool that produced it.";
88
- }]>;
89
- //# sourceMappingURL=brapi-manage-dataset.tool.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"brapi-manage-dataset.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/brapi-manage-dataset.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAkIjE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8G7B,CAAC"}
@@ -1,306 +0,0 @@
1
- /**
2
- * @fileoverview `brapi_manage_dataset` — consolidated lifecycle tool for
3
- * datasets created by `find_*` spillovers. Four modes discriminated by
4
- * `mode`: list (enumerate with provenance), summary (metadata only), load
5
- * (paged rows with optional column projection), delete (drop metadata +
6
- * payload). Export (CSV/Parquet) is deferred until storage backends for the
7
- * write path are wired up.
8
- *
9
- * @module mcp-server/tools/definitions/brapi-manage-dataset.tool
10
- */
11
- import { tool, z } from '@cyanheads/mcp-ts-core';
12
- import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
13
- import { getDatasetStore } from '../../../services/dataset-store/index.js';
14
- const DatasetMetadataSchema = z.object({
15
- datasetId: z.string().describe('Server-assigned dataset identifier.'),
16
- source: z.string().describe('Tool/operation that produced the dataset (e.g. "find_studies").'),
17
- baseUrl: z.string().describe('BrAPI base URL the dataset was pulled from.'),
18
- query: z.unknown().describe('Original filter map — provenance for reproducibility.'),
19
- rowCount: z.number().int().nonnegative().describe('Number of rows persisted in the dataset.'),
20
- columns: z
21
- .array(z.string().describe('Column name from the persisted rows.'))
22
- .describe('Full column list of the persisted rows.'),
23
- sizeBytes: z.number().int().nonnegative().describe('Serialized size of the dataset in bytes.'),
24
- createdAt: z.string().describe('ISO 8601 timestamp the dataset was created.'),
25
- expiresAt: z.string().describe('ISO 8601 timestamp after which the dataset will be purged.'),
26
- truncated: z
27
- .boolean()
28
- .optional()
29
- .describe('True when the dataset hit the spillover row/page cap before exhausting upstream.'),
30
- maxRows: z
31
- .number()
32
- .int()
33
- .positive()
34
- .optional()
35
- .describe('Cap that was applied at create time, when truncation occurred.'),
36
- dataframe: z
37
- .string()
38
- .optional()
39
- .describe('Dataframe name when this dataset was auto-registered as a SQL-queryable dataframe. Use with brapi_dataframe_query to run SQL across the rows.'),
40
- });
41
- const ListResultSchema = z
42
- .object({
43
- mode: z.literal('list').describe('Discriminator — `list` mode enumerates datasets.'),
44
- datasets: z
45
- .array(DatasetMetadataSchema.describe('Dataset metadata entry.'))
46
- .describe('Datasets visible to this tenant, in creation order.'),
47
- cursor: z.string().optional().describe('Opaque cursor when more datasets exist.'),
48
- })
49
- .describe('Enumeration of datasets visible to the current tenant.');
50
- const SummaryResultSchema = z
51
- .object({
52
- mode: z.literal('summary').describe('Discriminator — `summary` mode returns one dataset.'),
53
- dataset: DatasetMetadataSchema.describe('Metadata and provenance for the requested dataset.'),
54
- })
55
- .describe('Metadata + provenance for a single dataset.');
56
- const LoadResultSchema = z
57
- .object({
58
- mode: z.literal('load').describe('Discriminator — `load` mode returns a page of rows.'),
59
- datasetId: z.string().describe('Dataset the rows came from.'),
60
- page: z.number().int().positive().describe('1-indexed page number that was served.'),
61
- pageSize: z.number().int().positive().describe('Max rows per page (capped at 1000).'),
62
- totalRows: z.number().int().nonnegative().describe('Total rows in the dataset.'),
63
- totalPages: z.number().int().positive().describe('Total pages at the current pageSize.'),
64
- rows: z
65
- .array(z
66
- .record(z.string(), z.unknown())
67
- .describe('One persisted row. Schema matches the originating find_* tool result row (e.g. find_germplasm rows for a germplasm dataset); see the dataset summary for column names and the find_* output schema for field semantics.'))
68
- .describe('Rows for this page, with optional column projection applied.'),
69
- })
70
- .describe('Paged rows from a persisted dataset.');
71
- const DeleteResultSchema = z
72
- .object({
73
- mode: z.literal('delete').describe('Discriminator — `delete` mode confirms removal.'),
74
- datasetId: z.string().describe('Dataset that was deleted.'),
75
- deleted: z.literal(true).describe('Always `true` when the call succeeded.'),
76
- })
77
- .describe('Confirmation that a dataset was deleted.');
78
- const OutputSchema = z.object({
79
- result: z
80
- .discriminatedUnion('mode', [
81
- ListResultSchema,
82
- SummaryResultSchema,
83
- LoadResultSchema,
84
- DeleteResultSchema,
85
- ])
86
- .describe('Mode-specific result — discriminated by `mode`: list (dataset enumeration), summary (metadata+provenance), load (paged rows), delete (drop confirmation).'),
87
- });
88
- const InputSchema = z.object({
89
- mode: z
90
- .enum(['list', 'summary', 'load', 'delete'])
91
- .describe('Operation: list (enumerate datasets), summary (metadata+provenance), load (page rows), delete (drop payload).'),
92
- datasetId: z
93
- .string()
94
- .min(1)
95
- .optional()
96
- .describe('Required for mode=summary | load | delete. Ignored for mode=list.'),
97
- cursor: z.string().optional().describe('mode=list: resume a previous call.'),
98
- limit: z
99
- .number()
100
- .int()
101
- .positive()
102
- .max(200)
103
- .optional()
104
- .describe('mode=list: max datasets to return (default 50, capped at 200).'),
105
- page: z
106
- .number()
107
- .int()
108
- .positive()
109
- .optional()
110
- .describe('mode=load: 1-indexed page number (default 1).'),
111
- pageSize: z
112
- .number()
113
- .int()
114
- .positive()
115
- .optional()
116
- .describe('mode=load: rows per page (default 100, max 1000).'),
117
- columns: z
118
- .array(z.string().min(1))
119
- .optional()
120
- .describe('mode=load: subset of columns to return. Omit for all columns.'),
121
- });
122
- export const brapiManageDataset = tool('brapi_manage_dataset', {
123
- description: 'Dataset lifecycle — list (enumerate), summary (metadata+provenance), load (page rows with column projection), delete (drop payload). Datasets are produced by find_* tools when the upstream total exceeds loadLimit.',
124
- annotations: { readOnlyHint: false, idempotentHint: false },
125
- errors: [
126
- {
127
- reason: 'datasetid_required',
128
- code: JsonRpcErrorCode.ValidationError,
129
- when: 'Mode summary, load, or delete was selected without a datasetId',
130
- recovery: 'Call mode=list first to discover available dataset IDs, then retry with one.',
131
- },
132
- {
133
- reason: 'dataset_not_found',
134
- code: JsonRpcErrorCode.NotFound,
135
- when: 'Requested dataset is not present in the store (never existed or already expired)',
136
- recovery: 'Run mode=list to confirm available datasets, or rerun the find_* tool that produced it.',
137
- },
138
- {
139
- reason: 'dataset_rows_missing',
140
- code: JsonRpcErrorCode.NotFound,
141
- when: 'Dataset metadata is present but the row payload was lost or partially expired',
142
- recovery: 'Delete the stale dataset via mode=delete and rerun the find_* tool that produced it.',
143
- },
144
- ],
145
- input: InputSchema,
146
- output: OutputSchema,
147
- async handler(input, ctx) {
148
- const store = getDatasetStore();
149
- const requireDatasetId = () => {
150
- if (!input.datasetId) {
151
- throw ctx.fail('datasetid_required', `mode='${input.mode}' requires datasetId.`, {
152
- mode: input.mode,
153
- ...ctx.recoveryFor('datasetid_required'),
154
- });
155
- }
156
- return input.datasetId;
157
- };
158
- switch (input.mode) {
159
- case 'list': {
160
- const listOptions = {};
161
- if (input.cursor !== undefined)
162
- listOptions.cursor = input.cursor;
163
- if (input.limit !== undefined)
164
- listOptions.limit = input.limit;
165
- const page = await store.list(ctx, listOptions);
166
- const branch = {
167
- mode: 'list',
168
- datasets: page.datasets,
169
- };
170
- if (page.cursor !== undefined)
171
- branch.cursor = page.cursor;
172
- return { result: branch };
173
- }
174
- case 'summary': {
175
- const datasetId = requireDatasetId();
176
- const dataset = await store.summary(ctx, datasetId);
177
- const branch = { mode: 'summary', dataset };
178
- return { result: branch };
179
- }
180
- case 'load': {
181
- const datasetId = requireDatasetId();
182
- const loadOptions = {};
183
- if (input.page !== undefined)
184
- loadOptions.page = input.page;
185
- if (input.pageSize !== undefined)
186
- loadOptions.pageSize = input.pageSize;
187
- if (input.columns !== undefined)
188
- loadOptions.columns = input.columns;
189
- const pageResult = await store.load(ctx, datasetId, loadOptions);
190
- const branch = {
191
- mode: 'load',
192
- datasetId: pageResult.datasetId,
193
- page: pageResult.page,
194
- pageSize: pageResult.pageSize,
195
- totalRows: pageResult.totalRows,
196
- totalPages: pageResult.totalPages,
197
- rows: pageResult.rows,
198
- };
199
- return { result: branch };
200
- }
201
- case 'delete': {
202
- const datasetId = requireDatasetId();
203
- await store.delete(ctx, datasetId);
204
- const branch = {
205
- mode: 'delete',
206
- datasetId,
207
- deleted: true,
208
- };
209
- return { result: branch };
210
- }
211
- }
212
- },
213
- format: (result) => {
214
- const branch = result.result;
215
- switch (branch.mode) {
216
- case 'list':
217
- return [{ type: 'text', text: renderList(branch) }];
218
- case 'summary':
219
- return [{ type: 'text', text: renderSummary(branch.dataset) }];
220
- case 'load':
221
- return [{ type: 'text', text: renderLoad(branch) }];
222
- case 'delete':
223
- return [
224
- {
225
- type: 'text',
226
- text: `# Dataset deleted\n- datasetId: \`${branch.datasetId}\`\n- deleted: ${branch.deleted}\n- mode: ${branch.mode}`,
227
- },
228
- ];
229
- }
230
- },
231
- });
232
- function renderList(result) {
233
- const lines = [];
234
- lines.push(`# ${result.datasets.length} dataset(s) · mode=${result.mode}`);
235
- if (result.cursor)
236
- lines.push(`**Cursor:** \`${result.cursor}\` — pass to list again for next page.`);
237
- if (result.datasets.length === 0) {
238
- lines.push('');
239
- lines.push('_No datasets. Run a find_* tool to produce one._');
240
- return lines.join('\n');
241
- }
242
- lines.push('');
243
- lines.push('| datasetId | source | rows | sizeBytes | createdAt | expiresAt | truncated |');
244
- lines.push('|:----------|:-------|-----:|----------:|:----------|:----------|:----------|');
245
- for (const ds of result.datasets) {
246
- const truncated = ds.truncated ? `yes (cap=${ds.maxRows ?? '?'})` : 'no';
247
- lines.push(`| \`${ds.datasetId}\` | ${ds.source} | ${ds.rowCount} | ${ds.sizeBytes} | ${ds.createdAt} | ${ds.expiresAt} | ${truncated} |`);
248
- }
249
- for (const ds of result.datasets) {
250
- lines.push('');
251
- lines.push(`### \`${ds.datasetId}\``);
252
- lines.push(`- baseUrl: ${ds.baseUrl}`);
253
- lines.push(`- columns: ${ds.columns.join(', ')}`);
254
- lines.push(`- query: \`${JSON.stringify(ds.query)}\``);
255
- if (ds.dataframe) {
256
- lines.push(`- dataframe: \`${ds.dataframe}\` (queryable via brapi_dataframe_query)`);
257
- }
258
- }
259
- return lines.join('\n');
260
- }
261
- function renderSummary(dataset) {
262
- const lines = [];
263
- lines.push(`# Dataset \`${dataset.datasetId}\``);
264
- lines.push('');
265
- lines.push(`- source: ${dataset.source}`);
266
- lines.push(`- baseUrl: ${dataset.baseUrl}`);
267
- lines.push(`- rowCount: ${dataset.rowCount}`);
268
- lines.push(`- sizeBytes: ${dataset.sizeBytes}`);
269
- lines.push(`- createdAt: ${dataset.createdAt}`);
270
- lines.push(`- expiresAt: ${dataset.expiresAt}`);
271
- if (dataset.truncated) {
272
- lines.push(`- truncated: true (cap=${dataset.maxRows ?? '?'} rows)`);
273
- }
274
- if (dataset.dataframe) {
275
- lines.push(`- dataframe: \`${dataset.dataframe}\` (queryable via brapi_dataframe_query)`);
276
- }
277
- lines.push(`- columns: ${dataset.columns.join(', ')}`);
278
- lines.push(`- query: \`${JSON.stringify(dataset.query)}\``);
279
- return lines.join('\n');
280
- }
281
- function renderLoad(result) {
282
- const lines = [];
283
- lines.push(`# Dataset \`${result.datasetId}\` — page ${result.page} of ${result.totalPages} (${result.rows.length}/${result.totalRows} rows) · mode=${result.mode}`);
284
- lines.push('');
285
- lines.push(`- pageSize: ${result.pageSize}`);
286
- lines.push('');
287
- if (result.rows.length === 0) {
288
- lines.push('_No rows on this page._');
289
- return lines.join('\n');
290
- }
291
- const columns = Object.keys(result.rows[0] ?? {});
292
- lines.push('## Rows');
293
- for (const [i, row] of result.rows.entries()) {
294
- lines.push('');
295
- lines.push(`### Row ${(result.page - 1) * result.pageSize + i + 1}`);
296
- for (const col of columns) {
297
- const value = row[col];
298
- if (value === undefined || value === null)
299
- continue;
300
- const rendered = typeof value === 'object' ? JSON.stringify(value) : String(value);
301
- lines.push(`- **${col}:** ${rendered}`);
302
- }
303
- }
304
- return lines.join('\n');
305
- }
306
- //# sourceMappingURL=brapi-manage-dataset.tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"brapi-manage-dataset.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/brapi-manage-dataset.tool.ts"],"names":[],"mappings":"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"}