Skip to main content
Glama
cyanheads

@cyanheads/brapi-mcp-server

by cyanheads

npm Version MCP SDK License TypeScript Bun Status

Install in Claude Desktop Install in Cursor Install in VS Code

Framework


Инструменты

25 инструментов, сгруппированных по типу: инструменты подключения инициализируют сессию; инструменты find_* возвращают сводную страницу с распределениями и выгружают избыточные строки в canvas-датафрейм, который агенты той же сессии могут запрашивать или передавать по ID; инструменты get_* получают отдельную запись с сопутствующими счётчиками. Плюс обход родословной, встроенное SQL-рабочее пространство над выгруженными строками (на базе DuckDB), экспорт файлов для передачи человеку, аддитивная поверхность записи наблюдений и прямые обходные каналы (raw passthrough).

Ориентация

Инструмент

Описание

brapi_connect

Аутентификация, регистрация подключения под псевдонимом, кэширование профиля возможностей и возврат ориентационного конверта инлайн. Один вызов полностью ориентирует агента.

brapi_server_info

Повторное получение ориентационного конверта для зарегистрированного псевдонима: идентичность, аутентификация, возможности, счётчики контента, атрибуция, примечания.

brapi_describe_filters

Статический каталог фильтров BrAPI v2.1 для любого эндпоинта — обеспечивает обнаружение extraFilters в каждом инструменте find_*.

Получение

Инструмент

Описание

brapi_find_studies

Поиск исследований по культуре / типу испытания / сезону / местоположению / программе. Распределения + выгрузка в датафрейм.

brapi_get_study

Получение исследования с разрешёнными внешними ключами программы / испытания / местоположения и сопутствующими счётчиками (наблюдения, единицы, переменные).

brapi_find_germplasm

Поиск гермоплазмы по имени, синониму, аксессии, PUI, культуре или произвольному тексту. Распределения + выгрузка в датафрейм.

brapi_get_germplasm

Получение гермоплазмы с атрибутами, непосредственными родителями и сопутствующими счётчиками (исследования, родители, потомки).

brapi_walk_pedigree

Обход предков / потомков в ширину (BFS) в виде дедуплицированного DAG с обнаружением циклов, ограничениями глубины и статистикой обхода.

brapi_find_variables

Поиск переменных наблюдений по имени / классу / онтологии / произвольному тексту; ранжирование на стороне клиента через OntologyResolver при указании text.

brapi_find_observations

Получение записей наблюдений по исследованию / гермоплазме / переменной / сезону / единице / временной метке. Выгрузка в датафрейм.

brapi_find_images

Фильтрация метаданных изображений по единице / исследованию / онтологии / MIME-типу. Байты — через brapi_get_image.

brapi_get_image

Получение байтов изображения для до 5 imageDbIds инлайн в виде блоков type: image. Предпочитает /imagecontent, при недоступности использует imageURL.

brapi_find_locations

Поиск исследовательских станций по стране (код ISO alpha-3 или английское название страны, разрешаемое на стороне клиента) / типу / аббревиатуре, с опциональным клиентским фильтром по bbox.

brapi_find_variants

Поиск записей вариантов по набору вариантов, референсу или геномному региону (с отсчётом от 1, включительно / исключительно).

brapi_find_genotype_calls

Получение генотип-вызовов через опрос async-search. Объём получаемых данных ограничен BRAPI_GENOTYPE_CALLS_MAX_PULL (по умолчанию 100k, максимум 500k).

Анализ

Инструмент

Описание

brapi_dataframe_describe

Начните здесь после выгрузки. Перечисляет датафреймы (или описывает один) со схемой колонок, количеством строк и происхождением исходных данных.

brapi_dataframe_query

SQL SELECT по датафреймам в памяти (на базе DuckDB). Выгруженные строки find_* автоматически регистрируются как df_<uuid>. Только чтение: многооператорные запросы, не-SELECT, чтение файлов и экспорт отклоняются. Возвращает типизированные колонки ({ name, type }[]).

brapi_dataframe_drop

Включается через BRAPI_CANVAS_DROP_ENABLED=true. Удаление датафрейма по имени. Идемпотентно. Неуправляемые датафреймы также истекают по TTL.

brapi_dataframe_export

Включается через BRAPI_EXPORT_DIR=<path>, только stdio. Экспорт датафрейма на диск (CSV / Parquet / JSON) в настроенную директорию с возвратом абсолютного пути для открытия человеком. Опциональная проекция columns или фильтр sql материализуют производную таблицу для экспорта, которая затем удаляется.

brapi_build_phenotype_matrix

Построение матрицы гермоплазма × признак по одному или нескольким исследованиям и материализация её как canvas-датафрейма. Поддерживает широкую (pivot) или длинную форму с настраиваемой агрегацией по ячейкам.

brapi_germplasm_performance

Агрегаты производительности по каждой переменной (n, mean, median, sd, min, max, studyCount) для одной гермоплазмы по всем исследованиям, где у неё есть наблюдения.

brapi_export_genotype_matrix

Экспорт генотип-вызовов для набора вариантов в виде canvas-датафрейма гермоплазма × вариант; также сериализует в VCF-lite или текст PLINK .ped/.map. Колонки уникальных вариантов ограничены BRAPI_GENOTYPE_MATRIX_MAX_COLUMNS (по умолчанию 10k, максимум 500k).

Запись (включается через BRAPI_ENABLE_WRITES=true)

Инструмент

Описание

brapi_submit_observations

Двухфазная запись наблюдений: mode: preview выполняет проверку; mode: apply запрашивает подтверждение у вызывающей стороны, затем параллельно рассылает POST + PUT. Только аддитивно — без разрушающих удалений.

Обходные каналы

Инструмент

Описание

brapi_raw_get

Прямой проход к любому BrAPI GET /{path}, не покрытому курируемыми инструментами. Выдаёт подсказку о маршрутизации, когда она применима.

brapi_raw_search

Прямой проход к любому POST /search/{noun} с прозрачной обработкой асинхронного опроса. Та же схема подсказок.

Обнаружение псевдонимов. Встроенные и настроенные оператором псевдонимы добавляются к описанию brapi_connect при запуске сервера, поэтому агенты видят перечень в tools/list. После изменения переменных окружения перезапустите сервер для обновления.


Related MCP server: Helix MCP Server

Ресурсы

Адресуемые по URI зеркала курируемой поверхности инструментов для клиентов, предпочитающих ресурсы. Все ресурсы используют подключение по умолчанию — мультисерверные сценарии маршрутизируются через инструменты.

Шаблон URI

Зеркала

brapi://server/info

brapi_server_info (подключение по умолчанию)

brapi://calls

Сырой профиль возможностей

brapi://study/{studyDbId}

brapi_get_study

brapi://germplasm/{germplasmDbId}

brapi_get_germplasm

brapi://filters/{endpoint}

brapi_describe_filters

brapi://variable/{observationVariableDbId}

Запись переменной наблюдения (признак, шкала, метод, онтология)


Промпты

Multi-step BrAPI workflow templates — pure user-message generators, no side effects.

Name

Args

Purpose

brapi_eda_study

studyDbId, alias?

EDA playbook for one study — orient, variables, coverage, missing data, outliers, pedigree, structured report.

brapi_meta_analysis

germplasmDbIds (CSV), traitName, alias?

Cross-study meta-analysis — trait resolution, study discovery, harmonization, per-germplasm × per-study and across-study summaries.


Multi-agent workflows

The server has two stateful layers and two scoping axes:

Layer

Default scope

Why

Connection state (aliases, exchanged tokens)

Tenant + session

Credentials and live tokens. Tenant gates by user (jwt/oauth) or collapses to 'default' (none). Session sub-scope (BRAPI_SESSION_ISOLATION=true, default) prevents concurrent HTTP sessions in one tenant from sharing each other's tokens.

Dataframes (df_<uuid> tables)

Tenant + session

Within one (tenant, session), agents share by df_<uuid> name — possession grants full read/write/drop, auto-expires in 24h, provenance recorded. The underlying canvas is tenant-gated by the framework; the session sub-scope is enforced by the bridge's keying.

Within one (tenant, session), dataframes act as a self-cleaning shared notebook: hand the df_<uuid> name between parallel agents on the same MCP session, persist it across a multi-step workflow, query / project / aggregate / join from any position. Address-by-name, time-bounded, scoped to that session.

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).

Clients on MCP revision 2026-07-28. That revision is session-less on every transport — requests carry no Mcp-Session-Id — so ctx.sessionId is undefined and a client negotiating it falls back to the shared tenant workspace even under MCP_SESSION_MODE=stateful. Session isolation applies to 2025-era clients; deployments that need a hard boundary for 2026-era clients should carve tenants with MCP_AUTH_MODE=jwt/oauth.

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.

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.


BrAPI-specific features

  • Dataframe spilloverfind_* tools cap in-context rows at loadLimit and materialize larger unions (up to 50k rows / 50 pages) as DuckDB-backed df_<uuid> canvas dataframes. Discover with brapi_dataframe_describe, query with brapi_dataframe_query (SQL paging via LIMIT/OFFSET, projection, aggregation). Read-only enforcement at the SQL gate; session-scoped by default (tenant-scoped under BRAPI_SESSION_ISOLATION=false) — see Multi-agent workflows.

  • Multi-server sessionServerRegistry maps aliases to live BrAPI connections; one session can span Breedbase, T3, and Sweetpotatobase in parallel.

  • Built-in known-server registrybti-cassava, bti-sweetpotato, bti-breedbase-demo, t3-wheat, t3-oat, t3-barley resolve out-of-the-box without env vars; orientation envelope carries CC-BY attribution.

  • Capability-aware callsCapabilityRegistry caches /serverinfo per connection and guards every tool call against unsupported endpoints. Falls back to /calls when /serverinfo is sparse.

  • Dialect adaptationspec / brapi-test / breedbase / cassavabase / bms dialects translate v2.1 plural filter keys to the singular form each server family honors, drop filters known to be broken, normalize sparse-shape encodings, and escalate to POST /search/{noun} when GET would silently downcast multi-value filters. Detected from /serverinfo (server-name / organization-name); pin per-alias via BRAPI_<ALIAS>_DIALECT. Verified-vs-inferred mapping counts surface on the orientation envelope so agents see the confidence floor at a glance.

  • DuckDB required@duckdb/node-api is a regular dependency; startup fails closed when the framework canvas is unavailable. Not supported on Cloudflare Workers (no native binary in that runtime).

  • Async-search transparencybrapi_find_genotype_calls and brapi_raw_search handle the POST /search/{noun}GET /search/{noun}/{id} 202-retry pattern automatically.

  • Pedigree DAG walksbrapi_walk_pedigree BFS-traverses ancestry / descendancy with cycle detection (BrAPI only exposes one generation per call); a 1,000-node safety cap bounds the walk and sets truncated when reached. Walks larger than loadLimit spill their node and edge sets to two JOINable canvas dataframes and return a bounded inline preview.

  • Image contentbrapi_get_image fetches bytes inline as MCP type: image blocks, preferring /images/{id}/imagecontent with imageURL fallback.

  • Free-text variable rankingOntologyResolver scores variables against a query (PUI / name / synonym / trait-class) so find_variables text:"..." returns ranked candidates even without /ontologies.

  • Auth variants in one schema — tagged-union covers none / bearer / api_key / sgn (session-token exchange) / oauth2 (client-credentials).

  • Typed error contracts — every declared failure mode carries a stable data.reason, an HTTP-style code, and a recovery.hint so clients can route deterministically.

Built on @cyanheads/mcp-ts-core — declarative definitions, unified error handling, pluggable auth (none / jwt / oauth), swappable storage, structured logging with optional OTel, STDIO + Streamable HTTP transports.


Working with dataframes

When a find_* tool's upstream total exceeds loadLimit, the full union materializes as a canvas dataframe and the response carries an inline dataframe handle ({ tableName, rowCount, columns, createdAt, expiresAt, … }). Upstream column names that aren't SQL-safe identifiers — reserved words like end, digit-leading IDs — are sanitized for the dataframe, and a columnLegend on the handle maps each renamed column back to its original key. SQL is the paging idiom — use LIMIT/OFFSET to walk pages, projection (SELECT col1, col2) to trim columns, and aggregation (COUNT, GROUP BY, AVG) to summarize without materializing every row.

Dataframe names are session-scoped capability tokens by default — pass tableName to any other agent on the same MCP session (or a downstream step in the same workflow) and they query the same workspace by name without re-pulling from the upstream. The brapi_dataframe_* tools offer SQL manipulation and more. See Multi-agent workflows for cross-session / cross-tenant rules.

1. brapi_find_observations { studies: ["s-422"] }
   → first-page rows inline + dataframe.tableName = "df_<uuid>" (when totalCount > loadLimit)
2. brapi_dataframe_describe { dataframe: "df_<uuid>" }
   → schema + provenance (originating tool, baseUrl, query, expiry)
3. brapi_dataframe_query { sql: "SELECT germplasmName, value FROM df_<uuid> WHERE observationVariableDbId = 'V1' LIMIT 100" }
   → typed columns + bounded rows
4. brapi_dataframe_query { sql: "SELECT COUNT(*) AS n, AVG(CAST(value AS DOUBLE)) AS mean FROM df_<uuid> WHERE observationVariableDbId = 'V1'" }
   → aggregate without round-tripping all rows

Dataframes auto-expire via TTL (BRAPI_DATASET_TTL_SECONDS, default 24h). Set BRAPI_CANVAS_DROP_ENABLED=true to expose brapi_dataframe_drop for explicit cleanup.


Getting started

Add to your MCP client config — pick one runner:

{
  "mcpServers": {
    "brapi-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["@cyanheads/brapi-mcp-server@latest"],
      "env": { "MCP_TRANSPORT_TYPE": "stdio", "MCP_LOG_LEVEL": "info" }
    }
  }
}

Swap command/args for npx -y @cyanheads/brapi-mcp-server@latest (no Bun) or docker run -i --rm -e MCP_TRANSPORT_TYPE=stdio ghcr.io/cyanheads/brapi-mcp-server:latest.

For Streamable HTTP:

MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp

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.

Prerequisites: Bun v1.3.11+ or Node.js v24+. @duckdb/node-api is a required dependency — supported on Linux/macOS/Windows × x64 plus Linux/macOS arm64 (no Windows arm64; no Cloudflare Workers).


Configuration

Every variable is optional.

Переменная

Описание

По умолчанию

BRAPI_DEFAULT_BASE_URL

Базовый URL BrAPI v2 по умолчанию (например, https://test-server.brapi.org/brapi/v2).

BRAPI_DEFAULT_USERNAME / _PASSWORD

SGN-аутентификация по session-token для подключения по умолчанию.

BRAPI_DEFAULT_OAUTH_CLIENT_ID / _OAUTH_CLIENT_SECRET

OAuth2 client-credentials для подключения по умолчанию.

BRAPI_DEFAULT_API_KEY / _API_KEY_HEADER

Статический API-ключ для подключения по умолчанию.

заголовок Authorization

BRAPI_BUILTIN_ALIASES_DISABLED

Разделённые запятыми имена алиасов (без учёта регистра) для удаления из встроенного реестра.

BRAPI_LOAD_LIMIT

Максимальное число строк в контексте, возвращаемое инструментами find_* до сброса в dataframe канваса.

1000

BRAPI_PAGE_SIZE

Внешний pageSize, используемый при обходах переполнения канваса (отвязан от BRAPI_LOAD_LIMIT). Потолок dataframe = pageSize × 50.

1000

BRAPI_MAX_CONCURRENT_REQUESTS

Предел одновременных запросов на подключение.

4

BRAPI_RETRY_MAX_ATTEMPTS / BRAPI_RETRY_BASE_DELAY_MS

Политика повторов для кодов 429/5xx с экспоненциальной задержкой.

3 / 500

BRAPI_REQUEST_TIMEOUT_MS

Тайм-аут HTTP на запрос.

30000

BRAPI_COMPANION_TIMEOUT_MS

Более жёсткий тайм-аут для некритичных сопутствующих обогащений (FK-запросы, проверки количества). Сопутствующие запросы также не учитываются в бюджете повторов, поэтому медленный внешний сервер проявляется как предупреждение, а не растягивает ответ.

8000

BRAPI_SEARCH_POLL_TIMEOUT_MS / _INTERVAL_MS

Бюджет опроса асинхронного /search и интервал.

60000 / 1000

BRAPI_DATASET_TTL_SECONDS

TTL для метаданных происхождения dataframe, сохраняемых вместе со сброшенными строками.

86400

BRAPI_REFERENCE_CACHE_TTL_SECONDS

TTL для кэша программ / испытаний / местоположений / культур.

3600

BRAPI_ALLOW_PRIVATE_IPS

Разрешить цели RFC 1918 / loopback. Только для разработки.

false

BRAPI_ENABLE_WRITES

Opt-in для регистрации brapi_submit_observations.

false

BRAPI_GENOTYPE_CALLS_MAX_PULL

Верхний предел строк от внешнего сервера на один вызов brapi_find_genotype_calls. Максимум 500 000.

100000

BRAPI_GENOTYPE_MATRIX_MAX_COLUMNS

Верхний предел числа столбцов уникальных вариантов для матрицы brapi_export_genotype_matrix — ограничивает широкий dataframe, variantColumnLegend и любой текст VCF/PLINK (всё масштабируется с числом столбцов, независимо от количества извлекаемых строк). Входной параметр maxColumns может только понизить его, но не повысить. Максимум 500 000.

10000

BRAPI_CANVAS_DROP_ENABLED

Opt-in для регистрации brapi_dataframe_drop. По умолчанию выключено; dataframes, оставленные без управления, истекают по TTL.

false

BRAPI_EXPORT_DIR

Каталог для выходных файлов brapi_dataframe_export. Указание пути является opt-in (отдельного флага включения нет); если путь не задан, инструмент отсутствует в tools/list. Только stdio — при HTTP-транспорте инструмент остаётся отключённым независимо от этого значения. Автоматически пробрасывается в CANVAS_EXPORT_PATH фреймворка.

BRAPI_CANVAS_MAX_ROWS / BRAPI_CANVAS_QUERY_TIMEOUT_MS

Максимальное число строк ответа на запрос и тайм-аут по реальному времени для brapi_dataframe_query.

10000 / 30000

MCP_TRANSPORT_TYPE / MCP_HTTP_PORT / MCP_SESSION_MODE

Транспорт (stdio | http), HTTP-порт, режим сессии (stateful | stateless | auto; auto разрешается в stateful для HTTP).

stdio / 3010 / stateful

MCP_AUTH_MODE / MCP_LOG_LEVEL / STORAGE_PROVIDER_TYPE / OTEL_ENABLED

Режим аутентификации (none | jwt | oauth), уровень логирования, бэкенд хранилища, OpenTelemetry.

none / info / in-memory / false

BRAPI_SESSION_ISOLATION

Если true, состояние подключений ServerRegistry и канвас по умолчанию CanvasBridge ограничиваются ctx.sessionId (HTTP stateful/auto). Параллельные вызывающие при MCP_AUTH_MODE=none работают в изолированных рабочих областях. Установите false для модели совместной работы в общей рабочей области. На stdio не влияет.

true

Переопределения для отдельных алиасов следуют шаблону BRAPI_<ALIAS>_* — см. .env.example для всех переопределений и встроенных комментариев.

Учётные данные для отдельных алиасов

brapi_connect берёт baseUrl и auth из переменных окружения, когда агент их не указывает, — учётные данные никогда не попадают в контекст LLM. Четыре уровня приоритета:

  1. Явный ввод агента — всегда имеет приоритет.

  2. Переменные окружения для отдельных алиасовBRAPI_<ALIAS>_* (в верхнем регистре, дефисы → подчёркивания: my-serverBRAPI_MY_SERVER_*).

  3. Встроенный реестр известных серверов — см. Встроенные алиасы.

  4. Переменные окружения по умолчаниюBRAPI_DEFAULT_*, только когда алиас отличается от default. Не наслаиваются поверх встроенного URL — значения по умолчанию относятся к серверу по умолчанию.

Каждый алиас несёт одно семейство учётных данных — режим аутентификации определяется тем, какие поля заданы:

Установленные переменные

Итоговый mode

_USERNAME + _PASSWORD

sgn (обмен через Breedbase /token)

_BEARER_TOKEN

bearer

_API_KEY (+ опционально _API_KEY_HEADER)

api_key

_OAUTH_CLIENT_ID + _OAUTH_CLIENT_SECRET (+ опционально _OAUTH_TOKEN_URL)

oauth2

(ничего не задано)

none

Смешение семейств в рамках одного алиаса вызывает ValidationError.

# .env — attach write credentials to the built-in 'bti-cassava' alias
BRAPI_BTI_CASSAVA_USERNAME=alice
BRAPI_BTI_CASSAVA_PASSWORD=...
# (BASE_URL omitted — built-in registry covers it)

# Static API key as alias 'prod'
BRAPI_PROD_BASE_URL=https://my-brapi.example.com/brapi/v2
BRAPI_PROD_API_KEY=...
BRAPI_PROD_API_KEY_HEADER=X-API-Key

Затем агент вызывает brapi_connect({ alias: 'bti-cassava' }) — без baseUrl, без auth, без секретов в промпте.

Встроенные алиасы

Сервер поставляется с курируемым реестром публичных BrAPI v2 эндпоинтов. Каждый из них работает из коробки; ориентационная оболочка выводит лицензию, цитирование и домашнюю страницу в своём блоке attribution под лицензией Creative Commons Attribution.

Алиас

Апстрим

Хостинг

Культура

Примечания

bti-cassava

cassavabase.org

Boyce Thompson Institute

Маниок

NextGen Cassava

bti-sweetpotato

sweetpotatobase.org

Boyce Thompson Institute

Батат

bti-breedbase-demo

breedbase.org

Boyce Thompson Institute

Демо

Только пример данных — онбординг и тесты.

t3-wheat

wheat.triticeaetoolbox.org

Triticeae Toolbox (T3)

Пшеница

Wheat CAP / IWYP.

t3-oat

oat.triticeaetoolbox.org

Triticeae Toolbox (T3)

Овёс

Global Oat Genetics Database.

t3-barley

barley.triticeaetoolbox.org

Triticeae Toolbox (T3)

Ячмень

T-CAP / US Wheat & Barley Scab Initiative.

Установите BRAPI_<ALIAS>_BASE_URL, чтобы перенаправить на staging-зеркало или форк (переменные окружения имеют приоритет над встроенным URL — дефисы в алиасе становятся подчёркиваниями в переменной окружения, так что t3-wheatBRAPI_T3_WHEAT_BASE_URL). Установите BRAPI_<ALIAS>_USERNAME и т.д., чтобы добавить учётные данные поверх встроенного URL — у каждого экземпляра Breedbase своя таблица пользователей, поэтому для доступа на запись требуется отдельная регистрация в каждом апстриме. Используйте BRAPI_BUILTIN_ALIASES_DISABLED=bti-cassava,t3-wheat, чтобы удалить конкретные записи.

Цитирование: все шесть встроенных алиасов ссылаются на Morales et al. 2022, "Breedbase: a digital ecosystem for modern plant breeding." G3 12(7): jkac078. doi:10.1093/g3journal/jkac078.


Запуск сервера

# Hot-reload dev (Bun runs TS directly)
bun --watch src/index.ts

# Production
bun run rebuild
bun run start            # transport via MCP_TRANSPORT_TYPE (stdio default)
bun run start:stdio      # or pin explicitly
bun run start:http

# Checks
bun run devcheck         # lint + format + typecheck + security + changelog sync
bun run test             # Vitest
bun run lint:mcp         # validate MCP definitions

Docker

docker build -t brapi-mcp-server .
docker run --rm -p 3010:3010 brapi-mcp-server

По умолчанию используется HTTP-транспорт, режим сессий с сохранением состояния (задействует жизненный цикл mcp-session-id — обязательное условие для BRAPI_SESSION_ISOLATION=true; защита от перехвата требует добавления MCP_AUTH_MODE=jwt|oauth поверх), логи пишутся в /var/log/brapi-mcp-server. OTel peer-зависимости устанавливаются по умолчанию — --build-arg OTEL_ENABLED=false, чтобы исключить их.

Формы развёртывания

brapi-mcp-server работает в трёх формах — выберите ту, которая соответствует вашему домену доверия. Отличие заключается в том, что изолирует состояние соединений (зарегистрированные алиасы, кэшированные токены апстрима) и датафреймы: ничего, MCP-сессия или тенант аутентификации.

Форма

Настройки

Изоляция

Для чего подходит

На сессию (по умолчанию)

MCP_AUTH_MODE=none + HTTP с сохранением состояния + BRAPI_SESSION_ISOLATION=true

Каждая MCP-сессия выделяет собственное состояние соединений и собственную рабочую область. Параллельные HTTP-вызывающие не видят алиасы, обменянные токены или строки df_<uuid> друг друга.

Многопользовательский хост без SSO. По умолчанию для институционального / публичного развёртывания при аутентификации с общей доверенностью.

Учётные данные на пользователя

MCP_AUTH_MODE=jwt или oauth (+ HTTP с сохранением состояния)

JWT-утверждение tid каждого пользователя выделяет тенант. При включённой изоляции сессии дополнительно ограничиваются внутри каждого тенанта. Пересечение между пользователями невозможно на уровне фреймворка.

Многопользовательский хост с институциональным SSO (Shibboleth, Okta и т.д.) — максимальное разделение.

Общее рабочее пространство

MCP_AUTH_MODE=none + BRAPI_SESSION_ISOLATION=false

Все вызывающие в одном тенанте разделяют состояние соединений и одну рабочую область. Обладание именем df_<uuid> = полный доступ на чтение/запись во всём рабочем пространстве.

Соло, лаборатория или хостинг, где каждый вызывающий — один исследователь, запускающий параллельных агентов с общими учётными данными апстрима.

Руководство по выбору формы:

  • Многопользовательский публичный/институциональный HTTP без SSO. Используйте вариант по умолчанию — на сессию. Stateful HTTP-сессия каждого исследователя изолирована, даже если все они разрешаются в tenantId='default'.

  • Многопользовательский режим с институциональным SSO. MCP_AUTH_MODE=jwt (HS256, MCP_AUTH_SECRET_KEY) или oauth (JWKS, OAUTH_ISSUER_URL + OAUTH_AUDIENCE). JWT-утверждение tid каждого пользователя выделяет тенант — внешнюю область. BRAPI_SESSION_ISOLATION=true (по умолчанию) затем дополнительно ограничивает сессии внутри каждого тенанта для пользователей, запускающих параллельные сессии, а привязка идентичности JWT/OAuth даёт настоящую защиту от перехвата сессий поверх.

  • Один исследователь, параллельные агенты. Если несколько агентов (планировщик, аналитик, оформитель) подключаются как отдельные MCP-клиенты, но должны использовать одно рабочее пространство, установите BRAPI_SESSION_ISOLATION=false и полагайтесь на общую доверенность. Это и есть форма общего рабочего пространства.

  • Stdio. Всегда одна сессия; изоляция не имеет значения. Флаг не влияет.

  • Клиенты на MCP-ревизии 2026-07-28. По протоколу они не используют сессии, поэтому попадают в общее рабочее пространство тенанта независимо от значения BRAPI_SESSION_ISOLATION. Изолировать их может только форма с учётными данными на пользователя.

Подстраховка при общей доверенности. Даже с BRAPI_SESSION_ISOLATION=false brapi_dataframe_describe требует явное имя dataframe на HTTP (без перечисления всех), а brapi_dataframe_query отклоняет чтение системных каталогов (information_schema, pg_catalog, sqlite_master, duckdb_*). Имя датафрейма — это токен возможности; обладание им доказывает право.


Разработка

Полные архитектурные правила см. в CLAUDE.md. Краткая версия:

  • Обработчики выбрасывают исключения, фреймворк перехватывает их — никаких try/catch в логике инструментов

  • Используйте ctx.log для логирования и ctx.state для хранения — никакого console, никакого прямого сохранения

  • Регистрируйте новые инструменты в массиве tools в createApp() в src/index.ts

  • Оборачивайте вызовы апстрима: проверяйте сырые данные → нормализуйте → возвращайте выходную схему; никогда не выдумывайте отсутствующие поля

git clone https://github.com/cyanheads/brapi-mcp-server.git
cd brapi-mcp-server
bun install
cp .env.example .env       # edit if you need credentials
bun run devcheck && bun run test

PR приветствуются.


Лицензия

Apache-2.0 — см. LICENSE.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityMaintained
ResponsivenessWithin a week

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    C
    maintenance
    A local-first MCP server providing secure workspace file operations, offline full-text search, and web search/fetch capabilities without requiring API keys.
    10
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for querying the GWAS Catalog (EBI/NHGRI), a curated catalog of genome-wide association studies. It enables AI agents to search and retrieve study data via natural language or direct tool calls.
    7
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cyanheads/brapi-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server