# io.github.cyanheads/brapi-mcp-server (remote · brapi.caseyjhand.com)

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

- Trust score: 69/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- remote · `brapi.caseyjhand.com`: 69/100 (this document), [markdown](https://verifymcp.io/servers/cyanheads-brapi-mcp-server/brapi.md), [page](https://verifymcp.io/servers/cyanheads-brapi-mcp-server/brapi)
- npm · `@cyanheads/brapi-mcp-server`: 57/100, [markdown](https://verifymcp.io/servers/cyanheads-brapi-mcp-server/cyanheads-brapi-mcp-server.md), [page](https://verifymcp.io/servers/cyanheads-brapi-mcp-server/cyanheads-brapi-mcp-server)

## Channel facts

- Endpoint: `https://brapi.caseyjhand.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.7.13`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Endpoint Security**: 66/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - 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.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 80/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 3/100
  - Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 22 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 24 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

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

### Claude

```bash
claude mcp add --transport http cyanheads-brapi-mcp-server 'https://brapi.caseyjhand.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "cyanheads-brapi-mcp-server": {
      "url": "https://brapi.caseyjhand.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "cyanheads-brapi-mcp-server": {
      "type": "http",
      "url": "https://brapi.caseyjhand.com/mcp"
    }
  }
}
```

### Codex

```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
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add cyanheads-brapi-mcp-server --url 'https://brapi.caseyjhand.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  cyanheads-brapi-mcp-server:
    url: "https://brapi.caseyjhand.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "cyanheads-brapi-mcp-server": {
      "Transport": "http",
      "Url": "https://brapi.caseyjhand.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add cyanheads-brapi-mcp-server -t streamable-http -u 'https://brapi.caseyjhand.com/mcp'
```

### Other

```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 recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 69, 0)

- [functional improvement] Stability: unverified → 0.03

### 2026-09-19 (score 69)

First indexed and scored.

## MCP tools (22)

### `brapi_connect` (~281 tokens)

Brapi Connect

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.

Input parameters:

- `alias` (string): Alias for this connection. Use distinct aliases to register multiple BrAPI servers in one session.
- `auth`: Auth payload. Omit to use credentials configured server-side for this alias (or no auth when none are configured).
- `baseUrl` (string): 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.

Output parameters:

- `alias` (string): Connection alias.
- `attribution` (object): Attribution metadata for built-in known-server connections. Absent for custom (env-only) connections.
- `auth` (object): Auth summary for the active connection.
- `baseUrl` (string): BrAPI v2 base URL for this connection.
- `capabilities` (object): Capability profile derived from /serverinfo.
- `content` (object): Content summary (crops + optional totals).
- `dialect` (object): Active dialect adapter — translates outbound filters and declares known-dead routes for this server.
- `error` (object): Present when the call failed. Absent on success.
- `fetchedAt` (string): ISO 8601 timestamp of when this envelope was composed.
- `notes` (array): Server-specific quirks or degradation notes.
- `server` (object): Normalized server identity block.

### `brapi_build_phenotype_matrix` (~490 tokens)

Brapi Build Phenotype Matrix

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.

Input parameters:

- `aggregate` (string): 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 tr…
- `alias` (string): Connection 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…
- `extraFilters` (object): Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
- `germplasm` (array): Optional subset of germplasmDbIds to include. Omit to include all germplasm found in the queried studies.
- `loadLimit` (integer): 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.
- `shape` (string): Matrix shape. `wide` — one row per germplasm, one column per variable, cell = aggregated value. `long` — one row per observation with columns: germplasmDbId, observationVariableDbId, studyDbId, value…
- `studies` (array, required): studyDbIds to include in the matrix. At least one is required — the tool is study-anchored to avoid full-table scans.
- `variables` (array): Optional subset of observationVariableDbIds to include. Omit to include all variables found in the queried studies.

Output parameters:

- `aggregate` (string): Aggregation applied to replicate observations (wide shape only). `all` keeps one row per replicate.
- `alias` (string): Alias of the registered BrAPI connection the call used.
- `cap` (integer): Per-study observation cap that was applied.
- `dataframe` (object): Canvas dataframe handle for the materialized matrix. Omitted when no observations were found. Query with brapi_dataframe_query (SQL). Long-form columns: germplasmDbId, observationVariableDbId, studyD…
- `error` (object): Present when the call failed. Absent on success.
- `germplasmCount` (integer): Number of distinct germplasm in the matrix.
- `notice` (string): Guidance for reaching the observations this call left out.
- `observationCount` (integer): Total raw observations collected before pivoting.
- `shape` (string): Matrix shape — wide (one row per germplasm, one column per variable) or long (one row per observation).
- `shown` (integer): Observations collected across all studies after filtering.
- `studies` (array): studyDbIds that were queried to build the matrix.
- `truncated` (boolean): True when at least one study saturated the per-study loadLimit.
- `variableCount` (integer): Number of distinct observation variables in the matrix.
- `variableLegend` (object): Mapping of safe column identifier → observationVariableName. Wide-matrix column names are SQL-safe identifiers derived from observationVariableDbId (sanitized for DuckDB); consult this map to resolve…
- `warnings` (array): Advisory messages (empty studies, non-numeric aggregation skips, fallback paths).

### `brapi_server_info` (~126 tokens)

Brapi Server Info

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.

Input parameters:

- `alias` (string): Connection 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…
- `forceRefresh` (boolean): Bypass the cached capability profile and refetch from the server.

Output parameters:

- `alias` (string): Connection alias.
- `attribution` (object): Attribution metadata for built-in known-server connections. Absent for custom (env-only) connections.
- `auth` (object): Auth summary for the active connection.
- `baseUrl` (string): BrAPI v2 base URL for this connection.
- `capabilities` (object): Capability profile derived from /serverinfo.
- `content` (object): Content summary (crops + optional totals).
- `dialect` (object): Active dialect adapter — translates outbound filters and declares known-dead routes for this server.
- `error` (object): Present when the call failed. Absent on success.
- `fetchedAt` (string): ISO 8601 timestamp of when this envelope was composed.
- `notes` (array): Server-specific quirks or degradation notes.
- `server` (object): Normalized server identity block.

### `brapi_describe_filters` (~90 tokens)

Brapi Describe Filters

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.

Input parameters:

- `endpoint` (string, required): BrAPI endpoint to describe filters for.

Output parameters:

- `availableEndpoints` (array): Every endpoint this tool can describe — useful for discovery.
- `endpoint` (string): The endpoint the filters apply to.
- `error` (object): Present when the call failed. Absent on success.
- `filterCount` (integer): Number of filters in the catalog.
- `filters` (array): Filter catalog entries.
- `specReference` (string): Pointer to the BrAPI v2 spec section for this endpoint.

### `brapi_find_studies` (~326 tokens)

Brapi Find Studies

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

Input parameters:

- `active` (boolean): Restrict to active / inactive studies.
- `alias` (string): Connection 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…
- `crop` (string): Filter by common crop name (single value).
- `extraFilters` (object): Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
- `loadLimit` (integer): 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.
- `locations` (array): Filter by locationDbIds (server-side identifiers, not display names).
- `programs` (array): Filter by programDbIds.
- `seasons` (array): Filter by seasons (e.g. "2022").
- `studyNames` (array): Filter by study display name.
- `trialTypes` (array): Filter by study types.
- `trials` (array): Filter by trialDbIds.

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `appliedFilters` (object): The final filter map sent to the server (named + extraFilters).
- `dataframe` (object): Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
- `distributions` (object): Value frequency per field across the full result set.
- `error` (object): Present when the call failed. Absent on success.
- `hasMore` (boolean): True when more rows exist beyond the returned set.
- `notice` (string): Guidance when no rows were returned — how to broaden filters or retry.
- `refinementHint` (string): Suggested next-step query refinement when the result set is large.
- `results` (array): Rows returned in-context (up to loadLimit).
- `returnedCount` (integer): Length of results[].
- `totalCount` (integer): Total rows reported by the server.
- `warnings` (array): Advisory messages (filter overrides, partial data).

### `brapi_get_study` (~112 tokens)

Brapi Get Study

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.

Input parameters:

- `alias` (string): Connection 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…
- `studyDbId` (string, required): Study identifier.

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `error` (object): Present when the call failed. Absent on success.
- `location` (object): Resolved location record (when the study has a locationDbId and the FK lookup succeeded).
- `observationCount` (integer): Total 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.
- `observationUnitCount` (integer): Total observation units (plots, plants, samples) in this study.
- `program` (object): Resolved program record (when the study has a programDbId and the FK lookup succeeded).
- `study` (object): Canonical study record as returned by `/studies/{id}`.
- `trial` (object): Resolved trial record (when the study has a trialDbId and the FK lookup succeeded).
- `variableCount` (integer): Total 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.
- `warnings` (array): Advisory messages — failed FK lookups, missing counts.

### `brapi_find_germplasm` (~405 tokens)

Brapi Find Germplasm

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.

Input parameters:

- `accessionNumbers` (array): Filter by accession numbers (gene-bank catalog codes).
- `alias` (string): Connection 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…
- `collections` (array): Filter by germplasm collection names.
- `crops` (array): Filter by common crop names.
- `extraFilters` (object): Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
- `genus` (string): Botanical genus.
- `germplasmDbIds` (array): Filter by DbIds.
- `germplasmPUIs` (array): Persistent unique identifiers.
- `loadLimit` (integer): 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.
- `names` (array): Filter by germplasm display names.
- `species` (string): Botanical species.
- `synonyms` (array): Match registered synonyms.
- `text` (string): Free-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…

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `appliedFilters` (object): The final filter map sent to the server (named + extraFilters).
- `dataframe` (object): Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
- `distributions` (object): Value frequency per field across the full result set.
- `error` (object): Present when the call failed. Absent on success.
- `hasMore` (boolean): True when more rows exist beyond the returned set.
- `notice` (string): Guidance when no rows were returned — how to broaden filters or retry.
- `refinementHint` (string): Suggested next-step query refinement when the result set is large.
- `results` (array): Germplasm rows returned in-context (up to loadLimit).
- `returnedCount` (integer): Length of results[].
- `totalCount` (integer): Total rows reported by the server.
- `warnings` (array): Advisory messages (filter overrides, partial data, capability gaps).

### `brapi_get_germplasm` (~123 tokens)

Brapi Get Germplasm

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.

Input parameters:

- `alias` (string): Connection 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…
- `germplasmDbId` (string, required): Germplasm identifier.

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `attributes` (array): Germplasm attributes from /germplasm/{id}/attributes.
- `directDescendantCount` (integer): Count of direct descendants from /germplasm/{id}/progeny.
- `directParentCount` (integer): Count of direct parents.
- `error` (object): Present when the call failed. Absent on success.
- `germplasm` (object): Canonical germplasm record as returned by `/germplasm/{id}`.
- `parents` (array): Direct parents from /germplasm/{id}/pedigree.
- `studyCount` (integer): How many studies this germplasm has appeared in.
- `warnings` (array): Advisory messages — failed sub-endpoint lookups, missing counts.

### `brapi_walk_pedigree` (~237 tokens)

Brapi Walk Pedigree

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

Input parameters:

- `alias` (string): Connection 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…
- `direction` (string): Which direction to walk: ancestors (parents), descendants (progeny), or both.
- `germplasmDbIds` (array, required): Starting germplasm (1–20 roots). All roots are walked concurrently.
- `loadLimit` (integer): 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.
- `maxDepth` (integer): Max generations to walk per direction (default 3, cap 10).

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `cycleCount` (integer): Number of times the walk revisited an already-registered node (cycles broken).
- `deadEndCount` (integer): Nodes whose upstream pedigree/progeny lookup failed.
- `depthReached` (integer): Deepest BFS level that produced at least one new edge (0 if only roots were walked).
- `direction` (string): The direction the walk expanded (echoed from the input).
- `edges` (array): Deduplicated edge list. `relationship: "parent"` means `from` is a parent of `to`; `relationship: "child"` means `from` is a descendant of `to`.
- `edgesDataframe` (object): Canvas 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…
- `error` (object): Present when the call failed. Absent on success.
- `leafCount` (integer): Nodes that have no outgoing edges in the walked direction — terminal in the DAG.
- `maxDepth` (integer): The maximum depth the walk was allowed to reach (echoed from the input).
- `nodes` (array): Deduplicated node list — every germplasm reached by the walk, sorted by depth then DbId.
- `nodesDataframe` (object): Canvas 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…
- `rootCount` (integer): Number of starting germplasm roots.
- `truncated` (boolean): True when the walk hit the 1000-node safety cap before exhausting depth.
- `warnings` (array): Advisory messages (capability gaps, per-node expansion failures).

### `brapi_germplasm_performance` (~362 tokens)

Brapi Germplasm Performance

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.

Input parameters:

- `alias` (string): Connection 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…
- `germplasmDbId` (string, required): The germplasmDbId to summarize performance for.
- `studyDbIds` (array): Optional 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…
- `variables` (array): Optional subset of observationVariableDbIds to aggregate. Omit to include every variable observed for the germplasm.

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection used.
- `error` (object): Present when the call failed. Absent on success.
- `germplasmDbId` (string): The germplasm that was analyzed.
- `germplasmName` (string): Display name of the germplasm, when the server provides one.
- `perVariable` (array): Per-variable aggregates, sorted by observationVariableDbId.
- `studyCount` (integer): Number of distinct studies that contributed any observation.
- `studyDbIds` (array): Distinct studyDbIds that contributed observations.
- `warnings` (array): Advisory messages (study-discovery limits, dropped filters, fallback paths, per-study failures).

### `brapi_find_variables` (~446 tokens)

Brapi Find Variables

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

Input parameters:

- `alias` (string): Connection 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…
- `crop` (string): Filter by common crop name (single value).
- `extraFilters` (object): Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
- `loadLimit` (integer): 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.
- `methods` (array): Filter by methodDbIds.
- `ontologies` (array): Filter by ontologyDbIds.
- `scales` (array): Filter by scaleDbIds.
- `studies` (array): Filter by studyDbIds.
- `text` (string): Free-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…
- `traitClasses` (array): Filter by trait class.
- `variableNames` (array): Filter by exact observationVariableNames.
- `variablePUIs` (array): Filter by persistent ontology URIs.
- `variables` (array): Filter by observationVariableDbIds.

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `appliedFilters` (object): The final filter map sent to the server (named + extraFilters).
- `dataframe` (object): Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
- `distributions` (object): Value frequency per field across the full result set.
- `error` (object): Present when the call failed. Absent on success.
- `hasMore` (boolean): True when more rows exist beyond the returned set.
- `notice` (string): Guidance when no rows were returned — how to broaden filters or retry.
- `ontologyCandidates` (array): Top ranked candidates from the free-text query (if any). Empty when `text` was not supplied.
- `refinementHint` (string): Suggested next-step query refinement when the result set is large.
- `results` (array): Observation variable rows returned in-context (up to loadLimit). Rows matching `text` are promoted to the top when the free-text query produces candidates.
- `returnedCount` (integer): Length of results[].
- `totalCount` (integer): Total rows reported by the server.
- `warnings` (array): Advisory messages (filter overrides, partial data, capability gaps).

### `brapi_find_observations` (~367 tokens)

Brapi Find Observations

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

Input parameters:

- `alias` (string): Connection 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…
- `extraFilters` (object): Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
- `germplasm` (array): Filter by germplasmDbIds.
- `loadLimit` (integer): 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.
- `observationLevels` (array): Observation unit level (plot, plant, field, etc.).
- `observationUnits` (array): Filter by observationUnitDbIds.
- `observations` (array): Filter by observationDbIds.
- `programs` (array): Filter by programDbIds.
- `seasons` (array): Filter by seasonDbIds (e.g. "2022").
- `studies` (array): Filter by studyDbIds.
- `timestampFrom` (string): ISO 8601 start of the observation-time window.
- `timestampTo` (string): ISO 8601 end of the observation-time window.
- `trials` (array): Filter by trialDbIds.
- `variables` (array): Filter by observationVariableDbIds.

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `appliedFilters` (object): The final filter map sent to the server (named + extraFilters).
- `dataframe` (object): Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
- `distributions` (object): Value frequency per field across the full result set.
- `error` (object): Present when the call failed. Absent on success.
- `hasMore` (boolean): True when more rows exist beyond the returned set.
- `notice` (string): Guidance when no rows were returned — how to broaden filters or retry.
- `refinementHint` (string): Suggested next-step query refinement when the result set is large.
- `results` (array): Observation rows returned in-context (up to loadLimit).
- `returnedCount` (integer): Length of results[].
- `totalCount` (integer): Total rows reported by the server.
- `warnings` (array): Advisory messages (filter overrides, partial data, capability gaps).

### `brapi_find_images` (~326 tokens)

Brapi Find Images

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

Input parameters:

- `alias` (string): Connection 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…
- `descriptiveOntologyTerms` (array): Filter by ontology tags (e.g. "CO_334:plot").
- `extraFilters` (object): Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
- `imageFileNames` (array): Filter by uploaded file name.
- `images` (array): Filter by imageDbIds.
- `loadLimit` (integer): 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.
- `mimeTypes` (array): Filter by MIME type — e.g. "image/jpeg", "image/png".
- `observationUnits` (array): Filter by observationUnitDbIds.
- `observations` (array): Filter by observationDbIds.
- `studies` (array): Filter by studyDbIds.

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `appliedFilters` (object): The final filter map sent to the server (named + extraFilters).
- `dataframe` (object): Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
- `distributions` (object): Value frequency per field across the full result set.
- `error` (object): Present when the call failed. Absent on success.
- `hasMore` (boolean): True when more rows exist beyond the returned set.
- `notice` (string): Guidance when no rows were returned — how to broaden filters or retry.
- `refinementHint` (string): Suggested next-step query refinement when the result set is large.
- `results` (array): Image metadata rows returned in-context (up to loadLimit).
- `returnedCount` (integer): Length of results[].
- `totalCount` (integer): Total rows reported by the server.
- `warnings` (array): Advisory messages (filter overrides, partial data, capability gaps).

### `brapi_get_image` (~129 tokens)

Brapi Get Image

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.

Input parameters:

- `alias` (string): Connection 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…
- `imageDbIds` (array, required): 1–5 image identifiers.

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `error` (object): Present when the call failed. Absent on success.
- `errors` (array): Images that could not be loaded, one entry per id.
- `images` (array): Successfully loaded images.
- `warnings` (array): Per-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.

### `brapi_find_locations` (~495 tokens)

Brapi Find Locations

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

Input parameters:

- `abbreviations` (array): Short location abbreviations.
- `alias` (string): Connection 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…
- `bbox` (object): Optional post-fetch bounding box. All four corners must be set to activate the filter.
- `countryCodes` (array): ISO 3166-1 alpha-3 country codes.
- `countryNames` (array): Free-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…
- `extraFilters` (object): Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
- `loadLimit` (integer): 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.
- `locationNames` (array): Filter by display name.
- `locationTypes` (array): Location type — e.g. "Research Station", "Field".
- `locations` (array): Filter by locationDbIds.

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `appliedFilters` (object): The final filter map sent to the server (named + extraFilters).
- `coordinateAxisOrder` (string): Axis 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-…
- `dataframe` (object): Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
- `distributions` (object): Value frequency per field across the full result set.
- `error` (object): Present when the call failed. Absent on success.
- `hasMore` (boolean): True when more rows exist beyond the returned set.
- `notice` (string): Guidance when no rows were returned — how to broaden filters or retry.
- `refinementHint` (string): Suggested next-step query refinement when the result set is large.
- `results` (array): Location rows returned in-context (up to loadLimit). Bbox filter is applied after the upstream fetch.
- `returnedCount` (integer): Length of results[] after any bbox filtering.
- `totalCount` (integer): Total rows reported by the server (or the post-bbox count when a bbox filter is active).
- `warnings` (array): Advisory messages (bbox malformed, filter overrides, capability gaps).

### `brapi_find_variants` (~290 tokens)

Brapi Find Variants

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

Input parameters:

- `alias` (string): Connection 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…
- `end` (integer): Exclusive 1-based end.
- `extraFilters` (object): Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
- `loadLimit` (integer): 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.
- `referenceName` (string): Reference display name (e.g. "chr01", "chr1").
- `references` (array): Filter by referenceDbIds.
- `start` (integer): Inclusive 1-based start.
- `variantSets` (array): Filter by variantSetDbIds.
- `variants` (array): Filter by variantDbIds.

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `appliedFilters` (object): The final filter map sent to the server (named + extraFilters).
- `dataframe` (object): Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
- `distributions` (object): Value frequency per field across the full result set.
- `error` (object): Present when the call failed. Absent on success.
- `hasMore` (boolean): True when more rows exist beyond the returned set.
- `notice` (string): Guidance when no rows were returned — how to broaden filters or retry.
- `refinementHint` (string): Suggested next-step query refinement when the result set is large.
- `results` (array): Variant rows returned in-context (up to loadLimit).
- `returnedCount` (integer): Length of results[].
- `totalCount` (integer): Total rows reported by the server.
- `warnings` (array): Advisory messages (filter overrides, partial data, capability gaps).

### `brapi_find_genotype_calls` (~364 tokens)

Brapi Find Genotype Calls

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.

Input parameters:

- `alias` (string): Connection 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…
- `callFormat` (string): Requested call-encoding format, when the server honors it.
- `callSetDbIds` (array): Restrict to these call sets directly.
- `germplasmDbIds` (array): Restrict to these germplasm (call sets).
- `loadLimit` (integer): Cap 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…
- `variantDbIds` (array): Restrict to specific variants.
- `variantSetDbId` (string): Scope calls to a single variant set. Strongly recommended.
- `variantSetDbIds` (array): Alternative: multiple variant sets at once.

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `appliedFilters` (object): The body sent to POST /search/calls (variant/germplasm/call-set scope plus pageSize).
- `callFormatting` (object): Genotype-encoding hints echoed by the server.
- `dataframe` (object): Dataframe handle when the full collected calls exceed loadLimit and were materialized as a dataframe. Query it with brapi_dataframe_query (SQL).
- `distributions` (object): Value frequency per field across the full collected call set.
- `error` (object): Present when the call failed. Absent on success.
- `hasMore` (boolean): True when the collection was truncated (equivalent to `truncated`).
- `notice` (string): Guidance when no calls were returned — how to broaden filters or verify IDs.
- `results` (array): Call rows returned in-context (up to loadLimit).
- `returnedCount` (integer): Length of results[] — rows returned in-context (up to loadLimit).
- `totalCount` (integer): Total calls collected across all pages (may be capped by the deployment-wide pull limit; check `truncated`).
- `truncated` (boolean): True when the deployment-wide pull limit was reached and more calls exist upstream. Narrow the filters and re-pull, or query the spilled dataframe.
- `warnings` (array): Advisory messages (truncation, capability gaps, partial pulls).

### `brapi_export_genotype_matrix` (~487 tokens)

Brapi Export Genotype Matrix

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.

Input parameters:

- `alias` (string): Connection 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…
- `format` (string, required): 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.
- `germplasmDbIds` (array): Restrict to these germplasm. Omit to pull all germplasm in the variant set (use with caution on large sets).
- `maxCalls` (integer): Lower 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…
- `maxColumns` (integer): Lower 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…
- `variantSetDbId` (string, required): Variant set to pull calls for. Required.

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection used.
- `callFormatting` (object): Genotype-encoding hints echoed by the server.
- `columnCount` (integer): Number of variant columns in the matrix (excluding the germplasm ID column).
- `dataframe` (object): Canvas 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…
- `error` (object): Present when the call failed. Absent on success.
- `format` (string): The output format that was produced.
- `map` (string): PLINK .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…
- `ped` (string): PLINK .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…
- `rowCount` (integer): Number of call-set (germplasm) rows in the matrix.
- `truncated` (boolean): True 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…
- `variantColumnLegend` (object): Map 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.
- `vcf` (string): VCF-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…
- `warnings` (array): Advisory messages (truncation, missing fields, etc.).

### `brapi_dataframe_describe` (~128 tokens)

Brapi Dataframe Describe

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.

Input parameters:

- `dataframe` (string): When set, return only the named dataframe. Omit to list all dataframes.

Output parameters:

- `error` (object): Present when the call failed. Absent on success.
- `tables` (array): All described dataframes.

### `brapi_dataframe_query` (~414 tokens)

Brapi Dataframe Query

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.

Input parameters:

- `preview` (integer): Cap 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.
- `registerAs` (string): Persist 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…
- `rowLimit` (integer): 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, required): SELECT 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…

Output parameters:

- `cap` (integer): Row ceiling that bound the response (the smaller of preview and rowLimit).
- `columns` (array): Column metadata in projection order — name and SQL type. Use this to write follow-up queries without round-tripping through brapi_dataframe_describe.
- `dataframe` (string): Name of the dataframe holding the full result, populated when `registerAs` was supplied. Reference this name in follow-up queries.
- `error` (object): Present when the call failed. Absent on success.
- `notice` (string): Guidance for reaching the rows this response left out.
- `rowCount` (integer): Total rows the query produced (may exceed `rows.length` when capped).
- `rows` (array): Materialized rows, bounded by preview/rowLimit.
- `shown` (integer): Rows materialized into `rows`.
- `truncated` (boolean): True when the response carries fewer rows than the query produced.

### `brapi_raw_get` (~260 tokens)

Brapi Raw Get

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

Input parameters:

- `alias` (string): Connection 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…
- `loadLimit` (integer): 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.
- `params` (object): Query parameters to append. Arrays are repeated per BrAPI convention.
- `path` (string, required): Endpoint path — e.g. "/samples", "/methods". Leading "/" is optional.

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `dataframe` (object): Present 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…
- `error` (object): Present when the call failed. Absent on success.
- `metadata` (object): BrAPI envelope metadata (pagination and any additional upstream fields).
- `path` (string): Normalized path (leading `/` preserved) that was appended to the baseUrl.
- `result`: Raw BrAPI `result` value — whatever shape the endpoint returns.
- `suggestion` (string): Emitted when a curated goal-shaped tool covers this endpoint.
- `url` (string): Fully resolved URL that was fetched (baseUrl + path + query string).

### `brapi_raw_search` (~241 tokens)

Brapi Raw Search

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.

Input parameters:

- `alias` (string): Connection 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…
- `body` (object, required): Filter body passed verbatim to POST /search/{noun}.
- `loadLimit` (integer): 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, required): Search noun — e.g. "observations", "calls", "germplasm".

Output parameters:

- `alias` (string): Alias of the registered BrAPI connection the call used.
- `dataframe` (object): Present 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…
- `error` (object): Present when the call failed. Absent on success.
- `kind` (string): Whether the server returned inline results or we polled an async search.
- `metadata` (object): BrAPI envelope metadata (pagination and any additional upstream fields).
- `noun` (string): The `/search/{noun}` segment the body was posted to.
- `result`: Raw BrAPI `result` value — whatever shape the endpoint returns.
- `searchResultsDbId` (string): Populated when the server returned an async searchResultsDbId.
- `suggestion` (string): Emitted when a curated goal-shaped tool covers this search.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/cyanheads-brapi-mcp-server/brapi#diagnostics

## Score history

- 2026-09-20: 69
- 2026-09-19: 69

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

## Links

- Remote endpoint: https://brapi.caseyjhand.com/mcp
- Repository: https://github.com/cyanheads/brapi-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/cyanheads-brapi-mcp-server/brapi.xml
- Changelog JSON feed: https://verifymcp.io/servers/cyanheads-brapi-mcp-server/brapi.json
- HTML version of this page: https://verifymcp.io/servers/cyanheads-brapi-mcp-server/brapi
