cyanheads avatar

Brapi Mcp Server

cyanheads/brapi-mcp-server

A BrAPI v2.1 client that turns Claude into a breeding database workbench. Point it at Breedbase, T3, or any compliant server and you get 25 tools spanning germplasm search, study retrieval, pedigree walking, observation queries, and genotype calls. The find tools spill paginated results into DuckDB-backed dataframes you can SQL over, build phenotype matrices from, or export as CSV/Parquet. It handles async search polling, caches server capabilities on connect, and gives you both curated endpoints and raw passthrough for anything outside the standard set. Writes are opt-in and additive only. Useful if you're doing cross-trial analysis, pedigree tracing, or need to pull breeding data into an agent workflow without writing custom glue code for each platform.

GitHub stars
4
tools
22
transport
STDIO, HTTP
env vars
9
last updated
Nov 11, 2026

Install

From registry metadata
$ npx add-mcp https://brapi.caseyjhand.com/mcp --name brapi

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http brapi https://brapi.caseyjhand.com/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 22 tools

Verified live against the running server on Nov 6, 2026.

brapi_connectOpen a connection to a BrAPI v2 server, authenticate, and return the full orientation envelope (server identity, capability profile, content summary, suggested next tools). Other BrAPI tools connect an alias the server has a URL configured for (a built-in or operator-configure...3 params

Open a connection to a BrAPI v2 server, authenticate, and return the full orientation envelope (server identity, capability profile, content summary, suggested next tools). Other BrAPI tools connect an alias the server has a URL configured for (a built-in or operator-configure...

Parameters* required
aliasstring
Alias for this connection. Use distinct aliases to register multiple BrAPI servers in one session.default: default
authvalue
Auth payload. Omit to use credentials configured server-side for this alias (or no auth when none are configured).
baseUrlstring
BrAPI v2 base URL (absolute URL) including any path prefix — e.g. https://test-server.brapi.org/brapi/v2. Omit to use the configured default for this alias.
brapi_build_phenotype_matrixPull observations across one or more studies and pivot them into a germplasm × trait matrix materialized as a canvas dataframe. Returns a dataframe handle (read it with brapi_dataframe_describe and brapi_dataframe_query) plus a summary of dimensions and aggregate method. Long-...8 params

Pull observations across one or more studies and pivot them into a germplasm × trait matrix materialized as a canvas dataframe. Returns a dataframe handle (read it with brapi_dataframe_describe and brapi_dataframe_query) plus a summary of dimensions and aggregate method. Long-...

Parameters* required
aggregatestring
How to aggregate replicate observations (multiple readings of the same variable on the same germplasm). `mean` and `median` attempt numeric conversion and skip non-numeric values (e.g. categorical...one of mean · median · first · alldefault: mean
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
extraFiltersobject
Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
germplasmarray
Optional subset of germplasmDbIds to include. Omit to include all germplasm found in the queried studies.
loadLimitinteger
Cap on matching observations collected per study. Omit for the deployment default. A study that stops at it is reported as truncated.
shapestring
Matrix shape. `wide` — one row per germplasm, one column per variable, cell = aggregated value. `long` — one row per observation with columns: germplasmDbId, observationVariableDbId, studyDbId, val...one of wide · longdefault: wide
studies*array
studyDbIds to include in the matrix. At least one is required — the tool is study-anchored to avoid full-table scans.
variablesarray
Optional subset of observationVariableDbIds to include. Omit to include all variables found in the queried studies.
brapi_server_infoReturn the full orientation envelope for a BrAPI connection — server identity, capabilities, content counts, suggested finders, and notes. Pass forceRefresh to refetch the cached capability scan; pass an alias to read a non-default connection.2 params

Return the full orientation envelope for a BrAPI connection — server identity, capabilities, content counts, suggested finders, and notes. Pass forceRefresh to refetch the cached capability scan; pass an alias to read a non-default connection.

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via `brapi_connect` works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or...
forceRefreshboolean
Bypass the cached capability profile and refetch from the server.default: false
brapi_describe_filtersList the valid filter names for a BrAPI endpoint (studies, germplasm, observations, variables, images, variants, locations) — companion lookup for the `extraFilters` passthrough on any `find_*` tool. Entries reflect the BrAPI v2.1 spec; individual servers may implement subsets.1 params

List the valid filter names for a BrAPI endpoint (studies, germplasm, observations, variables, images, variants, locations) — companion lookup for the `extraFilters` passthrough on any `find_*` tool. Entries reflect the BrAPI v2.1 spec; individual servers may implement subsets.

Parameters* required
endpoint*string
BrAPI endpoint to describe filters for.one of germplasm · images · locations · observations · studies · variables
brapi_find_studiesLocate studies matching crop, trial type, season, location, or program. Enriches results with program/trial/location context in one call. results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when it holds fewer rows than matched, the matched set is mat...11 params

Locate studies matching crop, trial type, season, location, or program. Enriches results with program/trial/location context in one call. results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when it holds fewer rows than matched, the matched set is mat...

Parameters* required
activeboolean
Restrict to active / inactive studies.
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
cropstring
Filter by common crop name (single value).
extraFiltersobject
Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
loadLimitinteger
Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. Wh...
locationsarray
Filter by locationDbIds (server-side identifiers, not display names). On servers that ignore this filter on /studies, it is applied client-side over the scanned studies, and a study with no locatio...
programsarray
Filter by programDbIds.
seasonsarray
Filter by seasons (e.g. "2022").
studyNamesarray
Filter by study display name.
trialTypesarray
Filter by study types.
trialsarray
Filter by trialDbIds.
brapi_get_studyFetch a single study by DbId with its program, trial, and location records resolved where those lookups succeed. Response includes cheap observation/observation-unit/variable counts as drill-down signals.2 params

Fetch a single study by DbId with its program, trial, and location records resolved where those lookups succeed. Response includes cheap observation/observation-unit/variable counts as drill-down signals.

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
studyDbId*string
Study identifier.
brapi_find_germplasmFind germplasm by name, synonym, accession number, PUI, crop, or free-text query. Matches across registered synonyms. results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when it holds fewer rows than matched, the matched set is materialized as a dataf...13 params

Find germplasm by name, synonym, accession number, PUI, crop, or free-text query. Matches across registered synonyms. results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when it holds fewer rows than matched, the matched set is materialized as a dataf...

Parameters* required
accessionNumbersarray
Filter by accession numbers (gene-bank catalog codes).
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
collectionsarray
Filter by germplasm collection names.
cropsarray
Filter by common crop names.
extraFiltersobject
Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
genusstring
Botanical genus.
germplasmDbIdsarray
Filter by DbIds.
germplasmPUIsarray
Persistent unique identifiers.
loadLimitinteger
Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. Wh...
namesarray
Filter by germplasm display names.
speciesstring
Botanical species.
synonymsarray
Match registered synonyms.
textstring
Free-text query. Applied client-side as a case-insensitive substring match on germplasmName, germplasmPUI, accessionNumber, defaultDisplayName, and registered synonyms — no BrAPI server reliably su...
brapi_get_germplasmFetch a single germplasm by DbId with attributes and direct parents. Response companions report study count, direct parent count, and direct descendant count — signals for pedigree depth and observation coverage.2 params

Fetch a single germplasm by DbId with attributes and direct parents. Response companions report study count, direct parent count, and direct descendant count — signals for pedigree depth and observation coverage.

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
germplasmDbId*string
Germplasm identifier.
brapi_walk_pedigreeWalk germplasm ancestry or descendancy as a deduplicated DAG with cycle detection and depth limits. leafCount counts graph terminals, confirmedLeafCount counts successfully verified leaves, and frontier records unresolved directions. Nodes and edges each fit loadLimit and a 24...6 params

Walk germplasm ancestry or descendancy as a deduplicated DAG with cycle detection and depth limits. leafCount counts graph terminals, confirmedLeafCount counts successfully verified leaves, and frontier records unresolved directions. Nodes and edges each fit loadLimit and a 24...

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
diagramstring
Also return the walk as diagram source: `mermaid` (flowchart) or `dot` (Graphviz). Edges point parent → child, roots are bold, loop-closing edges are dashed. Omit for no diagram.one of mermaid · dot
directionstring
Which direction to walk: ancestors (parents), descendants (progeny), or both — the union of the two walks. Ancestors are walked only upward and descendants only downward, so a descendant's other pa...one of ancestors · descendants · bothdefault: ancestors
germplasmDbIds*array
Starting germplasm (1–20 roots). All roots are walked concurrently.
loadLimitinteger
Row ceiling for each inline graph/frontier preview, also bounded by a 24,000-byte budget. Omit for the deployment default. A first row exceeding the byte budget yields zero preview rows; retrieve n...
maxDepthinteger
Max generations to walk per direction (default 3, cap 10).default: 3
brapi_germplasm_performanceAggregate a single germplasm's observations across studies, returning per-variable statistics (n, mean, median, sd, min, max), contributing studies, seasons, and collection coverage. SGN/Breedbase uses advertised germplasm-scoped observation units with embedded measurements, i...4 params

Aggregate a single germplasm's observations across studies, returning per-variable statistics (n, mean, median, sd, min, max), contributing studies, seasons, and collection coverage. SGN/Breedbase uses advertised germplasm-scoped observation units with embedded measurements, i...

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
germplasmDbId*string
The germplasmDbId to summarize performance for.
studyDbIdsarray
Optional studyDbIds to restrict collection to known studies and skip automatic discovery. Omit to walk germplasm-scoped embedded units on SGN/Breedbase, or discover up to 200 studies on other serve...
variablesarray
Optional subset of observationVariableDbIds to aggregate. Omit to include every variable observed for the germplasm.
brapi_find_variablesFind observation variables (traits) by name, trait class, ontology term, or free-text query. Free-text queries are ranked against every fetched row by PUI, name, synonym, and trait text; a candidate carries the ontology PUI of its row as termId when the row has one. results[]...13 params

Find observation variables (traits) by name, trait class, ontology term, or free-text query. Free-text queries are ranked against every fetched row by PUI, name, synonym, and trait text; a candidate carries the ontology PUI of its row as termId when the row has one. results[]...

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
cropstring
Filter by common crop name (single value).
extraFiltersobject
Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
loadLimitinteger
Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. Wh...
methodsarray
Filter by methodDbIds.
ontologiesarray
Filter by ontologyDbIds.
scalesarray
Filter by scaleDbIds.
studiesarray
Filter by studyDbId. Multiple distinct studies are collected under shared page, row and time budgets and unioned by variable ID with studyDbIds provenance; studyCoverage reports incomplete studies.
textstring
Free-text query. Ranks **every row the call fetched** (the whole dataframe walk, not just the first page) via the ontology resolver, then fills results[] — up to loadLimit and the 24,000-byte budge...
traitClassesarray
Filter by trait class.
variableNamesarray
Filter by exact observationVariableNames.
variablePUIsarray
Filter by persistent ontology URIs.
variablesarray
Filter by observationVariableDbIds.
brapi_find_observationsPull observation records filtered by study, germplasm, variable, season, or observation unit. Without a studies, trials, observationUnits, or observations anchor, a GET query first runs a one-row count probe and skips the bulk pull (warnings says so) when the probe fails or re...14 params

Pull observation records filtered by study, germplasm, variable, season, or observation unit. Without a studies, trials, observationUnits, or observations anchor, a GET query first runs a one-row count probe and skips the bulk pull (warnings says so) when the probe fails or re...

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
extraFiltersobject
Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
germplasmarray
Filter by germplasmDbIds.
loadLimitinteger
Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. Wh...
observationLevelsarray
Observation unit level (plot, plant, field, etc.).
observationUnitsarray
Filter by observationUnitDbIds.
observationsarray
Filter by observationDbIds.
programsarray
Filter by programDbIds.
seasonsarray
Filter by seasonDbIds (e.g. "2022").
studiesarray
Filter by studyDbIds.
timestampFromstring
ISO 8601 start of the observation-time window.
timestampTostring
ISO 8601 end of the observation-time window.
trialsarray
Filter by trialDbIds.
variablesarray
Filter by observationVariableDbIds.
brapi_find_imagesFilter images by observation unit, observation, study, descriptive ontology term, file name, or MIME type. Returns metadata only — use brapi_get_image to fetch bytes inline. results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when it holds fewer rows...10 params

Filter images by observation unit, observation, study, descriptive ontology term, file name, or MIME type. Returns metadata only — use brapi_get_image to fetch bytes inline. results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when it holds fewer rows...

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
descriptiveOntologyTermsarray
Filter by ontology tags (e.g. "CO_334:plot").
extraFiltersobject
Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
imageFileNamesarray
Filter by uploaded file name.
imagesarray
Filter by imageDbIds.
loadLimitinteger
Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. Wh...
mimeTypesarray
Filter by MIME type — e.g. "image/jpeg", "image/png".
observationUnitsarray
Filter by observationUnitDbIds.
observationsarray
Filter by observationDbIds.
studiesarray
Filter by studyDbIds.
brapi_get_imageFetch image bytes for up to 5 imageDbIds and return them inline as `type: image` content blocks. Falls back to the metadata `imageURL` when the server lacks dedicated image-content delivery or that request fails. No filesystem side-effects.2 params

Fetch image bytes for up to 5 imageDbIds and return them inline as `type: image` content blocks. Falls back to the metadata `imageURL` when the server lacks dedicated image-content delivery or that request fails. No filesystem side-effects.

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
imageDbIds*array
1–5 image identifiers.
brapi_find_locationsFind research stations / field sites by country, abbreviation, type, location ID, or free-text. Countries filter by ISO 3166-1 alpha-3 code via countryCodes, or by free-form English country name via countryNames (resolved client-side to alpha-3 — "Uganda" → "UGA"). Optional bb...10 params

Find research stations / field sites by country, abbreviation, type, location ID, or free-text. Countries filter by ISO 3166-1 alpha-3 code via countryCodes, or by free-form English country name via countryNames (resolved client-side to alpha-3 — "Uganda" → "UGA"). Optional bb...

Parameters* required
abbreviationsarray
Short location abbreviations.
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
bboxobject
Optional post-fetch bounding box. Nonempty boxes require all four bounds with minimum <= maximum; malformed boxes fail. An empty object is omitted.
countryCodesarray
Country codes; alphabetic codes are uppercased, numeric upstream codes are preserved.
countryNamesarray
English country names or aliases (e.g. "Uganda", "United States", "USA") resolved to alpha-3 codes and merged into countryCodes. Unresolved names warn when another effective country restriction rem...
extraFiltersobject
Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
loadLimitinteger
Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. Wh...
locationNamesarray
Filter by display name.
locationTypesarray
Location type — e.g. "Research Station", "Field".
locationsarray
Filter by locationDbIds.
brapi_find_variantsFind variant records by variant set, reference sequence, or genomic region (start/end, 0-based inclusive / exclusive per the BrAPI spec; servers may differ). results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when it holds fewer rows than matched, th...9 params

Find variant records by variant set, reference sequence, or genomic region (start/end, 0-based inclusive / exclusive per the BrAPI spec; servers may differ). results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when it holds fewer rows than matched, th...

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
endinteger
Window end, 0-based exclusive.
extraFiltersobject
Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
loadLimitinteger
Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. Wh...
referenceNamestring
Reference display name (e.g. "chr01", "chr1").
referencesarray
Filter by referenceDbIds.
startinteger
Window start, 0-based inclusive.
variantSetsarray
Filter by variantSetDbIds.
variantsarray
Filter by variantDbIds.
brapi_find_genotype_callsPull genotype calls for a germplasm × variant set. Filter to bound cost — at minimum, set `variantSetDbId` or `germplasmDbIds`. The upstream pull is capped by deployment policy; when the pull is truncated, narrow the filters. results[] holds the leading calls up to `loadLimit`...8 params

Pull genotype calls for a germplasm × variant set. Filter to bound cost — at minimum, set `variantSetDbId` or `germplasmDbIds`. The upstream pull is capped by deployment policy; when the pull is truncated, narrow the filters. results[] holds the leading calls up to `loadLimit`...

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
callFormatstring
Requested call-encoding format, when the server honors it.one of VCF · FLAPJACK · DARTSEQ · JSON
callSetDbIdsarray
Restrict to these call sets directly.
germplasmDbIdsarray
Restrict to these germplasm (call sets).
loadLimitinteger
Cap on rows returned inline. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any call was collected. When...
variantDbIdsarray
Restrict to specific variants.
variantSetDbIdstring
Scope calls to a single variant set. Strongly recommended. List variant sets with brapi_raw_get({ path: "/variantsets" }) — add params.studyDbId to narrow to one study or genotyping project — and r...
variantSetDbIdsarray
Alternative: multiple variant sets at once, found the same way.
brapi_export_genotype_matrixPull genotype calls for a germplasm × variant set and pivot them into a matrix. `matrix-json` registers a wide canvas dataframe; `vcf-lite` adds VCF-subset text in `vcf`; `plink` adds .ped/.map text in `ped`/`map`. Text formats pull /variants metadata and convert zero-based Br...6 params

Pull genotype calls for a germplasm × variant set and pivot them into a matrix. `matrix-json` registers a wide canvas dataframe; `vcf-lite` adds VCF-subset text in `vcf`; `plink` adds .ped/.map text in `ped`/`map`. Text formats pull /variants metadata and convert zero-based Br...

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
format*string
Output format. `matrix-json` registers a wide canvas dataframe only. `vcf-lite` returns VCF-subset text and registers the dataframe. `plink` returns .ped/.map text and registers the dataframe.one of plink · vcf-lite · matrix-json
germplasmDbIdsarray
Restrict to these germplasm. Omit to pull all germplasm in the variant set (use with caution on large sets).
maxCallsinteger
Lower the pull cap for this call. Omit to use the deployment ceiling. Cannot raise it: a value above the deployment ceiling is clamped down to it and the effective cap is reported in `warnings`.
maxColumnsinteger
Lower the distinct-variant column cap for this call. Omit to use the deployment ceiling. Cannot raise it: a value above the deployment ceiling is clamped down to it. When the variant set resolves m...
variantSetDbId*string
Variant set to pull calls for. Required. List variant sets with brapi_raw_get({ path: "/variantsets" }) — add params.studyDbId to narrow to one study or genotyping project — and read variantSetDbId...
brapi_dataframe_describeStart here after a spillover. Lists dataframes (or describes one) with columns, row counts, and originating-source provenance. The dataframe name appears inline on every find_* response that spilled (`result.dataframe.tableName`) — pass it as `dataframe` to inspect schema and...1 params

Start here after a spillover. Lists dataframes (or describes one) with columns, row counts, and originating-source provenance. The dataframe name appears inline on every find_* response that spilled (`result.dataframe.tableName`) — pass it as `dataframe` to inspect schema and...

Parameters* required
dataframestring
When set, return only the named dataframe. Omit to list all dataframes.
brapi_dataframe_queryRun SQL across in-memory dataframes. Dataframes auto-populate when find_* tools spill (named `df_<uuid>`) — the dataframe name appears inline on every find_* response that spilled (`result.dataframe.tableName`), so the typical flow is find_* → read the name → query here. Use b...4 params

Run SQL across in-memory dataframes. Dataframes auto-populate when find_* tools spill (named `df_<uuid>`) — the dataframe name appears inline on every find_* response that spilled (`result.dataframe.tableName`), so the typical flow is find_* → read the name → query here. Use b...

Parameters* required
previewinteger
Cap the number of rows returned in this response. A value above `rowLimit` (or, when `rowLimit` is omitted, above the deployment-wide response cap) returns rows up to that ceiling. When omitted, th...
registerAsstring
Persist the full result as a new dataframe under this name. The response is bounded by preview and a 24,000-byte row budget. Conflicts fail — choose a different name, or remove the existing datafra...
rowLimitinteger
Hard cap on rows materialized into the response, bounded by the deployment-wide response cap. For larger result sets, use `registerAs` to keep the full result queryable instead of raising this.
sql*string
SELECT statement against dataframes. Single statement only — writes, DDL, DESCRIBE / SUMMARIZE, file reads, and exports are rejected. Use brapi_dataframe_describe to discover available dataframes....
brapi_raw_getPassthrough to BrAPI GET /{path} without foreign-key resolution. List results (result array or result.data) return a leading preview within loadLimit and a 24,000-byte budget on each serialized row representation; an oversized first row returns no inline rows. Omitted fetched...4 params

Passthrough to BrAPI GET /{path} without foreign-key resolution. List results (result array or result.data) return a leading preview within loadLimit and a 24,000-byte budget on each serialized row representation; an oversized first row returns no inline rows. Omitted fetched...

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
loadLimitinteger
Cap on rows returned inline. Omit for the deployment default. Rows beyond the cap land in a dataframe; query with brapi_dataframe_query (SQL) instead of paging row-by-row.
paramsobject
Query parameters to append. Arrays are repeated per BrAPI convention.
path*string
Endpoint path — e.g. "/samples", "/methods". Leading "/" is optional.
brapi_raw_searchPassthrough to BrAPI POST /search/{noun}, polling async search IDs. Sends loadLimit as the initial pageSize unless body.page/pageSize drives explicit paging. List previews fit loadLimit and a 24,000-byte budget on each serialized row representation; an oversized first row retu...4 params

Passthrough to BrAPI POST /search/{noun}, polling async search IDs. Sends loadLimit as the initial pageSize unless body.page/pageSize drives explicit paging. List previews fit loadLimit and a 24,000-byte budget on each serialized row representation; an oversized first row retu...

Parameters* required
aliasstring
Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `...
body*object
Filter body passed verbatim to POST /search/{noun}.
loadLimitinteger
Cap on rows returned inline. Omit for the deployment default. Rows beyond the cap land in a dataframe; query with brapi_dataframe_query (SQL) instead of paging row-by-row.
noun*string
Search noun — e.g. "observations", "calls", "germplasm".

Sponsors

Configuration

BRAPI_DEFAULT_BASE_URL

Default BrAPI v2 base URL. Optional — connections can be opened at runtime via the brapi_connect tool instead.

BRAPI_ENABLE_WRITESdefault: false

Opt-in flag for the write surface (brapi_submit_observations). Off by default — the tool is omitted from tools/list unless the operator opts in.

BRAPI_PAGE_SIZEdefault: 1000

Upstream pageSize used during canvas spillover walks (decoupled from BRAPI_LOAD_LIMIT). Dataframe ceiling = pageSize × 50 pages, capped at 50,000 rows.

MCP_LOG_LEVELdefault: info

Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

MCP_TRANSPORT_TYPEdefault: http

Selects the HTTP transport.

MCP_HTTP_HOSTdefault: 127.0.0.1

The hostname for the HTTP server.

MCP_HTTP_PORTdefault: 3010

The port to run the HTTP server on.

MCP_HTTP_ENDPOINT_PATHdefault: /mcp

The endpoint path for the MCP server.

MCP_AUTH_MODEdefault: none

Authentication mode to use: 'none', 'jwt', or 'oauth'.

Readme

@cyanheads/brapi-mcp-server

A collaborative BrAPI v2.1 workspace for multi-agent research via MCP. Search studies, germplasm, genotypes, and more across Breedbase, T3, Sweetpotatobase, and any BrAPI v2-compliant server.

25 Tools • 6 Resources • 2 Prompts

Details

Repository
github.com/cyanheads/brapi-mcp-server
Package
@cyanheads/brapi-mcp-server
Transport
STDIO, HTTP
Registry
MCP registry, active
Resources
9
Prompts
2
Tools verified
Nov 6, 2026

More from cyanheads