@cyanheads/brapi-mcp-server 0.5.3 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +3 -2
- package/Dockerfile +2 -2
- package/README.md +9 -9
- package/changelog/0.5.x/0.5.4.md +25 -0
- package/changelog/template.md +67 -25
- package/dist/services/canvas-bridge/canvas-bridge.d.ts +1 -1
- package/dist/services/canvas-bridge/canvas-bridge.js +4 -4
- package/package.json +5 -5
- package/server.json +3 -3
package/CLAUDE.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Agent Protocol
|
|
2
2
|
|
|
3
3
|
**Server:** brapi-mcp-server
|
|
4
|
-
**Version:** 0.5.
|
|
4
|
+
**Version:** 0.5.4
|
|
5
5
|
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core)
|
|
6
6
|
|
|
7
7
|
> **Read the framework docs first:** `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` contains the full API reference — builders, Context, error codes, exports, patterns. This file covers server-specific conventions only.
|
|
@@ -318,8 +318,9 @@ Available skills:
|
|
|
318
318
|
| `api-context` | Context interface, logger, state, progress |
|
|
319
319
|
| `api-errors` | McpError, JsonRpcErrorCode, error patterns |
|
|
320
320
|
| `api-services` | LLM, Speech, Graph services |
|
|
321
|
+
| `api-telemetry` | OTel catalog: spans, metrics, completion logs, env config, cardinality rules |
|
|
321
322
|
| `api-testing` | createMockContext, test patterns |
|
|
322
|
-
| `api-utils` | Formatting, parsing, security, pagination, scheduling |
|
|
323
|
+
| `api-utils` | Formatting, parsing, security, pagination, scheduling, telemetry helpers |
|
|
323
324
|
| `api-workers` | Cloudflare Workers runtime |
|
|
324
325
|
|
|
325
326
|
When you complete a skill's checklist, check the boxes and add a completion timestamp at the end (e.g., `Completed: 2026-03-11`).
|
package/Dockerfile
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# This stage installs all dependencies (including dev), builds the TypeScript
|
|
5
5
|
# source code into JavaScript, and prepares the production assets.
|
|
6
6
|
# ==============================================================================
|
|
7
|
-
FROM oven/bun:1 AS build
|
|
7
|
+
FROM oven/bun:1.3 AS build
|
|
8
8
|
|
|
9
9
|
WORKDIR /usr/src/app
|
|
10
10
|
|
|
@@ -28,7 +28,7 @@ RUN bun run build
|
|
|
28
28
|
# application. It uses a slim base image and only includes production
|
|
29
29
|
# dependencies and build artifacts.
|
|
30
30
|
# ==============================================================================
|
|
31
|
-
FROM oven/bun:1-slim AS production
|
|
31
|
+
FROM oven/bun:1.3-slim AS production
|
|
32
32
|
|
|
33
33
|
WORKDIR /usr/src/app
|
|
34
34
|
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
<div align="center">
|
|
9
9
|
|
|
10
|
-
[](https://www.npmjs.com/package/@cyanheads/brapi-mcp-server) [](https://www.npmjs.com/package/@cyanheads/brapi-mcp-server) [](./CHANGELOG.md) [](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) [](https://modelcontextprotocol.io/)
|
|
11
11
|
|
|
12
12
|
[](./LICENSE) [](https://www.typescriptlang.org/) [](https://bun.sh/) [](./CHANGELOG.md)
|
|
13
13
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
## Tools
|
|
19
19
|
|
|
20
|
-
22 tools grouped by shape — connection tools bootstrap a session, `find_*` tools return a summarized page plus distributions and spill overflow rows into a canvas dataframe that
|
|
20
|
+
22 tools grouped by shape — connection tools bootstrap a session, `find_*` tools return a summarized page plus distributions and spill overflow rows into a canvas dataframe that agents on the same session can query or hand off by ID, `get_*` tools fetch a single record with companion counts, plus pedigree walking, an embedded SQL workspace over spilled rows (DuckDB-backed), file export for human handoff, an additive write surface for observations, and raw passthrough escape hatches.
|
|
21
21
|
|
|
22
22
|
### Orient
|
|
23
23
|
|
|
@@ -108,7 +108,7 @@ Within one (tenant, session), dataframes act as a self-cleaning shared notebook:
|
|
|
108
108
|
|
|
109
109
|
**Default (isolated) shape.** Under `MCP_AUTH_MODE=none` + HTTP stateful (the default), each MCP session carves its own connection state and its own canvas. Two researchers connected to the same host don't see each other's `brapi_connect` aliases, exchanged SGN/OAuth tokens, or spilled `df_<uuid>` rows. Stdio always behaves as one session (single-process, no concurrency).
|
|
110
110
|
|
|
111
|
-
**
|
|
111
|
+
**Shared-workspace shape.** Set `BRAPI_SESSION_ISOLATION=false` for cross-session collaboration in one tenant — multiple MCP sessions then share connection state and one default canvas, the way pre-0.5.3 deployments behaved. Useful when planning, analysis, and writeup agents run as separate MCP clients but operate as one researcher on shared upstream credentials.
|
|
112
112
|
|
|
113
113
|
**On privileged data.** The `df_<uuid>` name is a capability token within a canvas — not row-level access control. Anyone holding the name within the same (tenant, session) bucket can read its rows. Under default isolation, that bucket is one MCP session. Under `BRAPI_SESSION_ISOLATION=false`, the bucket widens to the whole tenant (all callers under `auth=none`, or one user's sessions under `jwt`/`oauth`). Treat dataframe names like authenticated share links — pass within the bucket, not externally. The 24h TTL caps blast radius; the provenance trail (originating tool, baseUrl, query) supports audit. Belt-and-braces: `brapi_dataframe_describe` requires an explicit `dataframe` name on shared-trust HTTP (no list-all enumeration), and `brapi_dataframe_query` rejects system-catalog reads (`information_schema`, `pg_catalog`, `sqlite_master`, `duckdb_*`) — so a caller without a known `df_<uuid>` name can't fish through either surface.
|
|
114
114
|
|
|
@@ -181,7 +181,7 @@ MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
|
|
|
181
181
|
|
|
182
182
|
No env vars are required — the six built-in aliases (`bti-cassava`, `bti-sweetpotato`, `bti-breedbase-demo`, `t3-wheat`, `t3-oat`, `t3-barley`) resolve out-of-the-box, and agents can connect to any other BrAPI v2 URL at runtime via `brapi_connect`. **For credentialed servers, prefer env vars over agent input** so passwords / tokens / API keys stay out of the LLM context — see [Per-alias credentials](#per-alias-credentials).
|
|
183
183
|
|
|
184
|
-
**Prerequisites:** [Bun v1.3.11+](https://bun.sh/) or Node.js
|
|
184
|
+
**Prerequisites:** [Bun v1.3.11+](https://bun.sh/) or Node.js v24+. [`@duckdb/node-api`](https://www.npmjs.com/package/@duckdb/node-api) is a required dependency — supported on Linux/macOS/Windows × x64 plus Linux/macOS arm64 (no Windows arm64; no Cloudflare Workers).
|
|
185
185
|
|
|
186
186
|
---
|
|
187
187
|
|
|
@@ -212,7 +212,7 @@ Every variable is optional.
|
|
|
212
212
|
| `BRAPI_CANVAS_MAX_ROWS` / `BRAPI_CANVAS_QUERY_TIMEOUT_MS` | Per-query response row cap and wall-clock timeout for `brapi_dataframe_query`. | `10000` / `30000` |
|
|
213
213
|
| `MCP_TRANSPORT_TYPE` / `MCP_HTTP_PORT` / `MCP_SESSION_MODE` | Transport (`stdio` \| `http`), HTTP port, session mode (`stateful` \| `stateless` \| `auto`). | `stdio` / `3010` / `auto` |
|
|
214
214
|
| `MCP_AUTH_MODE` / `MCP_LOG_LEVEL` / `STORAGE_PROVIDER_TYPE` / `OTEL_ENABLED` | Auth mode (`none` \| `jwt` \| `oauth`), log level, storage backend, OpenTelemetry. | `none` / `info` / `in-memory` / `false` |
|
|
215
|
-
| `BRAPI_SESSION_ISOLATION` | When `true`, scope ServerRegistry connection state and the CanvasBridge default canvas to `ctx.sessionId` (HTTP stateful/auto). Concurrent callers under `MCP_AUTH_MODE=none` operate in isolated workspaces. Set `false` for the
|
|
215
|
+
| `BRAPI_SESSION_ISOLATION` | When `true`, scope ServerRegistry connection state and the CanvasBridge default canvas to `ctx.sessionId` (HTTP stateful/auto). Concurrent callers under `MCP_AUTH_MODE=none` operate in isolated workspaces. Set `false` for the shared-workspace collaboration model. No effect on stdio. | `true` |
|
|
216
216
|
|
|
217
217
|
Per-alias overrides follow the `BRAPI_<ALIAS>_*` pattern — see [`.env.example`](./.env.example) for every override and inline comments.
|
|
218
218
|
|
|
@@ -295,7 +295,7 @@ docker build -t brapi-mcp-server .
|
|
|
295
295
|
docker run --rm -p 3010:3010 brapi-mcp-server
|
|
296
296
|
```
|
|
297
297
|
|
|
298
|
-
Defaults to HTTP transport, stateful session mode (engages `mcp-session-id` lifecycle
|
|
298
|
+
Defaults to HTTP transport, stateful session mode (engages the `mcp-session-id` lifecycle — precondition for `BRAPI_SESSION_ISOLATION=true`; hijack protection requires layering `MCP_AUTH_MODE=jwt|oauth` on top), logs to `/var/log/brapi-mcp-server`. OTel peer deps are installed by default — `--build-arg OTEL_ENABLED=false` to omit.
|
|
299
299
|
|
|
300
300
|
### Deployment shapes
|
|
301
301
|
|
|
@@ -305,13 +305,13 @@ Defaults to HTTP transport, stateful session mode (engages `mcp-session-id` life
|
|
|
305
305
|
|:------|:---------|:----------|:---------|
|
|
306
306
|
| **Per-session (default)** | `MCP_AUTH_MODE=none` + HTTP stateful + `BRAPI_SESSION_ISOLATION=true` | Each MCP session carves its own connection state and canvas. Concurrent HTTP callers don't see each other's aliases, exchanged tokens, or `df_<uuid>` rows. | Multi-user host without SSO. Default for institutional / public deployment under shared-trust auth. |
|
|
307
307
|
| **Per-user credentials** | `MCP_AUTH_MODE=jwt` or `oauth` (+ HTTP stateful) | Each user's JWT `tid` claim carves a tenant. Sessions sub-scope inside each tenant when isolation is on. Cross-user spillover impossible at the framework level. | Multi-user host with institutional SSO (Shibboleth, Okta, etc.) — strongest separation. |
|
|
308
|
-
| **Shared workspace
|
|
308
|
+
| **Shared workspace** | `MCP_AUTH_MODE=none` + `BRAPI_SESSION_ISOLATION=false` | All callers in one tenant share connection state and one canvas. Possession of a `df_<uuid>` name = full read/write across the workspace. | Solo, lab, or hosting where every caller is one researcher running parallel agents on shared upstream credentials. |
|
|
309
309
|
|
|
310
310
|
**Shape selection guide:**
|
|
311
311
|
|
|
312
312
|
- **Multi-user public/institutional HTTP, no SSO.** Use the per-session default. Each researcher's stateful HTTP session is isolated even though they all resolve to `tenantId='default'`.
|
|
313
|
-
- **Multi-user with institutional SSO.**
|
|
314
|
-
- **One researcher, parallel agents.** If multiple agents (planner, analyst, writeup) connect as separate MCP clients but should share one workspace, set `BRAPI_SESSION_ISOLATION=false` and rely on shared trust. This is the
|
|
313
|
+
- **Multi-user with institutional SSO.** `MCP_AUTH_MODE=jwt` (HS256, `MCP_AUTH_SECRET_KEY`) or `oauth` (JWKS, `OAUTH_ISSUER_URL` + `OAUTH_AUDIENCE`). Each user's `tid` claim carves a tenant — the outer scope. `BRAPI_SESSION_ISOLATION=true` (default) then sub-scopes inside each tenant for users running parallel sessions, and JWT/OAuth identity binding gives real session-hijack protection on top.
|
|
314
|
+
- **One researcher, parallel agents.** If multiple agents (planner, analyst, writeup) connect as separate MCP clients but should share one workspace, set `BRAPI_SESSION_ISOLATION=false` and rely on shared trust. This is the shared-workspace shape.
|
|
315
315
|
- **Stdio.** Always one session; isolation is moot. The flag has no effect.
|
|
316
316
|
|
|
317
317
|
**Belt-and-braces under shared trust.** Even with `BRAPI_SESSION_ISOLATION=false`, `brapi_dataframe_describe` requires an explicit `dataframe` name on HTTP (no list-all enumeration), and `brapi_dataframe_query` rejects system-catalog reads (`information_schema`, `pg_catalog`, `sqlite_master`, `duckdb_*`). The dataframe name is the capability token; possession proves it.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Patch maintenance — drop misleading 'legacy' label from the shared-workspace shape; adopt framework 0.8.19 (engines bump, Docker base 1.3, api-telemetry skill)."
|
|
3
|
+
breaking: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 0.5.4 — 2026-05-08
|
|
7
|
+
|
|
8
|
+
## Changed
|
|
9
|
+
|
|
10
|
+
- **Engines bumped:** `node >=22.0.0 → >=24.0.0`, `bun >=1.2.0 → >=1.3.0` — tracks the `@cyanheads/mcp-ts-core` 0.8.19 floor.
|
|
11
|
+
- **Dockerfile base:** `oven/bun:1 → oven/bun:1.3` (build and slim-runtime stages).
|
|
12
|
+
- **README prerequisite line:** Node.js v22+ → v24+.
|
|
13
|
+
- **`scripts/build-changelog.ts` synced** — adds optional `security: boolean` frontmatter; pairs with the `## Security` body section to render a `🛡️ Security` badge in the rollup. Existing per-version files stay valid (the field defaults to `false`).
|
|
14
|
+
- **`changelog/template.md` synced** (pristine reference) — bold-the-symbol bullet style, Keep-a-Changelog section order, scaffolded Deprecated / Removed / Security sections (commented out by default).
|
|
15
|
+
- **`CLAUDE.md` / `AGENTS.md` skill table** — added `api-telemetry`; `api-utils` description now mentions telemetry helpers.
|
|
16
|
+
- **Skills resynced from `@cyanheads/mcp-ts-core@0.8.19`** — `api-telemetry` (NEW v1.0; full OTel catalog of spans, metrics, completion-log fields, env config, cardinality rules), `api-utils` 2.1 → 2.2, `maintenance` 2.0 → 2.1 (Phase C now also resyncs pristine reference files), `report-issue-framework` 1.5 → 1.6, `report-issue-local` 1.4 → 1.5, `setup` 1.6 → 1.7. Phase B mirrored into `.claude/skills/` and `.agents/skills/`.
|
|
17
|
+
|
|
18
|
+
## Fixed
|
|
19
|
+
|
|
20
|
+
- **Dropped misleading "legacy" label from the shared-workspace deployment shape** — `README.md` table row + env-var description + multi-agent workflows section, `src/services/canvas-bridge/canvas-bridge.ts` comments, `tests/services/server-registry.test.ts` test comment. The shape (`MCP_AUTH_MODE=none + BRAPI_SESSION_ISOLATION=false`) remains a first-class supported deployment mode — only non-default since 0.5.3.
|
|
21
|
+
|
|
22
|
+
## Dependencies
|
|
23
|
+
|
|
24
|
+
- **`@cyanheads/mcp-ts-core` `^0.8.17 → ^0.8.19`** — `ctx.auth.token` reaches handlers ([#121](https://github.com/cyanheads/mcp-ts-core/issues/121); not used by this server), new `api-telemetry` skill, `security: boolean` changelog frontmatter, hono `^4.12.18` security floor, OTel SDK `^0.217.0`, engines + Docker base bumps.
|
|
25
|
+
- **`@types/node` `^25.6.0 → ^25.6.2`**.
|
package/changelog/template.md
CHANGED
|
@@ -1,41 +1,71 @@
|
|
|
1
1
|
---
|
|
2
|
-
# FORMAT REFERENCE —
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
|
|
7
|
-
#
|
|
8
|
-
|
|
9
|
-
#
|
|
10
|
-
#
|
|
2
|
+
# FORMAT REFERENCE — do not edit. Copy this file to
|
|
3
|
+
# `changelog/<major.minor>.x/<version>.md` (e.g. `changelog/0.8.x/0.8.6.md`)
|
|
4
|
+
# to author a new release. Set that file's H1 to `# <version> — YYYY-MM-DD`
|
|
5
|
+
# with a concrete date.
|
|
6
|
+
|
|
7
|
+
# Required. One-line GitHub Release-style headline. ~250 character soft cap.
|
|
8
|
+
# Default short and scannable. Don't pad, don't stitch unrelated changes with
|
|
9
|
+
# semicolons — pick the headline. Quotes required: unquoted YAML treats `: `
|
|
10
|
+
# inside the value as a key separator and fails GitHub's strict parser.
|
|
11
11
|
summary: ""
|
|
12
12
|
|
|
13
|
-
# Set
|
|
14
|
-
# changes, config renames,
|
|
15
|
-
# Flagged as
|
|
13
|
+
# Set `true` when consumers must change code to upgrade: API removals,
|
|
14
|
+
# signature changes, config renames, behavior changes that break existing
|
|
15
|
+
# usage. Flagged as `Breaking` in the rollup.
|
|
16
16
|
breaking: false
|
|
17
|
+
|
|
18
|
+
# Set `true` if this release contains any security fix. Pairs with the
|
|
19
|
+
# `## Security` section below. Flagged as `Security` in the rollup so
|
|
20
|
+
# users can triage upgrade urgency at a glance.
|
|
21
|
+
security: false
|
|
17
22
|
---
|
|
18
23
|
|
|
19
24
|
# <version> — YYYY-MM-DD
|
|
20
25
|
|
|
21
26
|
<!--
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
AUTHORING GUIDE — applies to the new per-version file you create from this
|
|
28
|
+
template.
|
|
29
|
+
|
|
30
|
+
Audience: someone scanning release notes to decide what affects them. Lead
|
|
31
|
+
each bullet with the symbol or concept name in **bold** so they can skip
|
|
32
|
+
what's irrelevant and zoom in on what's not.
|
|
33
|
+
|
|
34
|
+
Tone: terse, fact-dense, not verbose. Default to one sentence per bullet —
|
|
35
|
+
name the symbol, state what changed, stop. Use a second sentence only when
|
|
36
|
+
it carries weight. If a bullet feels long, it is.
|
|
37
|
+
|
|
38
|
+
Cut: mechanism walkthroughs (those belong in JSDoc, AGENTS.md, or the
|
|
39
|
+
relevant skill), ceremonial framings ("This release introduces…",
|
|
40
|
+
backwards-compat paragraphs), file-by-file test enumerations, internal
|
|
41
|
+
implementation notes. Prefer code/symbol names over English re-explanations.
|
|
42
|
+
|
|
43
|
+
Narrative intro: skip by default. Add one short sentence only when the
|
|
44
|
+
release theme genuinely needs framing the bullets can't carry.
|
|
45
|
+
|
|
46
|
+
Sections: Keep a Changelog order — Added, Changed, Deprecated, Removed,
|
|
47
|
+
Fixed, Security. Include only sections with entries; delete the rest
|
|
48
|
+
(including the commented-out scaffolding below). Don't ship empty headers.
|
|
25
49
|
|
|
26
|
-
|
|
50
|
+
Include: every distinct fact a reader needs to adopt or audit the release —
|
|
51
|
+
new exports, signatures, lint rule IDs, env vars, breaking changes, version
|
|
52
|
+
bumps on shipped skills. Nothing more.
|
|
27
53
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
54
|
+
Links: link issues, PRs, docs, or skills where they help a reader jump to
|
|
55
|
+
context. Once per item per entry — don't re-link the same issue in summary,
|
|
56
|
+
narrative, and bullet. Skip links for inline symbol names; code spans speak
|
|
57
|
+
for themselves.
|
|
31
58
|
|
|
32
|
-
|
|
33
|
-
|
|
59
|
+
Issue/PR URLs: use full URLs. GitHub's bare `#NN` auto-link only resolves
|
|
60
|
+
inside its own UI, not in npm reads or local editors.
|
|
34
61
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
62
|
+
[#38](https://github.com/cyanheads/mcp-ts-core/issues/38) ← issue
|
|
63
|
+
[#42](https://github.com/cyanheads/mcp-ts-core/pull/42) ← PR
|
|
64
|
+
|
|
65
|
+
Verify numbers exist before linking (`gh issue view NN`, `gh pr view NN`).
|
|
66
|
+
Never speculate on a future number — `#42` for an upcoming PR silently
|
|
67
|
+
resolves to whatever real item already owns 42, and timeline previews pull
|
|
68
|
+
in that unrelated item's metadata.
|
|
39
69
|
-->
|
|
40
70
|
|
|
41
71
|
## Added
|
|
@@ -46,6 +76,18 @@ breaking: false
|
|
|
46
76
|
|
|
47
77
|
-
|
|
48
78
|
|
|
79
|
+
<!-- ## Deprecated
|
|
80
|
+
|
|
81
|
+
- -->
|
|
82
|
+
|
|
83
|
+
<!-- ## Removed
|
|
84
|
+
|
|
85
|
+
- -->
|
|
86
|
+
|
|
49
87
|
## Fixed
|
|
50
88
|
|
|
51
89
|
-
|
|
90
|
+
|
|
91
|
+
<!-- ## Security
|
|
92
|
+
|
|
93
|
+
- -->
|
|
@@ -65,7 +65,7 @@ export declare class CanvasBridge {
|
|
|
65
65
|
* folds the session ID in, so concurrent HTTP sessions in the same tenant
|
|
66
66
|
* end up on distinct canvases. When isolation is disabled or no session ID
|
|
67
67
|
* is available (stdio, stateless HTTP without opt-in), falls back to the
|
|
68
|
-
*
|
|
68
|
+
* tenant-shared canvas.
|
|
69
69
|
*/
|
|
70
70
|
getInstance(ctx: Context): Promise<CanvasInstance>;
|
|
71
71
|
/**
|
|
@@ -38,9 +38,9 @@ function asRequestContext(ctx) {
|
|
|
38
38
|
/**
|
|
39
39
|
* State keys holding the default canvasId (opaque 10-char token).
|
|
40
40
|
*
|
|
41
|
-
* `DEFAULT_CANVAS_KEY` keys the per-tenant default canvas — the
|
|
42
|
-
* shared workspace; used for stdio, stateless HTTP without opt-in,
|
|
43
|
-
* deployment where `BRAPI_SESSION_ISOLATION=false`.
|
|
41
|
+
* `DEFAULT_CANVAS_KEY` keys the per-tenant default canvas — the
|
|
42
|
+
* tenant-shared workspace; used for stdio, stateless HTTP without opt-in,
|
|
43
|
+
* and any deployment where `BRAPI_SESSION_ISOLATION=false`.
|
|
44
44
|
*
|
|
45
45
|
* `SESSION_CANVAS_PREFIX` keys per-session canvases when isolation is on
|
|
46
46
|
* and `ctx.sessionId` is present. Each session gets its own canvas and
|
|
@@ -87,7 +87,7 @@ export class CanvasBridge {
|
|
|
87
87
|
* folds the session ID in, so concurrent HTTP sessions in the same tenant
|
|
88
88
|
* end up on distinct canvases. When isolation is disabled or no session ID
|
|
89
89
|
* is available (stdio, stateless HTTP without opt-in), falls back to the
|
|
90
|
-
*
|
|
90
|
+
* tenant-shared canvas.
|
|
91
91
|
*/
|
|
92
92
|
async getInstance(ctx) {
|
|
93
93
|
const key = this.defaultCanvasKey(ctx);
|
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.5.
|
|
4
|
+
"version": "0.5.4",
|
|
5
5
|
"description": "A collaborative BrAPI v2.1 workspace for multi-agent research via MCP. Search studies, germplasm, genotypes, & more - across Breedbase, T3, Sweetpotatobase, & any BrAPI v2-compliant server.",
|
|
6
6
|
"author": "Casey Hand @cyanheads (https://github.com/cyanheads/brapi-mcp-server#readme)",
|
|
7
7
|
"type": "module",
|
|
@@ -63,21 +63,21 @@
|
|
|
63
63
|
},
|
|
64
64
|
"license": "Apache-2.0",
|
|
65
65
|
"engines": {
|
|
66
|
-
"node": ">=
|
|
67
|
-
"bun": ">=1.
|
|
66
|
+
"node": ">=24.0.0",
|
|
67
|
+
"bun": ">=1.3.0"
|
|
68
68
|
},
|
|
69
69
|
"packageManager": "bun@1.3.11",
|
|
70
70
|
"publishConfig": {
|
|
71
71
|
"access": "public"
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
74
|
-
"@cyanheads/mcp-ts-core": "^0.8.
|
|
74
|
+
"@cyanheads/mcp-ts-core": "^0.8.19",
|
|
75
75
|
"@duckdb/node-api": "^1.5.2-r.1",
|
|
76
76
|
"pino-pretty": "^13.1.3"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
79
|
"@biomejs/biome": "^2.4.14",
|
|
80
|
-
"@types/node": "^25.6.
|
|
80
|
+
"@types/node": "^25.6.2",
|
|
81
81
|
"depcheck": "^1.4.7",
|
|
82
82
|
"ignore": "^7.0.5",
|
|
83
83
|
"tsc-alias": "^1.8.17",
|
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.5.
|
|
9
|
+
"version": "0.5.4",
|
|
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.5.
|
|
16
|
+
"version": "0.5.4",
|
|
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.5.
|
|
52
|
+
"version": "0.5.4",
|
|
53
53
|
"packageArguments": [
|
|
54
54
|
{ "type": "positional", "value": "run" },
|
|
55
55
|
{ "type": "positional", "value": "start:http" }
|