Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.cyanheads/brapi-mcp-server

REMOTE · BRAPI.CASEYJHAND.COM · 2 COMPONENTS · SCANNED SEP 20

Collaborative BrAPI v2.1 MCP workspace — studies, germplasm, genotypes across Breedbase, T3, more.

69 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security66
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • Authorisation not fully verified: no authorisation is required to call this server, and 22 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
Schema Quality & AI Usability80
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 6909 tokens (~222/item across 31 items; 22 tools + 9 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management3
  • Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 22 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 24 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the io.github.cyanheads/brapi-mcp-server server?

io.github.cyanheads/brapi-mcp-server is a hosted endpoint at https://brapi.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · brapi.caseyjhand.com

# add to Claude Code
claude mcp add --transport http cyanheads-brapi-mcp-server 'https://brapi.caseyjhand.com/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "cyanheads-brapi-mcp-server": {
      "url": "https://brapi.caseyjhand.com/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "cyanheads-brapi-mcp-server": {
      "type": "http",
      "url": "https://brapi.caseyjhand.com/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.cyanheads-brapi-mcp-server]
url = "https://brapi.caseyjhand.com/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-brapi-mcp-server": {
      "type": "remote",
      "url": "https://brapi.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add cyanheads-brapi-mcp-server --url 'https://brapi.caseyjhand.com/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  cyanheads-brapi-mcp-server:
    url: "https://brapi.caseyjhand.com/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "cyanheads-brapi-mcp-server": {
      "Transport": "http",
      "Url": "https://brapi.caseyjhand.com/mcp"
    }
  }
}
# add to Vellum
assistant mcp add cyanheads-brapi-mcp-server -t streamable-http -u 'https://brapi.caseyjhand.com/mcp'
// mcp.json
{
  "mcpServers": {
    "cyanheads-brapi-mcp-server": {
      "type": "http",
      "url": "https://brapi.caseyjhand.com/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 0
    • Stability: unverified → 0.03 functional
  • 19 Sept 26 69

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Probed https://brapi.caseyjhand.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=caseyjhand.com CN=WE1,O=Google Trust Services,C=US 4 Sept 2026 3 Dec 2026 ECDSA 256 ECDSA-SHA256 a6985204ed51ae050e7738aa6be668e9
SANs: caseyjhand.com, *.caseyjhand.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of brapi.caseyjhand.com. Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
caseyjhand.com. present 2371 13 Verified
brapi.caseyjhand.com. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000; includeSubDomains; preload
x-content-type-options nosniff

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://brapi.caseyjhand.com/mcp Verified 200
http (plaintext) http://brapi.caseyjhand.com/mcp HTTPS enforced 301 https://brapi.caseyjhand.com/mcp
MCP tools · 22 exposed · ~6,499 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
brapi_build_phenotype_matrix ~490

Pull observations across one or more studies and pivot them into a germplasm × trait matrix materialized as a canvas dataframe. Returns a dataframe handle (query with brapi_dataframe_query) plus a summary of dimensions and aggregate method. Long-form output is suitable for downstream GROUP BY analysis by study, germplasm, or variable.

NameTypeReqDescription
aggregatestringHow 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 tr…
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
extraFiltersobjectExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
germplasmarrayOptional subset of germplasmDbIds to include. Omit to include all germplasm found in the queried studies.
loadLimitintegerCap 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.
shapestringMatrix shape. `wide` — one row per germplasm, one column per variable, cell = aggregated value. `long` — one row per observation with columns: germplasmDbId, observationVariableDbId, studyDbId, value…
studiesarrayyesstudyDbIds to include in the matrix. At least one is required — the tool is study-anchored to avoid full-table scans.
variablesarrayOptional subset of observationVariableDbIds to include. Omit to include all variables found in the queried studies.
NameTypeReqDescription
aggregatestringAggregation applied to replicate observations (wide shape only). `all` keeps one row per replicate.
aliasstringAlias of the registered BrAPI connection the call used.
capintegerPer-study observation cap that was applied.
dataframeobjectCanvas dataframe handle for the materialized matrix. Omitted when no observations were found. Query with brapi_dataframe_query (SQL). Long-form columns: germplasmDbId, observationVariableDbId, studyD…
errorobjectPresent when the call failed. Absent on success.
germplasmCountintegerNumber of distinct germplasm in the matrix.
noticestringGuidance for reaching the observations this call left out.
observationCountintegerTotal raw observations collected before pivoting.
shapestringMatrix shape — wide (one row per germplasm, one column per variable) or long (one row per observation).
shownintegerObservations collected across all studies after filtering.
studiesarraystudyDbIds that were queried to build the matrix.
truncatedbooleanTrue when at least one study saturated the per-study loadLimit.
variableCountintegerNumber of distinct observation variables in the matrix.
variableLegendobjectMapping of safe column identifier → observationVariableName. Wide-matrix column names are SQL-safe identifiers derived from observationVariableDbId (sanitized for DuckDB); consult this map to resolve…
warningsarrayAdvisory messages (empty studies, non-numeric aggregation skips, fallback paths).

No examples provided.

brapi_connect ~281

Open a connection to a BrAPI v2 server, authenticate, and return the full orientation envelope (server identity, capability profile, content summary). Required handshake before other BrAPI tools. Supports multiple concurrent connections via named aliases. Credentials can be configured server-side and omitted from this call. Built-in known servers (callable with no `baseUrl` or `auth` — public BrAPI v2 endpoints): `bti-breedbase-demo`, `bti-cassava`, `bti-sweetpotato`, `t3-barley`, `t3-oat`, `t3-wheat`. Operator-configured aliases on this deployment (credentials and/or baseUrl read from server env vars): `default`, `cassava`. Aliases are shortcuts only; any other BrAPI v2 server is reachable by passing `baseUrl` directly.

NameTypeReqDescription
aliasstringAlias for this connection. Use distinct aliases to register multiple BrAPI servers in one session.
authAuth payload. Omit to use credentials configured server-side for this alias (or no auth when none are configured).
baseUrlstringBrAPI 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.
NameTypeReqDescription
aliasstringConnection alias.
attributionobjectAttribution metadata for built-in known-server connections. Absent for custom (env-only) connections.
authobjectAuth summary for the active connection.
baseUrlstringBrAPI v2 base URL for this connection.
capabilitiesobjectCapability profile derived from /serverinfo.
contentobjectContent summary (crops + optional totals).
dialectobjectActive dialect adapter — translates outbound filters and declares known-dead routes for this server.
errorobjectPresent when the call failed. Absent on success.
fetchedAtstringISO 8601 timestamp of when this envelope was composed.
notesarrayServer-specific quirks or degradation notes.
serverobjectNormalized server identity block.

No examples provided.

brapi_dataframe_describe ~128

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 provenance before writing the first brapi_dataframe_query. Listing without a name is unavailable when this server runs as a shared HTTP endpoint without per-caller auth; pass a known name instead.

NameTypeReqDescription
dataframestringWhen set, return only the named dataframe. Omit to list all dataframes.
NameTypeReqDescription
errorobjectPresent when the call failed. Absent on success.
tablesarrayAll described dataframes.

No examples provided.

brapi_dataframe_query ~414

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 brapi_dataframe_describe to inspect schema and provenance for a known name. SELECT only — writes/DDL/COPY/PRAGMA/ATTACH/file-reads are rejected. Use SQL as the paging idiom: `LIMIT/OFFSET` to walk results, projection to trim columns, aggregation to summarize. Use `registerAs` to chain — the result lands as a new dataframe.

NameTypeReqDescription
previewintegerCap the number of rows returned in this response (1–1000). When omitted, the deployment-wide response cap applies. Lower this with `registerAs` when you only need a sample to verify the query.
registerAsstringPersist the result as a new dataframe under this name. The response still returns at most `preview` rows; the full result remains queryable as a new dataframe. Conflicts with an existing dataframe na…
rowLimitintegerHard 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.
sqlstringyesSELECT statement against dataframes. Single statement only — writes, DDL, file reads, and exports are rejected. Use brapi_dataframe_describe to discover available dataframes. SQL is the primary pagin…
NameTypeReqDescription
capintegerRow ceiling that bound the response (the smaller of preview and rowLimit).
columnsarrayColumn metadata in projection order — name and SQL type. Use this to write follow-up queries without round-tripping through brapi_dataframe_describe.
dataframestringName of the dataframe holding the full result, populated when `registerAs` was supplied. Reference this name in follow-up queries.
errorobjectPresent when the call failed. Absent on success.
noticestringGuidance for reaching the rows this response left out.
rowCountintegerTotal rows the query produced (may exceed `rows.length` when capped).
rowsarrayMaterialized rows, bounded by preview/rowLimit.
shownintegerRows materialized into `rows`.
truncatedbooleanTrue when the response carries fewer rows than the query produced.

No examples provided.

brapi_describe_filters ~90

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.

NameTypeReqDescription
endpointstringyesBrAPI endpoint to describe filters for.
NameTypeReqDescription
availableEndpointsarrayEvery endpoint this tool can describe — useful for discovery.
endpointstringThe endpoint the filters apply to.
errorobjectPresent when the call failed. Absent on success.
filterCountintegerNumber of filters in the catalog.
filtersarrayFilter catalog entries.
specReferencestringPointer to the BrAPI v2 spec section for this endpoint.

No examples provided.

brapi_export_genotype_matrix ~487

Pull genotype calls for a germplasm × variant set and pivot them into a matrix. `format` controls the output: `matrix-json` registers a wide germplasm × variant canvas dataframe for SQL analysis; `vcf-lite` returns VCF-subset text (in the `vcf` field) and also registers the dataframe; `plink` returns .ped/.map text (in the `ped`/`map` fields) and also registers the dataframe. vcf-lite/plink pull /variants metadata for CHROM/POS/REF/ALT (`.`/`0` when the server lacks them). Column names are SQL-safe identifiers; `variantColumnLegend` maps them back to original variant IDs.

NameTypeReqDescription
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
formatstringyesOutput 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.
germplasmDbIdsarrayRestrict to these germplasm. Omit to pull all germplasm in the variant set (use with caution on large sets).
maxCallsintegerLower the pull cap for this call. Omit to use the deployment ceiling (BRAPI_GENOTYPE_CALLS_MAX_PULL). Cannot raise it: a value above the deployment ceiling is clamped down to it and the effective cap…
maxColumnsintegerLower the distinct-variant column cap for this call. Omit to use the deployment ceiling (BRAPI_GENOTYPE_MATRIX_MAX_COLUMNS). Cannot raise it: a value above the deployment ceiling is clamped down to i…
variantSetDbIdstringyesVariant set to pull calls for. Required.
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection used.
callFormattingobjectGenotype-encoding hints echoed by the server.
columnCountintegerNumber of variant columns in the matrix (excluding the germplasm ID column).
dataframeobjectCanvas dataframe handle for the wide germplasm × variant matrix (registered for every format). Query with brapi_dataframe_query (SQL); export with brapi_dataframe_export. The vcf/ped/map text fields…
errorobjectPresent when the call failed. Absent on success.
formatstringThe output format that was produced.
mapstringPLINK .map text — chromosome, variant-id, genetic-distance (0 placeholder), base-pair position, one row per variant. Present only when format="plink". Chromosome/position come from /variants metadata…
pedstringPLINK .ped text — FID IID PAT MAT SEX PHENO placeholders (all 0) followed by biallelic genotype pairs per variant, one row per sample. Present only when format="plink". Alleles are passed through ver…
rowCountintegerNumber of call-set (germplasm) rows in the matrix.
truncatedbooleanTrue when the matrix is not the complete upstream result — either the call pull hit the row ceiling (BRAPI_GENOTYPE_CALLS_MAX_PULL) or the distinct-variant count hit the column ceiling (BRAPI_GENOTYP…
variantColumnLegendobjectMap of sanitized column name → original variantDbId. Dataframe column names are SQL-safe identifiers; use this legend to correlate them back to the original variant IDs.
vcfstringVCF-lite text — header `#CHROM POS ID REF ALT` plus one genotype column per sample, one row per variant. Present only when format="vcf-lite". CHROM/POS/REF/ALT come from /variants metadata; "." when…
warningsarrayAdvisory messages (truncation, missing fields, etc.).

No examples provided.

brapi_find_genotype_calls ~364

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 or query the spilled dataframe. `loadLimit` bounds the rows returned inline; the full collected set is materialized as a dataframe — query it with brapi_dataframe_query (SQL) instead of paging row-by-row.

NameTypeReqDescription
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
callFormatstringRequested call-encoding format, when the server honors it.
callSetDbIdsarrayRestrict to these call sets directly.
germplasmDbIdsarrayRestrict to these germplasm (call sets).
loadLimitintegerCap on rows returned inline. Omit for the deployment default. When the collected set exceeds this, the full result lands in a dataframe and only the first `loadLimit` rows return inline — query the d…
variantDbIdsarrayRestrict to specific variants.
variantSetDbIdstringScope calls to a single variant set. Strongly recommended.
variantSetDbIdsarrayAlternative: multiple variant sets at once.
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
appliedFiltersobjectThe body sent to POST /search/calls (variant/germplasm/call-set scope plus pageSize).
callFormattingobjectGenotype-encoding hints echoed by the server.
dataframeobjectDataframe handle when the full collected calls exceed loadLimit and were materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
distributionsobjectValue frequency per field across the full collected call set.
errorobjectPresent when the call failed. Absent on success.
hasMorebooleanTrue when the collection was truncated (equivalent to `truncated`).
noticestringGuidance when no calls were returned — how to broaden filters or verify IDs.
resultsarrayCall rows returned in-context (up to loadLimit).
returnedCountintegerLength of results[] — rows returned in-context (up to loadLimit).
totalCountintegerTotal calls collected across all pages (may be capped by the deployment-wide pull limit; check `truncated`).
truncatedbooleanTrue when the deployment-wide pull limit was reached and more calls exist upstream. Narrow the filters and re-pull, or query the spilled dataframe.
warningsarrayAdvisory messages (truncation, capability gaps, partial pulls).

No examples provided.

brapi_find_germplasm ~405

Find germplasm by name, synonym, accession number, PUI, crop, or free-text query. Matches across registered synonyms. When the upstream total exceeds loadLimit, the full result set is materialized as a dataframe — query it with brapi_dataframe_query (SQL) instead of paging row-by-row.

NameTypeReqDescription
accessionNumbersarrayFilter by accession numbers (gene-bank catalog codes).
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
collectionsarrayFilter by germplasm collection names.
cropsarrayFilter by common crop names.
extraFiltersobjectExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
genusstringBotanical genus.
germplasmDbIdsarrayFilter by DbIds.
germplasmPUIsarrayPersistent unique identifiers.
loadLimitintegerCap 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.
namesarrayFilter by germplasm display names.
speciesstringBotanical species.
synonymsarrayMatch registered synonyms.
textstringFree-text query. Applied client-side as a substring match on returned rows (germplasmName, accessionNumber, defaultDisplayName, registered synonyms) — no BrAPI server reliably supports a server-side…
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
appliedFiltersobjectThe final filter map sent to the server (named + extraFilters).
dataframeobjectDataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
distributionsobjectValue frequency per field across the full result set.
errorobjectPresent when the call failed. Absent on success.
hasMorebooleanTrue when more rows exist beyond the returned set.
noticestringGuidance when no rows were returned — how to broaden filters or retry.
refinementHintstringSuggested next-step query refinement when the result set is large.
resultsarrayGermplasm rows returned in-context (up to loadLimit).
returnedCountintegerLength of results[].
totalCountintegerTotal rows reported by the server.
warningsarrayAdvisory messages (filter overrides, partial data, capability gaps).

No examples provided.

brapi_find_images ~326

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. When the upstream total exceeds loadLimit, the full result set is materialized as a dataframe — query it with brapi_dataframe_query (SQL).

NameTypeReqDescription
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
descriptiveOntologyTermsarrayFilter by ontology tags (e.g. "CO_334:plot").
extraFiltersobjectExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
imageFileNamesarrayFilter by uploaded file name.
imagesarrayFilter by imageDbIds.
loadLimitintegerCap 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.
mimeTypesarrayFilter by MIME type — e.g. "image/jpeg", "image/png".
observationUnitsarrayFilter by observationUnitDbIds.
observationsarrayFilter by observationDbIds.
studiesarrayFilter by studyDbIds.
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
appliedFiltersobjectThe final filter map sent to the server (named + extraFilters).
dataframeobjectDataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
distributionsobjectValue frequency per field across the full result set.
errorobjectPresent when the call failed. Absent on success.
hasMorebooleanTrue when more rows exist beyond the returned set.
noticestringGuidance when no rows were returned — how to broaden filters or retry.
refinementHintstringSuggested next-step query refinement when the result set is large.
resultsarrayImage metadata rows returned in-context (up to loadLimit).
returnedCountintegerLength of results[].
totalCountintegerTotal rows reported by the server.
warningsarrayAdvisory messages (filter overrides, partial data, capability gaps).

No examples provided.

brapi_find_locations ~495

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 bbox parameter restricts rows to a latitude/longitude window. When the spec-correct GeoJSON [lon, lat, alt] reading produces zero matches and at least one row carries a Point geometry, the bbox filter retries once with axes swapped (handles non-conformant servers that store [lat, lon, alt]) and surfaces a warning + `coordinateAxisOrder: "swapped"`. When the upstream total exceeds loadLimit, the full result set is materialized as a dataframe — query it with brapi_dataframe_query (SQL).

NameTypeReqDescription
abbreviationsarrayShort location abbreviations.
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
bboxobjectOptional post-fetch bounding box. All four corners must be set to activate the filter.
countryCodesarrayISO 3166-1 alpha-3 country codes.
countryNamesarrayFree-form English country names or aliases (e.g. "Uganda", "United States", "USA") resolved client-side to ISO 3166-1 alpha-3 codes and merged into countryCodes. Names that do not resolve surface as…
extraFiltersobjectExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
loadLimitintegerCap 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.
locationNamesarrayFilter by display name.
locationTypesarrayLocation type — e.g. "Research Station", "Field".
locationsarrayFilter by locationDbIds.
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
appliedFiltersobjectThe final filter map sent to the server (named + extraFilters).
coordinateAxisOrderstringAxis interpretation used when reading GeoJSON Point coordinates. "spec" follows the GeoJSON RFC 7946 [lon, lat, alt?] convention. "swapped" indicates the upstream server stores [lat, lon, alt?] (non-…
dataframeobjectDataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
distributionsobjectValue frequency per field across the full result set.
errorobjectPresent when the call failed. Absent on success.
hasMorebooleanTrue when more rows exist beyond the returned set.
noticestringGuidance when no rows were returned — how to broaden filters or retry.
refinementHintstringSuggested next-step query refinement when the result set is large.
resultsarrayLocation rows returned in-context (up to loadLimit). Bbox filter is applied after the upstream fetch.
returnedCountintegerLength of results[] after any bbox filtering.
totalCountintegerTotal rows reported by the server (or the post-bbox count when a bbox filter is active).
warningsarrayAdvisory messages (bbox malformed, filter overrides, capability gaps).

No examples provided.

brapi_find_observations ~367

Pull observation records filtered by study, germplasm, variable, season, or observation unit. When the upstream total exceeds loadLimit, the full result set is materialized as a dataframe — query it with brapi_dataframe_query (SQL).

NameTypeReqDescription
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
extraFiltersobjectExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
germplasmarrayFilter by germplasmDbIds.
loadLimitintegerCap 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.
observationLevelsarrayObservation unit level (plot, plant, field, etc.).
observationUnitsarrayFilter by observationUnitDbIds.
observationsarrayFilter by observationDbIds.
programsarrayFilter by programDbIds.
seasonsarrayFilter by seasonDbIds (e.g. "2022").
studiesarrayFilter by studyDbIds.
timestampFromstringISO 8601 start of the observation-time window.
timestampTostringISO 8601 end of the observation-time window.
trialsarrayFilter by trialDbIds.
variablesarrayFilter by observationVariableDbIds.
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
appliedFiltersobjectThe final filter map sent to the server (named + extraFilters).
dataframeobjectDataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
distributionsobjectValue frequency per field across the full result set.
errorobjectPresent when the call failed. Absent on success.
hasMorebooleanTrue when more rows exist beyond the returned set.
noticestringGuidance when no rows were returned — how to broaden filters or retry.
refinementHintstringSuggested next-step query refinement when the result set is large.
resultsarrayObservation rows returned in-context (up to loadLimit).
returnedCountintegerLength of results[].
totalCountintegerTotal rows reported by the server.
warningsarrayAdvisory messages (filter overrides, partial data, capability gaps).

No examples provided.

brapi_find_studies ~326

Locate studies matching crop, trial type, season, location, or program. Enriches results with program/trial/location context in one call. When the upstream total exceeds loadLimit, the full result set is materialized as a dataframe — query it with brapi_dataframe_query (SQL).

NameTypeReqDescription
activebooleanRestrict to active / inactive studies.
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
cropstringFilter by common crop name (single value).
extraFiltersobjectExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
loadLimitintegerCap 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.
locationsarrayFilter by locationDbIds (server-side identifiers, not display names).
programsarrayFilter by programDbIds.
seasonsarrayFilter by seasons (e.g. "2022").
studyNamesarrayFilter by study display name.
trialTypesarrayFilter by study types.
trialsarrayFilter by trialDbIds.
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
appliedFiltersobjectThe final filter map sent to the server (named + extraFilters).
dataframeobjectDataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
distributionsobjectValue frequency per field across the full result set.
errorobjectPresent when the call failed. Absent on success.
hasMorebooleanTrue when more rows exist beyond the returned set.
noticestringGuidance when no rows were returned — how to broaden filters or retry.
refinementHintstringSuggested next-step query refinement when the result set is large.
resultsarrayRows returned in-context (up to loadLimit).
returnedCountintegerLength of results[].
totalCountintegerTotal rows reported by the server.
warningsarrayAdvisory messages (filter overrides, partial data).

No examples provided.

brapi_find_variables ~446

Find observation variables (traits) by name, trait class, ontology term, or free-text query. Free-text queries are ranked against the returned set and may resolve to ontology URIs when the server advertises them. When the upstream total exceeds loadLimit, the full result set is materialized as a dataframe — query it with brapi_dataframe_query (SQL).

NameTypeReqDescription
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
cropstringFilter by common crop name (single value).
extraFiltersobjectExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
loadLimitintegerCap 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.
methodsarrayFilter by methodDbIds.
ontologiesarrayFilter by ontologyDbIds.
scalesarrayFilter by scaleDbIds.
studiesarrayFilter by studyDbIds.
textstringFree-text query. Ranks the **full upstream union** (the spilled dataframe when one is produced, otherwise the first page) via the ontology resolver, then fills the in-context window up to loadLimit w…
traitClassesarrayFilter by trait class.
variableNamesarrayFilter by exact observationVariableNames.
variablePUIsarrayFilter by persistent ontology URIs.
variablesarrayFilter by observationVariableDbIds.
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
appliedFiltersobjectThe final filter map sent to the server (named + extraFilters).
dataframeobjectDataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
distributionsobjectValue frequency per field across the full result set.
errorobjectPresent when the call failed. Absent on success.
hasMorebooleanTrue when more rows exist beyond the returned set.
noticestringGuidance when no rows were returned — how to broaden filters or retry.
ontologyCandidatesarrayTop ranked candidates from the free-text query (if any). Empty when `text` was not supplied.
refinementHintstringSuggested next-step query refinement when the result set is large.
resultsarrayObservation variable rows returned in-context (up to loadLimit). Rows matching `text` are promoted to the top when the free-text query produces candidates.
returnedCountintegerLength of results[].
totalCountintegerTotal rows reported by the server.
warningsarrayAdvisory messages (filter overrides, partial data, capability gaps).

No examples provided.

brapi_find_variants ~290

Find variant records by variant set, reference sequence, or genomic region (start/end, 1-based inclusive / exclusive). When the upstream total exceeds loadLimit, the full result set is materialized as a dataframe — query it with brapi_dataframe_query (SQL).

NameTypeReqDescription
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
endintegerExclusive 1-based end.
extraFiltersobjectExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
loadLimitintegerCap 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.
referenceNamestringReference display name (e.g. "chr01", "chr1").
referencesarrayFilter by referenceDbIds.
startintegerInclusive 1-based start.
variantSetsarrayFilter by variantSetDbIds.
variantsarrayFilter by variantDbIds.
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
appliedFiltersobjectThe final filter map sent to the server (named + extraFilters).
dataframeobjectDataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
distributionsobjectValue frequency per field across the full result set.
errorobjectPresent when the call failed. Absent on success.
hasMorebooleanTrue when more rows exist beyond the returned set.
noticestringGuidance when no rows were returned — how to broaden filters or retry.
refinementHintstringSuggested next-step query refinement when the result set is large.
resultsarrayVariant rows returned in-context (up to loadLimit).
returnedCountintegerLength of results[].
totalCountintegerTotal rows reported by the server.
warningsarrayAdvisory messages (filter overrides, partial data, capability gaps).

No examples provided.

brapi_germplasm_performance ~362

Aggregate a single germplasm's observations across every study it appears in, returning per-variable summary statistics (n, mean, median, sd, min, max), the contributing studies, and seasons. Study-anchored: discovers the germplasm's studies first (with a dialect-honor cross-check, capped at 200 studies), then pulls observations per study — avoids the unanchored germplasm-only pull that stalls on SGN/Breedbase. Pass an explicit studyDbIds set to skip discovery and its 200-study cap — e.g. process a chunk of the full study list retrieved via brapi_find_studies with extraFilters.germplasmDbIds. For the underlying observation matrix, use brapi_build_phenotype_matrix.

NameTypeReqDescription
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
germplasmDbIdstringyesThe germplasmDbId to summarize performance for.
studyDbIdsarrayOptional explicit set of studyDbIds to aggregate over. When supplied, skips automatic study discovery and its 200-study cap entirely — use it to process a specific slice of studies, e.g. the full ger…
variablesarrayOptional subset of observationVariableDbIds to aggregate. Omit to include every variable observed for the germplasm.
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection used.
errorobjectPresent when the call failed. Absent on success.
germplasmDbIdstringThe germplasm that was analyzed.
germplasmNamestringDisplay name of the germplasm, when the server provides one.
perVariablearrayPer-variable aggregates, sorted by observationVariableDbId.
studyCountintegerNumber of distinct studies that contributed any observation.
studyDbIdsarrayDistinct studyDbIds that contributed observations.
warningsarrayAdvisory messages (study-discovery limits, dropped filters, fallback paths, per-study failures).

No examples provided.

brapi_get_germplasm ~123

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.

NameTypeReqDescription
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
germplasmDbIdstringyesGermplasm identifier.
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
attributesarrayGermplasm attributes from /germplasm/{id}/attributes.
directDescendantCountintegerCount of direct descendants from /germplasm/{id}/progeny.
directParentCountintegerCount of direct parents.
errorobjectPresent when the call failed. Absent on success.
germplasmobjectCanonical germplasm record as returned by `/germplasm/{id}`.
parentsarrayDirect parents from /germplasm/{id}/pedigree.
studyCountintegerHow many studies this germplasm has appeared in.
warningsarrayAdvisory messages — failed sub-endpoint lookups, missing counts.

No examples provided.

brapi_get_image ~129

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. No filesystem side-effects.

NameTypeReqDescription
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
imageDbIdsarrayyes1–5 image identifiers.
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
errorobjectPresent when the call failed. Absent on success.
errorsarrayImages that could not be loaded, one entry per id.
imagesarraySuccessfully loaded images.
warningsarrayPer-image advisories for loaded payloads that appear suspect — e.g. the imageURL fallback returned a non-image MIME type, suggesting the upstream URL is broken.

No examples provided.

brapi_get_study ~112

Fetch a single study by DbId with program, trial, and location fully resolved. Response includes cheap observation/observation-unit/variable counts as drill-down signals.

NameTypeReqDescription
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
studyDbIdstringyesStudy identifier.
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
errorobjectPresent when the call failed. Absent on success.
locationobjectResolved location record (when the study has a locationDbId and the FK lookup succeeded).
observationCountintegerTotal observations recorded against this study. Omitted (with a warning) when the upstream server cannot scope the count to the study — never reported as the server-wide total.
observationUnitCountintegerTotal observation units (plots, plants, samples) in this study.
programobjectResolved program record (when the study has a programDbId and the FK lookup succeeded).
studyobjectCanonical study record as returned by `/studies/{id}`.
trialobjectResolved trial record (when the study has a trialDbId and the FK lookup succeeded).
variableCountintegerTotal observation variables (traits) measured in this study. Omitted (with a warning) when the upstream server cannot scope the count to the study — never reported as the server-wide total.
warningsarrayAdvisory messages — failed FK lookups, missing counts.

No examples provided.

brapi_raw_get ~260

Passthrough to any BrAPI GET /{path} endpoint. Returns the raw upstream envelope without enrichment or foreign-key resolution. Emits a `suggestion` field when a curated tool exists for the same data. Spills to a canvas dataframe when the upstream advertises more rows than `loadLimit` AND the result is a list shape (`result` array or `result.data` envelope); inline `result` is unchanged. Skips spillover when the caller drives paging via `params.page` / `params.pageSize`.

NameTypeReqDescription
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
loadLimitintegerCap 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.
paramsobjectQuery parameters to append. Arrays are repeated per BrAPI convention.
pathstringyesEndpoint path — e.g. "/samples", "/methods". Leading "/" is optional.
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
dataframeobjectPresent when the upstream advertised more rows than `loadLimit` AND the result is a list shape. The inline `result` is unchanged; the dataframe carries the full union of pages — query with brapi_data…
errorobjectPresent when the call failed. Absent on success.
metadataobjectBrAPI envelope metadata (pagination and any additional upstream fields).
pathstringNormalized path (leading `/` preserved) that was appended to the baseUrl.
resultRaw BrAPI `result` value — whatever shape the endpoint returns.
suggestionstringEmitted when a curated goal-shaped tool covers this endpoint.
urlstringFully resolved URL that was fetched (baseUrl + path + query string).

No examples provided.

brapi_raw_search ~241

Passthrough to any BrAPI POST /search/{noun} endpoint, returning the resolved envelope (async polling resolved upstream). Spills to a canvas dataframe when the upstream advertises more rows than `loadLimit` AND the result is a list shape; inline `result` is unchanged. Skips spillover when the caller drives paging via `body.page` / `body.pageSize`. No distributions or foreign-key resolution applied.

NameTypeReqDescription
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
bodyobjectyesFilter body passed verbatim to POST /search/{noun}.
loadLimitintegerCap 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.
nounstringyesSearch noun — e.g. "observations", "calls", "germplasm".
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
dataframeobjectPresent when the upstream advertised more rows than `loadLimit` AND the result is a list shape. The inline `result` is unchanged; the dataframe carries the full union of pages — query with brapi_data…
errorobjectPresent when the call failed. Absent on success.
kindstringWhether the server returned inline results or we polled an async search.
metadataobjectBrAPI envelope metadata (pagination and any additional upstream fields).
nounstringThe `/search/{noun}` segment the body was posted to.
resultRaw BrAPI `result` value — whatever shape the endpoint returns.
searchResultsDbIdstringPopulated when the server returned an async searchResultsDbId.
suggestionstringEmitted when a curated goal-shaped tool covers this search.

No examples provided.

brapi_server_info ~126

Return the full orientation envelope for a registered BrAPI connection — server identity, capabilities, content counts, and notes. Re-running refreshes the cached capability scan; pass an alias to read a non-default connection.

NameTypeReqDescription
aliasstringConnection alias. Omit to read the connection registered under alias `default` — i.e. a prior `brapi_connect` call that did not specify an alias. Calls that used a non-default alias must pass that sa…
forceRefreshbooleanBypass the cached capability profile and refetch from the server.
NameTypeReqDescription
aliasstringConnection alias.
attributionobjectAttribution metadata for built-in known-server connections. Absent for custom (env-only) connections.
authobjectAuth summary for the active connection.
baseUrlstringBrAPI v2 base URL for this connection.
capabilitiesobjectCapability profile derived from /serverinfo.
contentobjectContent summary (crops + optional totals).
dialectobjectActive dialect adapter — translates outbound filters and declares known-dead routes for this server.
errorobjectPresent when the call failed. Absent on success.
fetchedAtstringISO 8601 timestamp of when this envelope was composed.
notesarrayServer-specific quirks or degradation notes.
serverobjectNormalized server identity block.

No examples provided.

brapi_walk_pedigree ~237

Walk germplasm ancestry or descendancy as a deduplicated DAG, with multi-generation traversal, cycle detection, and depth limits. Returns nodes + edges plus traversal stats (depthReached, rootCount, leafCount, cycleCount, deadEndCount).

NameTypeReqDescription
aliasstringConnection alias registered via brapi_connect. Omit to read the connection registered under alias `default` — i.e. a prior brapi_connect call that did not specify an alias. Calls that used a non-defa…
directionstringWhich direction to walk: ancestors (parents), descendants (progeny), or both.
germplasmDbIdsarrayyesStarting germplasm (1–20 roots). All roots are walked concurrently.
loadLimitintegerCap 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.
maxDepthintegerMax generations to walk per direction (default 3, cap 10).
NameTypeReqDescription
aliasstringAlias of the registered BrAPI connection the call used.
cycleCountintegerNumber of times the walk revisited an already-registered node (cycles broken).
deadEndCountintegerNodes whose upstream pedigree/progeny lookup failed.
depthReachedintegerDeepest BFS level that produced at least one new edge (0 if only roots were walked).
directionstringThe direction the walk expanded (echoed from the input).
edgesarrayDeduplicated edge list. `relationship: "parent"` means `from` is a parent of `to`; `relationship: "child"` means `from` is a descendant of `to`.
edgesDataframeobjectCanvas dataframe holding the full edge set, present when the walk exceeds loadLimit — edges[] is then a bounded preview. Any edge field that is a reserved SQL word (e.g. `from` → `from_`) is renamed…
errorobjectPresent when the call failed. Absent on success.
leafCountintegerNodes that have no outgoing edges in the walked direction — terminal in the DAG.
maxDepthintegerThe maximum depth the walk was allowed to reach (echoed from the input).
nodesarrayDeduplicated node list — every germplasm reached by the walk, sorted by depth then DbId.
nodesDataframeobjectCanvas dataframe holding the full node set, present when the walk exceeds loadLimit — nodes[] is then a bounded preview. Query with brapi_dataframe_query (SQL); JOIN to the edges dataframe on germpla…
rootCountintegerNumber of starting germplasm roots.
truncatedbooleanTrue when the walk hit the 1000-node safety cap before exhausting depth.
warningsarrayAdvisory messages (capability gaps, per-node expansion failures).

No examples provided.

Common questions

What is the io.github.cyanheads/brapi-mcp-server server?

io.github.cyanheads/brapi-mcp-server is listed in the public MCP registry as io.github.cyanheads/brapi-mcp-server. Collaborative BrAPI v2.1 MCP workspace, studies, germplasm, genotypes across Breedbase, T3, more. This page covers its hosted endpoint (https://brapi.caseyjhand.com/mcp).

Is the io.github.cyanheads/brapi-mcp-server server safe to use?

io.github.cyanheads/brapi-mcp-server scores 69 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.cyanheads/brapi-mcp-server server expose?

io.github.cyanheads/brapi-mcp-server exposes 22 tools: brapi_connect, brapi_build_phenotype_matrix, brapi_server_info, brapi_describe_filters, brapi_find_studies, and 17 more. Their descriptions and schemas cost roughly 6,499 tokens of context every time the server is loaded.

Does the io.github.cyanheads/brapi-mcp-server server require authentication?

No. We connected to io.github.cyanheads/brapi-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the io.github.cyanheads/brapi-mcp-server server still maintained?

io.github.cyanheads/brapi-mcp-server is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.