brapi-mcp-server
Server Details
Collaborative BrAPI v2.1 MCP workspace: studies, germplasm, genotypes across Breedbase, T3, more.
- Status
- Healthy
- Uptime
- 99.8% over 43 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/brapi-mcp-server
- GitHub Stars
- 4
- Server Listing
- @cyanheads/brapi-mcp-server
TDQS
Scored across 22 tools
Most tools target distinct resource+action pairs (find_germplasm vs get_germplasm, find_images vs get_image, find_* vs raw_*). There is mild overlap among the observation tools (find_observations, build_phenotype_matrix, germplasm_performance) and between connect/server_info, but descriptions clearly separate their purposes.
All tools use a uniform brapi_ snake_case prefix with a mostly predictable verb_noun pattern (find_*, get_*, build_*, export_*, walk_*). Minor deviations exist: connect and server_info lack an action verb, and dataframe_describe/dataframe_query invert the noun_verb order used elsewhere.
22 tools is on the heavy side but justified by the breadth of the BrAPI domain (germplasm, studies, observations, variables, images, variants, genotypes, locations, pedigree) plus necessary dataframe/SQL and raw passthrough infrastructure. Nearly every tool earns its place.
The surface covers the full query lifecycle across all major BrAPI resources, with matrix export, pedigree walking, per-germplasm aggregation, and SQL over spillover dataframes. raw_get and raw_search close any remaining spec gaps, so there are essentially no dead ends.
Available Tools
22 toolsbrapi_build_phenotype_matrixBrapi Build Phenotype MatrixARead-onlyInspect
Pull observations across one or more studies and pivot them into a germplasm × trait matrix materialized as a canvas dataframe. Returns a dataframe handle (read it with brapi_dataframe_describe and brapi_dataframe_query) plus a summary of dimensions and aggregate method. Long-form output is suitable for downstream GROUP BY analysis by study, germplasm, or variable. A study whose pull fails is named in warnings and the rest still build the matrix; the call fails only when every study failed.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| shape | No | 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, replicateIndex. When `aggregate:"all"` is combined with `shape:"wide"`, the output falls back to long form with a replicateIndex column. | wide |
| studies | Yes | studyDbIds to include in the matrix. At least one is required — the tool is study-anchored to avoid full-table scans. | |
| aggregate | No | 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 traits). `first` keeps the first value seen. `all` keeps every replicate as a separate row (produces long-form output even when shape is "wide"). Default: `mean`. | mean |
| germplasm | No | Optional subset of germplasmDbIds to include. Omit to include all germplasm found in the queried studies. | |
| loadLimit | No | Cap on matching observations collected per study. Omit for the deployment default. A study that stops at it is reported as truncated. | |
| variables | No | Optional subset of observationVariableDbIds to include. Omit to include all variables found in the queried studies. | |
| extraFilters | No | Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Per-study cap on matching observations that was applied. |
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| shape | No | Matrix shape — wide (one row per germplasm, one column per variable) or long (one row per observation). |
| shown | No | Observations collected across all studies after filtering. |
| notice | No | Guidance for reaching the observations this call left out, then the matrix dataframe and the tools that read it. |
| studies | No | Requested studyDbIds; coverage records collection outcomes. |
| coverage | No | Collection coverage, independent of the number of contributing studies. |
| warnings | No | Advisory messages (empty or failed studies, partial study scans, extraFilters the rows contradict or cannot verify, non-numeric aggregation skips, fallback paths). |
| aggregate | No | Aggregation applied to replicate observations (wide shape only). `all` keeps one row per replicate. |
| dataframe | No | The matrix, staged; absent when no observations were found. Long-form columns: germplasmDbId, observationVariableDbId, studyDbId, value, replicateIndex. Wide-form columns: germplasmDbId, germplasmName, then one per variable (see variableLegend). |
| truncated | No | True when failed, truncated, or unprocessed studies leave matrix coverage incomplete. |
| variableCount | No | Number of distinct observation variables in the matrix. |
| germplasmCount | No | Number of distinct germplasm in the matrix. |
| variableLegend | No | Wide-matrix column name (SQL-safe, derived from observationVariableDbId) → observationVariableName. |
| observationCount | No | Total raw observations collected before pivoting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/openWorld; the description goes well beyond by disclosing partial-failure semantics (per-study failures land in warnings, the call fails only if every study failed), truncation behavior, and the aggregate:"all" fallback to long form. This is exactly the kind of error-handling and output-shape context that annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, no filler, front-loaded with the core action and immediately followed by the return contract and failure model. Slightly dense but every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with nested objects and an output schema, the description covers the action, the returned handle plus how to consume it, the fallback shaping rules, and the failure/truncation model. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents alias, shape, studies, aggregate, germplasm, loadLimit, variables, and extraFilters in detail. The description adds only light reinforcement ("one or more studies", the study-anchored rationale, the wide/long fallback), so this is the baseline 3 where structured fields do the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource pair — pull observations across studies and pivot them into a germplasm × trait matrix materialized as a canvas dataframe — which is unambiguous and distinguishes it from generic finders like brapi_find_observations or brapi_germplasm_performance. The agent knows exactly what artifact is produced (a dataframe handle) without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear forward guidance: read the result via brapi_dataframe_describe and brapi_dataframe_query, and notes long-form output suits downstream GROUP BY by study/germplasm/variable. It does not explicitly state when to prefer this over sibling aggregation tools, nor any exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_connectBrapi ConnectAIdempotentInspect
Open a connection to a BrAPI v2 server, authenticate, and return the full orientation envelope (server identity, capability profile, content summary, suggested next tools). Other BrAPI tools connect an alias the server has a URL configured for (a built-in or operator-configured alias, or default on a deployment with a default server) on first use; call this to connect any other server by baseUrl, to pass auth, or to re-point an alias. Supports multiple concurrent connections via named aliases. Credentials can be configured server-side and omitted from this call. When a request carries no MCP session on a deployment without per-user auth, aliases live in one namespace shared by every such caller: re-registering an alias re-points their later calls to it. Built-in known servers (callable with no baseUrl or auth — public BrAPI v2 endpoints): bti-breedbase-demo, bti-cassava, bti-sweetpotato. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| auth | No | Auth payload. Omit to use credentials configured server-side for this alias (or no auth when none are configured). | |
| alias | No | Alias for this connection. Use distinct aliases to register multiple BrAPI servers in one session. | default |
| baseUrl | No | 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 Schema
| Name | Required | Description |
|---|---|---|
| auth | No | Auth summary for the active connection. |
| alias | No | Connection alias. |
| error | No | Present when the call failed. Absent on success. |
| notes | No | Server-specific quirks or degradation notes. |
| server | No | Normalized server identity block. |
| baseUrl | No | BrAPI v2 base URL for this connection. |
| content | No | Content summary (crops + optional totals). |
| dialect | No | Active dialect adapter — translates outbound filters and declares known-dead routes for this server. |
| fetchedAt | No | ISO 8601 timestamp of when this envelope was composed. |
| attribution | No | Attribution metadata for built-in known-server connections. Absent when the alias is not built-in or points away from its built-in base URL. |
| capabilities | No | Capability profile derived from /serverinfo or /calls. |
| nextToolSuggestions | No | Entry-point finders (studies, germplasm, variables, locations — in that order) whose GET or POST /search route this server exposes under the active dialect. Empty when none apply. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=true): it discloses that credentials can be server-side and omitted, that aliases can be re-pointed, that multiple concurrent connections are supported, and critically that on sessionless deployments aliases share one namespace so re-registering re-points other callers' future calls. These are non-obvious state semantics an agent must know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return value, then layered with operational caveats. The single dense paragraph is long but nearly every clause carries unique, actionable information; a slight tightening would help readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and the description still names what the envelope contains (server identity, capability profile, content summary, suggested next tools). For a connection/registration tool with rich auth semantics, no decision-relevant detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the schema already documents the auth variants and parameter shapes, and the description mostly echoes the omit-fallbacks for auth/baseUrl. It does add routing value by enumerating the built-in and operator-configured aliases and clarifying that aliases are shortcuts only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (open a connection to a BrAPI v2 server, authenticate) and names the return payload (orientation envelope). It clearly distinguishes itself from the 20 sibling brapi_* tools, which operate on already-connected aliases rather than establishing one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call it -- to connect any server by baseUrl, to pass auth, or to re-point an alias -- and contrasts that with the default behavior of other tools, which auto-connect configured aliases on first use. Even enumerates the currently callable known servers and operator aliases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_dataframe_describeBrapi Dataframe DescribeARead-onlyIdempotentInspect
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. On a shared HTTP endpoint without per-caller auth, listing without a name is available only where each MCP session has its own workspace, and never to a request without a session; pass a known name instead.
| Name | Required | Description | Default |
|---|---|---|---|
| dataframe | No | When set, return only the named dataframe. Omit to list all dataframes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| tables | No | All described dataframes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/closed-world, but the description adds genuinely new behavioral context: a shared HTTP endpoint without per-caller auth only permits nameless listing where each MCP session owns a workspace, and never for a sessionless request. That access-control nuance is real value, though the sentence is dense enough to be hard to parse on first read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the entry-point cue; every sentence carries information. The final sentence is overloaded with nested conditions (auth mode, workspace-per-session, no-session requests), which slightly hurts readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation here. The description covers the one parameter's origin, the ordering relative to brapi_dataframe_query, and the availability constraint — nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents omission-vs-set behavior, so the baseline is 3. The description goes further by explaining where the value comes from ('result.dataframe.tableName' on spilled find_* responses), which the schema cannot express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists dataframes (or describes one)') plus exactly what it returns: columns, row counts, and originating-source provenance. It is clearly distinguishable from brapi_dataframe_query, which it names and positions itself ahead of.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit timing ('Start here after a spillover'), the trigger condition (a find_* response that spilled), and the sequencing rule ('inspect schema and provenance before writing the first brapi_dataframe_query'). It also states when listing without a name is unavailable and what to do instead (pass a known name).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_dataframe_queryBrapi Dataframe QueryAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | SELECT statement against dataframes. Single statement only — writes, DDL, DESCRIBE / SUMMARIZE, file reads, and exports are rejected. Use brapi_dataframe_describe to discover available dataframes. SQL is the primary paging idiom: use `LIMIT/OFFSET` to walk a large dataframe, projection to trim columns, and aggregation (`COUNT`, `GROUP BY`, `AVG`) to summarize without materializing every row. | |
| preview | No | Cap the number of rows returned in this response. A value above `rowLimit` (or, when `rowLimit` is omitted, above the deployment-wide response cap) returns rows up to that ceiling. When omitted, the ceiling applies. Lower this with `registerAs` when you only need a sample to verify the query. | |
| rowLimit | No | 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. | |
| registerAs | No | Persist the full result as a new dataframe under this name. The response is bounded by preview and a 24,000-byte row budget. Conflicts fail — choose a different name, or remove the existing dataframe with brapi_dataframe_drop where this deployment enables it. Identifier rules: letters, digits, and underscores; must start with a letter or underscore; max 63 characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Row ceiling that bound the response: the smallest of preview, rowLimit, and the deployment-wide response cap. |
| rows | No | Leading rows bounded by preview/rowLimit and 24,000 bytes on each serialized row representation. May be empty when the first row is oversized. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Rows materialized into `rows`. |
| notice | No | Guidance for reaching the rows this response left out. |
| columns | No | Column names and types in projection order, enough to write a follow-up query. |
| rowCount | No | Total rows the query produced (may exceed `rows.length` when capped). |
| dataframe | No | Name of the dataframe holding the full result, populated when `registerAs` was supplied. Reference this name in follow-up queries. |
| truncated | No | True when the response carries fewer rows than the query produced. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are thin (readOnlyHint=false, openWorldHint=false, idempotentHint=false), so the description carries most of the burden and does it well: SELECT-only enforcement, the exact rejected statement classes, and the registerAs chaining side effect. It stops short of naming error/conflict modes or cost characteristics, which caps it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the workflow that precedes it; each sentence carries distinct information (workflow, alternative tool, constraints, paging idiom, chaining). Slightly dense with back-to-back imperatives, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a SQL-execution tool with an output schema already covering return shape, the description supplies everything else an agent needs: how dataframes come to exist, where to find their names, the allowed statement class, the paging strategy, and how to persist results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so preview, rowLimit, and registerAs are already fully documented in structured form; baseline 3 applies. The description adds only marginal value, framing registerAs as a chaining mechanism, but does not explain preview/rowLimit tradeoffs beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run SQL across in-memory dataframes') and immediately grounds it in the find_* spill workflow, which distinguishes it from every sibling. An agent can tell it apart from brapi_dataframe_describe and the find_* tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit end-to-end flow (find_* → read result.dataframe.tableName → query here) and names the alternative (brapi_dataframe_describe) with the condition that selects it (inspect schema/provenance for a known name). Chaining via registerAs is also spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_describe_filtersBrapi Describe FiltersARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endpoint | Yes | BrAPI endpoint to describe filters for. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| filters | No | Filter catalog entries. |
| endpoint | No | The endpoint the filters apply to. |
| filterCount | No | Number of filters in the catalog. |
| specReference | No | Pointer to the BrAPI v2 spec section for this endpoint. |
| availableEndpoints | No | Every endpoint this tool can describe — useful for discovery. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and idempotent, so the description only needs to add beyond that. It adds a meaningful caveat that entries reflect the BrAPI v2.1 spec and that individual servers may implement subsets, preventing agents from assuming server-specific support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first states scope and purpose, the second adds the spec/subset caveat. Every sentence earns its place and the main action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity lookup with one enum-constrained parameter, read-only/idempotent annotations, and an output schema, the description conveys what the tool is, where it fits, and a key limitation. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the single endpoint parameter with a 100% coverage enum list and its own description, so the description adds little parameter-level detail. The parenthetical endpoint list mirrors the enum values; the extraFilters context is useful but not necessary to understand the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('List') and resource ('valid filter names for a BrAPI endpoint'), enumerates the supported endpoints, and positions itself as a companion to the find_* tools. This clearly distinguishes it from the query and retrieval tools in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the intended context: use it as a companion lookup for the extraFilters passthrough on any find_* tool. It does not provide explicit when-not-to-use guidance or compare it to an alternative tool, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_export_genotype_matrixBrapi Export Genotype MatrixARead-onlyInspect
Pull genotype calls for a germplasm × variant set and pivot them into a matrix. matrix-json registers a wide canvas dataframe; vcf-lite adds VCF-subset text in vcf; plink adds .ped/.map text in ped/map. Text formats pull /variants metadata and convert zero-based BrAPI start to one-based positions; missing/invalid positions use ./0. Read the dataframe with brapi_dataframe_describe and brapi_dataframe_query (SQL). variantColumnLegend maps SQL-safe columns to original variant IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| format | Yes | 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. | |
| maxCalls | No | Lower the pull cap for this call. Omit to use the deployment ceiling. Cannot raise it: a value above the deployment ceiling is clamped down to it and the effective cap is reported in `warnings`. | |
| maxColumns | No | Lower the distinct-variant column cap for this call. Omit to use the deployment ceiling. Cannot raise it: a value above the deployment ceiling is clamped down to it. When the variant set resolves more distinct variants than the effective cap, the matrix is capped at that many variant columns, `truncated` is set, and the effective cap is reported in `warnings`. Independent of `maxCalls`, which bounds the row (call) pull. | |
| germplasmDbIds | No | Restrict to these germplasm. Omit to pull all germplasm in the variant set (use with caution on large sets). | |
| variantSetDbId | Yes | Variant set to pull calls for. Required. List variant sets with brapi_raw_get({ path: "/variantsets" }) — add params.studyDbId to narrow to one study or genotyping project — and read variantSetDbId from the rows. |
Output Schema
| Name | Required | Description |
|---|---|---|
| map | No | PLINK .map text — chromosome, variant ID, genetic-distance placeholder 0, and one-based position (BrAPI start + 1). Missing/invalid coordinates use `0`. Present for format="plink". |
| ped | No | 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 verbatim; PLINK missing is `0`. |
| vcf | No | VCF-lite text — header `#CHROM POS ID REF ALT` plus genotype columns. One-based POS is BrAPI start + 1; missing/invalid coordinates use ".". Present for format="vcf-lite". |
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| format | No | The output format that was produced. |
| notice | No | The matrix dataframe and the tools that read it. |
| rowCount | No | Number of call-set (germplasm) rows in the matrix. |
| warnings | No | Advisory messages (truncation, missing fields, etc.). |
| dataframe | No | The wide germplasm × variant matrix, staged for every format; brapi_dataframe_export writes it to a file where that tool is listed. vcf, ped, and map serialize the same data. |
| truncated | No | True when the matrix is not the complete upstream result: the call pull reached the effective maxCalls cap or ran out of time before the last page, or more distinct variants came back than the effective maxColumns cap. `warnings` names which. |
| columnCount | No | Number of variant columns in the matrix (excluding the germplasm ID column). |
| callFormatting | No | Genotype-encoding hints echoed by the server. |
| variantColumnLegend | No | SQL-safe dataframe column name → original variantDbId. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations by disclosing side effects (registering a wide canvas dataframe; populating `vcf` or `ped`/`map` text) and data-transformation rules (text formats pull /variants metadata, zero-based BrAPI start converted to one-based, missing/invalid positions → `.`/`0`). It does not describe failure modes or permission requirements, but the safety profile is already annotation-covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then layers format behavior, transformation semantics, and consumption path in tight sentences with no filler. Dense backtick-heavy phrasing makes it slightly harder to scan than a cleaner split would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be restated, and the description still supplies the pieces an agent needs: format outcomes, coordinate conversion, and how to read the resulting dataframe. The remaining gap is routing relative to the raw-call sibling tool, which is not addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning by explaining the consequences of each `format` enum value and by naming `variantColumnLegend` as the mapping from SQL-safe columns to original variant IDs. Caps for maxCalls/maxColumns are left to the schema, which already covers them in detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Pull genotype calls for a germplasm × variant set and pivot them into a matrix') and enumerates what each format produces, so the output shape is unambiguous. It does not, however, contrast itself with the sibling that returns raw calls (brapi_find_genotype_calls), so sibling differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: the three format modes and their side effects, plus the explicit next step of reading the registered dataframe with brapi_dataframe_describe / brapi_dataframe_query. It stops short of stating when to prefer this pivoted export over brapi_find_genotype_calls, and offers no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_find_genotype_callsBrapi Find Genotype CallsARead-onlyInspect
Pull genotype calls for a germplasm × variant set. Filter to bound cost — at minimum, set variantSetDbId or germplasmDbIds. The upstream pull is capped by deployment policy; when the pull is truncated, narrow the filters. results[] holds the leading calls up to loadLimit and a 24,000-byte budget; when it holds fewer than were collected, every collected call is materialized as a dataframe — read it with brapi_dataframe_describe and brapi_dataframe_query (SQL) instead of paging row-by-row.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| loadLimit | No | Cap on rows returned inline. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any call was collected. When results[] holds fewer rows than were collected, every collected call lands in a dataframe — query it with brapi_dataframe_query (SQL) for the rest. Upstream pageSize is fixed for genotype calls, so this knob only affects the inline preview here (no spillover capacity tradeoff). | |
| callFormat | No | Requested call-encoding format, when the server honors it. | |
| callSetDbIds | No | Restrict to these call sets directly. | |
| variantDbIds | No | Restrict to specific variants. | |
| germplasmDbIds | No | Restrict to these germplasm (call sets). | |
| variantSetDbId | No | Scope calls to a single variant set. Strongly recommended. List variant sets with brapi_raw_get({ path: "/variantsets" }) — add params.studyDbId to narrow to one study or genotyping project — and read variantSetDbId from the rows. | |
| variantSetDbIds | No | Alternative: multiple variant sets at once, found the same way. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The effective loadLimit when results[] was cut short; shown is below it when the 24,000-byte inline budget bound first (notice says which). |
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Length of results[] when loadLimit or the inline byte budget cut it short of the collected calls. |
| notice | No | Why no calls were returned, or which bound cut results[] short and the dataframe holding every collected call. |
| hasMore | No | True when the pull stopped early: the deployment pull limit fired (`truncated`), or time for upstream requests ran out before the last page (`warnings` says so). Unlike the filter finders, it ignores the inline cut — shown and cap report that. |
| results | No | Leading collected call rows, up to loadLimit and a 24,000-byte budget, whichever binds first. |
| warnings | No | Advisory messages (truncation, capability gaps, partial pulls). |
| dataframe | No | Every collected call, staged when results[] holds fewer rows than were collected. |
| truncated | No | True when the deployment-wide pull limit was reached and more calls exist upstream. Narrow the filters and re-pull. |
| totalCount | No | Total calls collected across all pages (below the upstream total when `hasMore` is true: the deployment-wide pull limit fired, or the upstream deadline ended the pull). |
| distributions | No | Value frequency per field across the full collected call set. |
| returnedCount | No | Length of results[]. |
| appliedFilters | No | The body sent to POST /search/calls (variant/germplasm/call-set scope plus pageSize). |
| callFormatting | No | Genotype-encoding hints echoed by the server. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare only readOnlyHint and openWorldHint. The description goes well beyond them, disclosing the deployment-policy cap on the upstream pull, truncation semantics, the 24,000-byte inline budget, and the fact that a truncated result materializes all collected calls as a dataframe. This is real behavioral context an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and then the binding constraint, with no filler sentences. Mild redundancy: the dataframe fallback is explained in the description body and again in the loadLimit schema description, so the text is slightly longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, zero-required read tool with an output schema, the description covers what the schema cannot: the cost-bounding requirement, truncation behavior, and the handoff to dataframe tooling. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description nevertheless adds usage-level meaning the schema lacks: which parameters constitute the minimum viable filter, and that loadLimit only affects the inline preview because upstream pageSize is fixed for genotype calls. That extra framing earns above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Pull genotype calls for a germplasm × variant set'), which is precise enough to distinguish it from generic finders like brapi_find_variants. It does not name the nearest sibling, brapi_export_genotype_matrix, so an agent must infer the difference between previewing calls and exporting a matrix.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes when and how to bind the query ('at minimum, set variantSetDbId or germplasmDbIds') and what to do when results are truncated ('narrow the filters'). It also routes the agent to the correct alternative path (brapi_dataframe_describe / brapi_dataframe_query) instead of paging, which is exactly the when-vs-alternative guidance this dimension rewards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_find_germplasmBrapi Find GermplasmARead-onlyInspect
Find germplasm by name, synonym, accession number, PUI, crop, or free-text query. Matches across registered synonyms. results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when it holds fewer rows than matched, the matched set is materialized as a dataframe — read it with brapi_dataframe_describe and brapi_dataframe_query (SQL) instead of paging row-by-row.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Free-text query. Applied client-side as a case-insensitive substring match on germplasmName, germplasmPUI, accessionNumber, defaultDisplayName, and registered synonyms — no BrAPI server reliably supports a server-side free-text filter. Every upstream row is scanned when the filtered set fits one dataframe walk; above that, a miss on the first page stops the scan, and the warnings report how many rows were checked. Combine with `crops` / `genus` / etc. to narrow the upstream pull first. | |
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| crops | No | Filter by common crop names. | |
| genus | No | Botanical genus. | |
| names | No | Filter by germplasm display names. | |
| species | No | Botanical species. | |
| synonyms | No | Match registered synonyms. | |
| loadLimit | No | Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row. | |
| collections | No | Filter by germplasm collection names. | |
| extraFilters | No | Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict. | |
| germplasmPUIs | No | Persistent unique identifiers. | |
| germplasmDbIds | No | Filter by DbIds. | |
| accessionNumbers | No | Filter by accession numbers (gene-bank catalog codes). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which). |
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Length of results[] when truncated. |
| notice | No | Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows. |
| hasMore | No | True when more rows exist beyond the returned set. |
| results | No | Leading matched germplasm rows, up to loadLimit and a 24,000-byte budget, whichever binds first. |
| warnings | No | Advisory messages (filter overrides, partial data, capability gaps). |
| dataframe | No | The matched rows, staged as a dataframe when results[] holds fewer. |
| truncated | No | True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound. |
| totalCount | No | Total rows reported by the server, else the rows scanned. |
| distributions | No | Value frequency per field across every matched row fetched. |
| returnedCount | No | Length of results[]. |
| appliedFilters | No | Filter map sent upstream (named filters plus extraFilters). |
| refinementHint | No | Suggested refinement when the result set is large. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring readOnlyHint and openWorldHint, the description carries real behavioral load: the 24,000-byte results[] budget, the truncation/dataframe-staging side effect, the fact that no BrAPI server reliably supports server-side free-text filtering, that a miss on the first page stops the scan, and that warnings report checked row counts. It also explains first-use connection semantics for built-in vs registered aliases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose first, then the non-obvious result-handling behavior. The second sentence is packed with subordinate clauses (budget, truncation, dataframe staging, SQL alternative), which is dense but each clause is load-bearing rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter, zero-required search tool with a full output schema, the description covers exactly the parts the schema cannot: result-set capping, truncation, and the fallback to dataframe querying. Return-value documentation is unnecessary given the output schema, and nothing critical to a correct call is omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 by rule. The description names the filter categories matching several parameters but adds little syntax or format detail beyond what the schema fields already state, and the deep operational notes live in the schema's own parameter descriptions rather than the tool description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus the six matchable identifier classes (name, synonym, accession number, PUI, crop, free-text), which is far more than a restatement of the name. It does not explicitly contrast itself with the closest sibling, brapi_get_germplasm, so an agent must infer that this is the multi-criteria search rather than the single-record lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule for the staged-result case: when results[] holds fewer rows than matched, use brapi_dataframe_describe and brapi_dataframe_query rather than paging row-by-row. It does not cover when to prefer this tool over brapi_get_germplasm or how to choose among the many filters, so guidance is clear but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_find_imagesBrapi Find ImagesARead-onlyInspect
Filter images by observation unit, observation, study, descriptive ontology term, file name, or MIME type. Returns metadata only — use brapi_get_image to fetch bytes inline. results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when it holds fewer rows than matched, the matched set is materialized as a dataframe — read it with brapi_dataframe_describe and brapi_dataframe_query (SQL).
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| images | No | Filter by imageDbIds. | |
| studies | No | Filter by studyDbIds. | |
| loadLimit | No | Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row. | |
| mimeTypes | No | Filter by MIME type — e.g. "image/jpeg", "image/png". | |
| extraFilters | No | Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict. | |
| observations | No | Filter by observationDbIds. | |
| imageFileNames | No | Filter by uploaded file name. | |
| observationUnits | No | Filter by observationUnitDbIds. | |
| descriptiveOntologyTerms | No | Filter by ontology tags (e.g. "CO_334:plot"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which). |
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Length of results[] when truncated. |
| notice | No | Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows. |
| hasMore | No | True when more rows exist beyond the returned set. |
| results | No | Leading matched image metadata rows, up to loadLimit and a 24,000-byte budget, whichever binds first. |
| warnings | No | Advisory messages (filter overrides, partial data, capability gaps). |
| dataframe | No | The matched rows, staged as a dataframe when results[] holds fewer. |
| truncated | No | True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound. |
| totalCount | No | Total rows reported by the server, else the rows scanned. |
| distributions | No | Value frequency per field across every matched row fetched. |
| returnedCount | No | Length of results[]. |
| appliedFilters | No | Filter map sent upstream (named filters plus extraFilters). |
| refinementHint | No | Suggested refinement when the result set is large. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds substantial context: metadata-only return, the 24,000-byte inline budget, the loadLimit cap with 'at least one row' guarantee, and the dataframe materialization when results are truncated. This goes well beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, followed by usage routing and then result-handling behavior. Every sentence carries useful information, though the third sentence is dense with multiple clauses and could be slightly more scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, but it proactively covers the critical truncation/dataframe fallback and metadata-only nature. Combined with rich schema and annotations, an agent has everything needed to invoke and follow up correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all ten parameters in detail. The description lists the filter fields but adds no syntax, format, or precedence rules beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (filter) and resource (images) and enumerates the filter dimensions. It explicitly distinguishes itself from brapi_get_image by clarifying that it returns metadata only, so an agent can tell the two apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative for fetching bytes (brapi_get_image) and gives clear routing instructions for truncated results (brapi_dataframe_describe/query). However, it does not explicitly state when to prefer this tool over other image-related lookup tools or raw_search/raw_get, so it falls short of a full when/when-not/alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_find_locationsBrapi Find LocationsARead-onlyInspect
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 no first-page row falls inside it under the spec GeoJSON [lon, lat, alt] reading and a row carries a Point geometry, bbox is retried with axes swapped; if that matches, the swapped reading is used (non-conformant servers store [lat, lon, alt]) with a warning and coordinateAxisOrder: "swapped". results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when it holds fewer rows than matched, the matched set is materialized as a dataframe — read it with brapi_dataframe_describe and brapi_dataframe_query (SQL).
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | Optional post-fetch bounding box. Nonempty boxes require all four bounds with minimum <= maximum; malformed boxes fail. An empty object is omitted. | |
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| loadLimit | No | Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row. | |
| locations | No | Filter by locationDbIds. | |
| countryCodes | No | Country codes; alphabetic codes are uppercased, numeric upstream codes are preserved. | |
| countryNames | No | English country names or aliases (e.g. "Uganda", "United States", "USA") resolved to alpha-3 codes and merged into countryCodes. Unresolved names warn when another effective country restriction remains; otherwise the call fails. Prefer countryCodes when known. | |
| extraFilters | No | Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict. | |
| abbreviations | No | Short location abbreviations. | |
| locationNames | No | Filter by display name. | |
| locationTypes | No | Location type — e.g. "Research Station", "Field". |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which). |
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Length of results[] when truncated. |
| notice | No | Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows. |
| hasMore | No | True when more rows exist beyond the returned set. |
| results | No | Leading matched location rows, up to loadLimit and a 24,000-byte budget, whichever binds first. A bbox filter applies before the cut, across every page scanned. |
| warnings | No | Advisory messages (unresolved country names, filter overrides, capability gaps). |
| dataframe | No | The matched rows, staged as a dataframe when results[] holds fewer. |
| truncated | No | True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound. |
| totalCount | No | Total rows reported by the server, else the rows scanned; with an active bbox, the scanned rows inside it. |
| distributions | No | Value frequency per field across every matched row fetched. |
| returnedCount | No | Length of results[] after any bbox filtering. |
| appliedFilters | No | Filter map sent upstream (named filters plus extraFilters). |
| refinementHint | No | Suggested refinement when the result set is large. |
| coordinateAxisOrder | No | Axis order used to read GeoJSON Point coordinates: "spec" is RFC 7946 [lon, lat, alt?]; "swapped" means the upstream stores [lat, lon, alt?] and bbox and rendered coordinates used that order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only readOnlyHint/openWorldHint, and the description adds substantial behavior the annotations do not: client-side resolution of countryNames to alpha-3 (with warn-vs-fail semantics on unresolved names), a bbox retry with swapped axes when no first-page row falls inside, the `coordinateAxisOrder: "swapped"` marker plus warning, and the 24,000-byte inline budget with dataframe staging on truncation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and filter facets before the operational caveats, and every sentence carries information. It is dense, and the loadLimit/24,000-byte/budget material partly restates the loadLimit schema description, which is a minor waste rather than a structural flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, nested-schema, open-world read tool with an output schema, the description covers the complications an agent could not infer: country name resolution failure modes, non-conformant coordinate ordering, inline row budget, and the dataframe escape hatch when results are truncated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, and the description goes beyond the schema by explaining the countryNames→countryCodes merge and precedence, and the bbox axis-order fallback that changes what the bbox parameter actually does. The remaining params (abbreviations, locationNames, locationTypes, locations) are left to the schema, which is reasonable given its quality.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb ('Find') plus a precisely scoped resource ('research stations / field sites' / locations) and enumerates the filterable facets (country, abbreviation, type, location ID, free-text). The resource is unambiguous against siblings such as brapi_find_germplasm, brapi_find_studies, and brapi_find_images, so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real routing guidance: prefer countryCodes when the code is known, and when results[] is truncated, materialize and read the matched set via brapi_dataframe_describe/brapi_dataframe_query rather than paging. It offers no explicit 'when-not' or statement of when another find_* tool is the better choice, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_find_observationsBrapi Find ObservationsARead-onlyInspect
Pull observation records filtered by study, germplasm, variable, season, or observation unit. Without a studies, trials, observationUnits, or observations anchor, a GET query first runs a one-row count probe and skips the bulk pull (warnings says so) when the probe fails or reports more than 5,000 matches. results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when those bounds cut it short, the matched set is materialized as a dataframe — read it with brapi_dataframe_describe and brapi_dataframe_query (SQL).
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| trials | No | Filter by trialDbIds. | |
| seasons | No | Filter by seasonDbIds (e.g. "2022"). | |
| studies | No | Filter by studyDbIds. | |
| programs | No | Filter by programDbIds. | |
| germplasm | No | Filter by germplasmDbIds. | |
| loadLimit | No | Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row. | |
| variables | No | Filter by observationVariableDbIds. | |
| timestampTo | No | ISO 8601 end of the observation-time window. | |
| extraFilters | No | Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict. | |
| observations | No | Filter by observationDbIds. | |
| timestampFrom | No | ISO 8601 start of the observation-time window. | |
| observationUnits | No | Filter by observationUnitDbIds. | |
| observationLevels | No | Observation unit level (plot, plant, field, etc.). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which). |
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Length of results[] when truncated. |
| notice | No | Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows. |
| hasMore | No | True when more rows exist beyond the returned set. |
| results | No | Leading matched observation rows, up to loadLimit and a 24,000-byte budget, whichever binds first. |
| warnings | No | Advisory messages (filter overrides, partial data, capability gaps). |
| dataframe | No | The matched rows, staged as a dataframe when results[] holds fewer. |
| truncated | No | True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound. |
| totalCount | No | Upstream observation total, or the matched observations collected on the embedded-unit route; warnings disclose incomplete scans. |
| distributions | No | Value frequency per field across every matched row fetched. |
| returnedCount | No | Length of results[]. |
| appliedFilters | No | Upstream filter map, or separate upstreamRequests and clientSide criteria for embedded-unit collection. |
| refinementHint | No | Suggested refinement when the result set is large. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, the description discloses non-obvious runtime behavior: the count-probe fallback, the 5,000-match skip threshold, the interplay of loadLimit with a 24,000-byte budget, minimum-one-row retention, and dataframe materialization with truncation marking. This is exactly the behavioral context an agent needs that annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose and filters, then the probe behavior, then the dataframe fallback — a logical order. The middle sentence is dense, but each clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, openWorld, nested-object tool with an output schema, the description covers purpose, the anchor requirement, result bounds, and the recovery workflow. Return values need not be explained since an output schema exists, and the remaining gaps (e.g., extraFilters interactions, alias selection) are covered by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 14 parameters in detail, establishing a baseline of 3. The description restates the main filter axes but adds no syntax or format detail beyond what the schema provides for parameters like alias, extraFilters, or timestamps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource — 'Pull observation records' — and enumerates the filter dimensions (study, germplasm, variable, season, observation unit). This is clearly distinct from sibling retrieval tools such as brapi_find_studies, brapi_find_germplasm, or brapi_find_images.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a concrete usage condition: without a studies/trials/observationUnits/observations anchor, a one-row count probe runs and the bulk pull is skipped under certain conditions. It also routes the agent to brapi_dataframe_describe/query when results are truncated. However, it never explicitly contrasts this tool with alternative finders or states when-not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_find_studiesBrapi Find StudiesARead-onlyInspect
Locate studies matching crop, trial type, season, location, or program. Enriches results with program/trial/location context in one call. results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when it holds fewer rows than matched, the matched set is materialized as a dataframe — read it with brapi_dataframe_describe and brapi_dataframe_query (SQL).
| Name | Required | Description | Default |
|---|---|---|---|
| crop | No | Filter by common crop name (single value). | |
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| active | No | Restrict to active / inactive studies. | |
| trials | No | Filter by trialDbIds. | |
| seasons | No | Filter by seasons (e.g. "2022"). | |
| programs | No | Filter by programDbIds. | |
| loadLimit | No | Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row. | |
| locations | No | Filter by locationDbIds (server-side identifiers, not display names). On servers that ignore this filter on /studies, it is applied client-side over the scanned studies, and a study with no locationDbId never matches. | |
| studyNames | No | Filter by study display name. | |
| trialTypes | No | Filter by study types. | |
| extraFilters | No | Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which). |
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Length of results[] when truncated. |
| notice | No | Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows. |
| hasMore | No | True when more rows exist beyond the returned set. |
| results | No | Leading matched rows, up to loadLimit and a 24,000-byte budget, whichever binds first. |
| warnings | No | Advisory messages (filter overrides, partial data). |
| dataframe | No | The matched rows, staged as a dataframe when results[] holds fewer. |
| truncated | No | True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound. |
| totalCount | No | Total rows reported by the server, else the rows scanned; with `locations` applied client-side, the matched rows fetched. |
| distributions | No | Value frequency per field across every matched row fetched. |
| returnedCount | No | Length of results[]. |
| appliedFilters | No | Filter map sent upstream (named filters plus extraFilters). |
| refinementHint | No | Suggested refinement when the result set is large. |
| clientSideFilters | No | Filters this server ignores on /studies, applied to the scanned rows instead of sent upstream, keyed by input name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint and openWorldHint, and the description adds genuinely non-obvious behavior: a 24,000-byte inline budget, the 'keeps at least one row when any matched' guarantee, dataframe materialization on truncation, and a truncation marker when the upstream walk stops short. This is exactly the kind of operational detail annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose and filter dimensions, then results semantics and the fallback route. Dense but every clause carries information; the middle sentence is long and could be split, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, yet the description still supplies the crucial workflow fact that results[] can be a truncated leading slice backed by a queryable dataframe. Combined with the alias and extraFilters documentation in the schema, an agent has what it needs; only explicit sibling contrasts are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 11 parameters, including loadLimit's budget and truncation semantics and locations' client-side fallback. The description's filter list and loadLimit sentence largely restate what the schema says, adding little new per-parameter meaning; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb ('Locate') and resource ('studies') plus the five filter dimensions, so an agent immediately knows this is the studies finder rather than the germplasm/location/variant finders. It does not explicitly contrast itself with the sibling single-record tool brapi_get_study, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states the follow-up path: when results[] is smaller than the matched set, the rows are staged in a dataframe and should be read with brapi_dataframe_describe / brapi_dataframe_query rather than paging row-by-row. That is explicit routing guidance, but there is no statement of when *not* to use this tool (e.g., fetching one known study).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_find_variablesBrapi Find VariablesARead-onlyInspect
Find observation variables (traits) by name, trait class, ontology term, or free-text query. Free-text queries are ranked against every fetched row by PUI, name, synonym, and trait text; a candidate carries the ontology PUI of its row as termId when the row has one. results[] holds the leading rows up to loadLimit and a 24,000-byte budget; when it holds fewer rows than matched, the matched set is materialized as a dataframe — read it with brapi_dataframe_describe and brapi_dataframe_query (SQL).
| Name | Required | Description | Default |
|---|---|---|---|
| crop | No | Filter by common crop name (single value). | |
| text | No | Free-text query. Ranks **every row the call fetched** (the whole dataframe walk, not just the first page) via the ontology resolver, then fills results[] — up to loadLimit and the 24,000-byte budget — with matches first and unmatched rows for context. Use exact filters (`variables`, `variableNames`, `variablePUIs`, `traitClasses`, `ontologies`) to actually narrow the upstream pull. Differs from `brapi_find_germplasm.text`, which drops unmatched rows. | |
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| scales | No | Filter by scaleDbIds. | |
| methods | No | Filter by methodDbIds. | |
| studies | No | Filter by studyDbId. Multiple distinct studies are collected under shared page, row and time budgets and unioned by variable ID with studyDbIds provenance; studyCoverage reports incomplete studies. | |
| loadLimit | No | Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row. | |
| variables | No | Filter by observationVariableDbIds. | |
| ontologies | No | Filter by ontologyDbIds. | |
| extraFilters | No | Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict. | |
| traitClasses | No | Filter by trait class. | |
| variablePUIs | No | Filter by persistent ontology URIs. | |
| variableNames | No | Filter by exact observationVariableNames. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which). |
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Length of results[] when truncated. |
| notice | No | Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows. |
| hasMore | No | True when more rows exist beyond the returned set. |
| results | No | Leading variables, capped by loadLimit and 24,000 bytes. Text candidates lead; nested objects with no non-empty field are omitted. |
| warnings | No | Advisory messages (filter overrides, partial data, capability gaps). |
| dataframe | No | Matched rows, staged when results[] holds fewer. |
| truncated | No | True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound. |
| totalCount | No | Total rows reported by the server, else the rows scanned. |
| distributions | No | Value frequency per field across every matched row fetched. |
| returnedCount | No | Length of results[]. |
| studyCoverage | No | Multi-study coverage; incomplete studies may omit variables. |
| appliedFilters | No | Filter map sent upstream (named filters plus extraFilters). |
| refinementHint | No | Suggested refinement when the result set is large. |
| ontologyCandidates | No | Ranked free-text candidates; empty without text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description goes well beyond them by disclosing the ranking keys (PUI, name, synonym, trait text), the termId population rule, the dual results[] caps (loadLimit plus a 24,000-byte budget), the minimum-one-row guarantee, and the dataframe materialization fallback. These are exactly the behavioral traits an agent cannot infer from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the find purpose before the ranking and dataframe mechanics. Every clause carries information, though the middle sentence packs ranking, termId, and budget rules together in a way that rewards careful reading over scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter, optional-only search tool with a nested extraFilters object and an output schema, the description covers the non-obvious parts: what free-text actually does, how results[] truncates, and how to retrieve the rest. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each of the 13 params carries its own documentation, so the schema does the heavy lifting. The description reinforces the free-text semantics and the loadLimit/byte-budget interaction, but adds little that the schema does not already say — baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Find observation variables (traits)") and enumerates the filter axes: name, trait class, ontology term, free-text. It does not, however, differentiate itself from the many sibling find_* tools (e.g. brapi_find_observations, brapi_find_germplasm) — that differentiation appears only in the text param's schema description, not here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operating guidance: free-text ranks all fetched rows and fills results[] with matches first, and when results[] is short of the matched set the caller must switch to brapi_dataframe_describe / brapi_dataframe_query rather than paging. That is real when-to-use routing, but it never states when to prefer this tool over sibling search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_find_variantsBrapi Find VariantsARead-onlyInspect
Find variant records by variant set, reference sequence, or genomic region (start/end, 0-based inclusive / exclusive per the BrAPI spec; servers may differ). results[] holds the leading matches up to loadLimit and a 24,000-byte budget; when it holds fewer rows than matched, the matched set is materialized as a dataframe — read it with brapi_dataframe_describe and brapi_dataframe_query (SQL).
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Window end, 0-based exclusive. | |
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| start | No | Window start, 0-based inclusive. | |
| variants | No | Filter by variantDbIds. | |
| loadLimit | No | Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row. | |
| references | No | Filter by referenceDbIds. | |
| variantSets | No | Filter by variantSetDbIds. | |
| extraFilters | No | Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict. | |
| referenceName | No | Reference display name (e.g. "chr01", "chr1"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which). |
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Length of results[] when truncated. |
| notice | No | Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows. |
| hasMore | No | True when more rows exist beyond the returned set. |
| results | No | Leading matched variant rows, up to loadLimit and a 24,000-byte budget, whichever binds first. |
| warnings | No | Advisory messages (filter overrides, partial data, capability gaps). |
| dataframe | No | The matched rows, staged as a dataframe when results[] holds fewer. |
| truncated | No | True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound. |
| totalCount | No | Total rows reported by the server, else the rows scanned. |
| distributions | No | Value frequency per field across every matched row fetched. |
| returnedCount | No | Length of results[]. |
| appliedFilters | No | Filter map sent upstream (named filters plus extraFilters). |
| refinementHint | No | Suggested refinement when the result set is large. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint and openWorldHint, but the description adds real behavioral detail: a 24,000-byte inline budget, the loadLimit cap, a guaranteed minimum of one row, and the dataframe staging with a truncation marker when the upstream walk stops short. That is substantial disclosure beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with what the tool finds and what happens to results. Both sentences earn their place, though the second is information-packed and could be easier to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be re-explained, and the description still covers the key non-obvious behavior: truncation, the dataframe handoff, and coordinate conventions. What is missing is guidance on choosing this tool over sibling find_* tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds value on coordinates by flagging that start/end follow 0-based inclusive/exclusive per the BrAPI spec and that servers may differ. It also clarifies the results[]/loadLimit interaction, but does not elaborate on the array or extraFilters params beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Find) and resource (variant records) plus the three axes of filtering: variant set, reference sequence, and genomic region. This clearly separates it from siblings like brapi_find_genotype_calls, brapi_find_germplasm, and brapi_find_observations, which target different record types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description routes the agent to brapi_dataframe_describe and brapi_dataframe_query when results[] is truncated instead of paging, and extraFilters points to brapi_describe_filters. It gives clear context for the truncation path but offers no explicit guidance on when to prefer this tool over other find_* searches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_germplasm_performanceBrapi Germplasm PerformanceARead-onlyInspect
Aggregate a single germplasm's observations across studies, returning per-variable statistics (n, mean, median, sd, min, max), contributing studies, seasons, and collection coverage. SGN/Breedbase uses advertised germplasm-scoped observation units with embedded measurements, including zeros. Other servers discover up to 200 studies before pulling per study. Pass studyDbIds to skip discovery and restrict collection to known studies. Per-study observation limits, page limits, failures, and incomplete scans appear in coverage and warnings. For the underlying matrix, use brapi_build_phenotype_matrix.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| variables | No | Optional subset of observationVariableDbIds to aggregate. Omit to include every variable observed for the germplasm. | |
| studyDbIds | No | Optional studyDbIds to restrict collection to known studies and skip automatic discovery. Omit to walk germplasm-scoped embedded units on SGN/Breedbase, or discover up to 200 studies on other servers. Find known study IDs with brapi_find_studies; some servers ignore its germplasm filter. | |
| germplasmDbId | Yes | The germplasmDbId to summarize performance for. |
Output Schema
| Name | Required | Description |
|---|---|---|
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| coverage | No | Collection coverage, independent of the number of contributing studies. |
| warnings | No | Advisory messages (study-discovery limits, dropped filters, fallback paths, per-study failures, partial study scans). |
| studyCount | No | Number of distinct studies that contributed any observation. |
| studyDbIds | No | Distinct studyDbIds that contributed observations. |
| perVariable | No | Per-variable aggregates, sorted by observationVariableDbId. |
| germplasmDbId | No | The germplasm that was analyzed. |
| germplasmName | No | Display name of the germplasm, when the server provides one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description goes well beyond by disclosing the discovery cap (200 studies), that per-study observation limits, page limits, failures, and incomplete scans surface in coverage and warnings, and that zeros are included in embedded measurements. This is exactly the kind of partial-result behavior an agent needs to interpret output correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, all front-loaded with purpose then routing then caveats; nothing is redundant boilerplate. Slightly dense, and the trailing 'For the underlying matrix' sentence could arguably sit earlier next to the sibling comparison, but it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, yet the description still characterizes coverage/warnings semantics that a schema alone would not convey. Discovery limits, partial-data behavior, and the alternative tool are all covered, leaving no material gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds meaning by explaining that studyDbIds skips automatic discovery (not just 'restricts studies') and that omitting variables includes every observed variable. The alias parameter is documented thoroughly in the schema itself and needs no description help.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Aggregate a single germplasm's observations across studies') and enumerates the exact return shape (n, mean, median, sd, min, max, contributing studies, seasons, coverage). It also explicitly names the sibling brapi_build_phenotype_matrix as the tool for the underlying matrix, so an agent can separate the two without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States a concrete decision rule: pass studyDbIds to skip discovery and restrict collection, otherwise the server walks embedded units (SGN/Breedbase) or discovers up to 200 studies. It also routes the agent to brapi_build_phenotype_matrix for the raw matrix, and the schema covers finding study IDs via brapi_find_studies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_get_germplasmBrapi Get GermplasmARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| germplasmDbId | Yes | Germplasm identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| parents | No | Direct parents from /germplasm/{id}/pedigree. |
| warnings | No | Advisory messages — failed sub-endpoint lookups, missing counts. |
| germplasm | No | Canonical germplasm record as returned by `/germplasm/{id}`. |
| attributes | No | Germplasm attributes from /germplasm/{id}/attributes. |
| studyCount | No | How many studies this germplasm has appeared in. |
| directParentCount | No | Length of parents[]; 0 also when the pedigree lookup is unsupported or failed. |
| directDescendantCount | No | Count of direct descendants from /germplasm/{id}/progeny. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds that the response includes companion counts (study count, direct parent count, direct descendant count) and interprets them as signals of pedigree depth and observation coverage — useful context, but nothing about auth/alias behavior or limitations beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the core action and scope; the second sentence explains response context. Nothing is wasted, though the response-companion sentence is arguably redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-record read tool with full annotation coverage (readOnly, idempotent), full schema coverage, and an existing output schema, the description supplies enough to call it correctly. The return-value interpretation is extra rather than necessary, and there is no routing to brapi_walk_pedigree for deeper ancestry traversal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (alias and germplasmDbId) are already fully documented in the schema. The description names DbId but adds no syntax or format meaning beyond what the schema carries, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with scope: 'Fetch a single germplasm by DbId with attributes and direct parents.' The word 'single' and the DbId keying implicitly separate it from the plural sibling brapi_find_germplasm, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by 'single...by DbId' — the agent can infer this is the direct-lookup tool versus brapi_find_germplasm's search, but the description gives no explicit when-to-use, prerequisites, or named alternative. It also doesn't point to brapi_walk_pedigree despite mentioning parent/descendant counts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_get_imageBrapi Get ImageARead-onlyIdempotentInspect
Fetch image bytes for up to 5 imageDbIds and return them inline as type: image content blocks. Falls back to the metadata imageURL when the server lacks dedicated image-content delivery or that request fails. No filesystem side-effects.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| imageDbIds | Yes | 1–5 image identifiers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| errors | No | Images that could not be loaded, one entry per id. |
| images | No | Successfully loaded images. |
| warnings | No | Per-image advisories; non-image MIME responses are errors, not successful images. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful behavior beyond that: inline content-block delivery, an automatic fallback to the metadata imageURL when image-content delivery is unavailable or fails, and an explicit 'no filesystem side-effects' assurance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the primary action front-loaded, the fallback behavior second, and a one-clause side-effect disclaimer last. Nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return format details are not required of the description, and annotations cover mutability. The description covers the key behavioral surprise (fallback) and side-effect status; the only notable omission is routing guidance relative to brapi_find_images.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the alias parameter's long description (default behavior, registered vs built-in aliases, alias stickiness) and the imageDbIds 1–5 constraint are fully documented in the schema. The description only restates the 5-ID cap, adding no semantics beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Fetch image bytes') plus a precise scope ('up to 5 imageDbIds') and the delivery format ('inline as `type: image` content blocks'). It is clearly distinguishable from search-style siblings like brapi_find_images, but it never names a sibling to make the boundary explicit, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the tool takes known imageDbIds, so an agent infers it is a retrieval step after brapi_find_images. The fallback sentence gives a conditional behavior, but there is no explicit 'use this when / not when' guidance or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_get_studyBrapi Get StudyARead-onlyIdempotentInspect
Fetch a single study by DbId with its program, trial, and location records resolved where those lookups succeed. Response includes cheap observation/observation-unit/variable counts as drill-down signals.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| studyDbId | Yes | Study identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| study | No | Canonical study record as returned by `/studies/{id}`. |
| trial | No | Resolved trial record (when the study has a trialDbId and the FK lookup succeeded). |
| program | No | Resolved program record (when the study or parent trial identifies a program and the FK lookup succeeded). |
| location | No | Resolved location record (when the study has a locationDbId and the FK lookup succeeded). |
| warnings | No | Advisory messages — failed FK lookups, missing counts. |
| variableCount | No | 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. |
| observationCount | No | 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 | No | Total observation units (plots, plants, samples) in this study. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds genuinely new behavior: related lookups resolve only 'where those lookups succeed' (partial-failure semantics) and the counts are described as 'cheap', a cost hint. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the primary action front-loaded and the secondary return-value context trailing. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return format need not be explained, and annotations plus full schema coverage carry the rest. The description supplies the partial-resolution caveat and the drill-down framing, leaving only the connection/alias lifecycle to the schema. Complete enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so studyDbId and alias are already fully documented, including the alias reuse rule. The description's 'by DbId' merely restates the required parameter and says nothing about alias, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch a single study by DbId') and scopes it to one record, which implicitly separates it from the plural sibling brapi_find_studies. It also names the resolved sub-records (program, trial, location). It stops short of explicitly naming the sibling it replaces, so a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'drill-down signals' hints at an exploratory use case, and 'single study by DbId' implies you already know the identifier, but there is no statement of when to prefer this over brapi_find_studies or any exclusions/prerequisites. Usage is implied rather than specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_raw_getBrapi Raw GetARead-onlyInspect
Passthrough to BrAPI GET /{path} without foreign-key resolution. List results (result array or result.data) return a leading preview within loadLimit and a 24,000-byte budget on each serialized row representation; an oversized first row returns no inline rows. Omitted fetched rows remain in a dataframe readable with brapi_dataframe_describe and brapi_dataframe_query. Explicit params.page/pageSize fetches only that upstream page, staging it if trimmed. Non-list results and envelope siblings are preserved. Emits a suggestion when a curated tool covers the endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Endpoint path — e.g. "/samples", "/methods". Leading "/" is optional. | |
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| params | No | Query parameters to append. Arrays are repeated per BrAPI convention. | |
| loadLimit | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective loadLimit row ceiling, even when the byte budget binds first. |
| url | No | Fully resolved URL that was fetched (baseUrl + path + query string). |
| path | No | Normalized path (leading `/` preserved) that was appended to the baseUrl. |
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Actual list rows returned inline. |
| notice | No | When a dataframe was staged, its name and the tools that read it. |
| result | No | Raw BrAPI `result` value — whatever shape the endpoint returns. |
| metadata | No | BrAPI envelope metadata (pagination and any additional upstream fields). |
| warnings | No | Advisory messages — present when the dataframe walk stopped before the upstream total. |
| dataframe | No | Every fetched row of a list result, staged when the inline preview omits rows. Explicit paging stages only the requested page. |
| truncated | No | True when the inline list leaves fetched or matching rows out. |
| suggestion | No | Emitted when a curated goal-shaped tool covers this endpoint, or takes the IDs it lists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the real behavioral load and does so thoroughly: leading preview within loadLimit, a 24,000-byte per-row serialization budget, the oversized-first-row edge case returning no inline rows, trimmed rows landing in a dataframe readable via brapi_dataframe_describe/brapi_dataframe_query, page/pageSize staging, and preservation of non-list results and envelope siblings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose sentence, then dense but purposeful detail about row budgets, dataframe fallback, paging, and suggestions. Every sentence carries information, though the byte-budget and staging sentences are packed tightly enough that they read more like spec text than guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the description still supplies the operationally important parts: how much comes back inline, where the remainder goes, how to page, and how the tool behaves for non-list responses. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real semantics beyond the schema — notably that explicit params.page/pageSize fetches only that upstream page and stages it if trimmed, and the inline-vs-dataframe consequence of loadLimit. Alias and params array handling remain schema-only, so it is above baseline but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (GET passthrough) on a specific resource (BrAPI /{path}) and adds a distinguishing scope qualifier: 'without foreign-key resolution'. That qualifier, plus the note that a curated tool may cover the endpoint, separates it from siblings like brapi_raw_search and the brapi_find_* / brapi_get_* family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the usage context clear (raw endpoint access when no curated tool applies) and even notes that a suggestion is emitted when a curated tool covers the endpoint. It stops short of an explicit directive such as 'prefer the curated tool when one exists', so it is clear context without a hard exclusion rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_raw_searchBrapi Raw SearchARead-onlyInspect
Passthrough to BrAPI POST /search/{noun}, polling async search IDs. Sends loadLimit as the initial pageSize unless body.page/pageSize drives explicit paging. List previews fit loadLimit and a 24,000-byte budget on each serialized row representation; an oversized first row returns no inline rows. Every fetched row omitted inline stays in a dataframe readable with brapi_dataframe_describe and brapi_dataframe_query. Explicit paging fetches only the requested page, staging it if trimmed. Non-list results and envelope siblings are preserved; no distributions or foreign-key resolution.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Filter body passed verbatim to POST /search/{noun}. | |
| noun | Yes | Search noun — e.g. "observations", "calls", "germplasm". | |
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| loadLimit | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective loadLimit row ceiling, even when the byte budget binds first. |
| kind | No | Whether the server returned inline results or we polled an async search. |
| noun | No | The `/search/{noun}` segment the body was posted to. |
| alias | No | Connection alias the call used. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Actual list rows returned inline. |
| notice | No | When a dataframe was staged, its name and the tools that read it. |
| result | No | Raw BrAPI `result` value — whatever shape the endpoint returns. |
| metadata | No | BrAPI envelope metadata (pagination and any additional upstream fields). |
| warnings | No | Advisory messages — present when the dataframe walk stopped before the upstream total. |
| dataframe | No | Every fetched row of a list result, staged when the inline preview omits rows. Explicit paging stages only the requested page. |
| truncated | No | True when the inline list leaves fetched or matching rows out. |
| suggestion | No | Emitted when a curated goal-shaped tool covers this search, or takes the IDs it lists. |
| searchResultsDbId | No | Populated when the server returned an async searchResultsDbId. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only covering readOnlyHint/openWorldHint, the description carries real behavioral content: loadLimit is sent as initial pageSize unless body.page/pageSize drives explicit paging; a 24,000-byte serialized-row budget means an oversized first row yields no inline rows; omitted rows are staged in a dataframe queryable via brapi_dataframe_describe/query; explicit paging fetches only the requested page; envelopes are preserved with no distributions or FK resolution. This is unusually rich disclosure of failure modes and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then ordered by operational relevance (paging → row budget → dataframe escape hatch → preservation caveats). Dense but nearly every clause carries information; the packing of multiple constraints into single sentences is tight but readable for an expert agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, nested-body passthrough tool with an output schema, this covers what the agent still needs: how rows are returned or omitted, where omitted data lives, how paging interacts with the limit, and what is deliberately not resolved. Nothing material is left to guesswork.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond it — the loadLimit/pageSize interplay, the byte-budget consequence, and the dataframe fallback path for capped rows. It does not restate noun/body/alias semantics, but it explains the one parameter whose downstream behavior is non-obvious.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb+resource: a passthrough to BrAPI POST /search/{noun} that polls async search IDs. An agent immediately knows this is the low-level raw search rather than a curated find_* helper. It stops short of naming the sibling (e.g. brapi_find_germplasm / brapi_raw_get) it replaces, so differentiation is inferable rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through mechanics — 'passthrough', 'polling async search IDs', 'body passed verbatim' — which signals raw/advanced use, and it points to brapi_dataframe_query for the overflow rows. But there is no explicit when-to-use-this-instead-of-a-find_* tool, no when-not, and no prerequisites for choosing raw search over typed search endpoints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_server_infoBrapi Server InfoARead-onlyIdempotentInspect
Return the full orientation envelope for a BrAPI connection — server identity, capabilities, content counts, suggested finders, and notes. Pass forceRefresh to refetch the cached capability scan; pass an alias to read a non-default connection.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via `brapi_connect` works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| forceRefresh | No | Bypass the cached capability profile and refetch from the server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| auth | No | Auth summary for the active connection. |
| alias | No | Connection alias. |
| error | No | Present when the call failed. Absent on success. |
| notes | No | Server-specific quirks or degradation notes. |
| server | No | Normalized server identity block. |
| baseUrl | No | BrAPI v2 base URL for this connection. |
| content | No | Content summary (crops + optional totals). |
| dialect | No | Active dialect adapter — translates outbound filters and declares known-dead routes for this server. |
| fetchedAt | No | ISO 8601 timestamp of when this envelope was composed. |
| attribution | No | Attribution metadata for built-in known-server connections. Absent when the alias is not built-in or points away from its built-in base URL. |
| capabilities | No | Capability profile derived from /serverinfo or /calls. |
| nextToolSuggestions | No | Entry-point finders (studies, germplasm, variables, locations — in that order) whose GET or POST /search route this server exposes under the active dialect. Empty when none apply. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuine context beyond that: the capability scan is cached and forceRefresh bypasses the cache, and an alias reads a non-default connection. It stops short of describing failure modes or what happens on first-use connection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no waste: the first front-loads what the tool returns, the second covers the two parameters. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. Purpose, parameter effects, and the caching behavior are all covered, which is everything an agent needs to invoke a zero-required-parameter orientation tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — both alias and forceRefresh are fully documented in the input schema, including the alias resolution rules and the default value. The description restates their roles but adds no syntax or format detail beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Return') and resource ('the full orientation envelope for a BrAPI connection'), then enumerates exactly what the envelope contains — server identity, capabilities, content counts, suggested finders, notes. The name and content list make it distinguishable from brapi_connect (which registers aliases) without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the effect of each parameter ('Pass forceRefresh to refetch...', 'pass an alias to read a non-default connection') but never states when an agent should call this tool versus siblings like brapi_connect or the various brapi_find_* tools. Usage is implied by the orientation framing rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brapi_walk_pedigreeBrapi Walk PedigreeARead-onlyInspect
Walk germplasm ancestry or descendancy as a deduplicated DAG with cycle detection and depth limits. leafCount counts graph terminals, confirmedLeafCount counts successfully verified leaves, and frontier records unresolved directions. Nodes and edges each fit loadLimit and a 24,000-byte preview budget; trimmed discovered graphs and already-fetched omitted relatives are staged for brapi_dataframe_describe and brapi_dataframe_query (SQL). Diagrams describe only the discovered graph, never unvisited relatives.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here. | |
| diagram | No | Also return the walk as diagram source: `mermaid` (flowchart) or `dot` (Graphviz). Edges point parent → child, roots are bold, loop-closing edges are dashed. Omit for no diagram. | |
| maxDepth | No | Max generations to walk per direction (default 3, cap 10). | |
| direction | No | Which direction to walk: ancestors (parents), descendants (progeny), or both — the union of the two walks. Ancestors are walked only upward and descendants only downward, so a descendant's other parent is not included. | ancestors |
| loadLimit | No | Row ceiling for each inline graph/frontier preview, also bounded by a 24,000-byte budget. Omit for the deployment default. A first row exceeding the byte budget yields zero preview rows; retrieve narrower projections from the staged dataframe. | |
| germplasmDbIds | Yes | Starting germplasm (1–20 roots). All roots are walked concurrently. |
Output Schema
| Name | Required | Description |
|---|---|---|
| alias | No | Connection alias the call used. |
| edges | No | One edge per discovered pair. Preview independently fits loadLimit and 24,000 bytes for array JSON and serialized row text; edgesDataframe retains omitted rows. |
| error | No | Present when the call failed. Absent on success. |
| nodes | No | Discovered nodes sorted by depth/DbId. Preview fits loadLimit and 24,000 bytes for array JSON and serialized row text; nodesDataframe retains omitted rows. |
| notice | No | Staged graph, frontier or omitted-relative tables and how to read them. |
| diagram | No | Requested Mermaid or DOT for the discovered graph, beyond previews; partial when capped. Omitted with a warning past 50,000 characters, or 500 edges for Mermaid. |
| frontier | No | Bounded preview of unresolved directions; frontierDataframe retains omitted entries. |
| maxDepth | No | The maximum depth the walk was allowed to reach (echoed from the input). |
| warnings | No | Advisory messages (capability gaps, per-node expansion failures, an omitted diagram). |
| direction | No | The direction the walk expanded (echoed from the input). |
| leafCount | No | Non-root nodes with nothing recorded beyond them: ancestors with no parents, descendants with no progeny (a node on both sides needs neither). Includes nodes the depth limit stopped at. |
| rootCount | No | Number of starting germplasm roots. |
| truncated | No | True when the walk hit its safety cap (1000 nodes or 10000 edges) before exhausting depth. |
| cycleCount | No | Number of edges with isCycle: true. Paths that reconverge on one germplasm (shared ancestors, siblings, a parent shared by two roots) are not cycles. |
| deadEndCount | No | Nodes whose upstream pedigree/progeny lookup failed. |
| depthReached | No | Deepest BFS level that produced at least one new edge (0 if only roots were walked). |
| frontierCount | No | Unresolved node/side expansions across the full walk. |
| edgesDataframe | No | Discovered edges when either preview is trimmed; truncated marks partial traversal. SQL renames from to from_; see columnLegend. |
| nodesDataframe | No | Discovered nodes when either preview is trimmed; truncated marks partial traversal. No unvisited relatives. JOIN germplasmDbId to the edge table on from_ or to. |
| frontierDataframe | No | Every unresolved node/side expansion, with ordinal ordering. |
| confirmedLeafCount | No | Non-root nodes with successful empty lookups on every reached side; unresolved directions never confirm leaves. |
| knownOmittedRelativeCount | No | Distinct fetched relative IDs per expansion node/side omitted by safety limits; unrequested counts remain unknown. |
| omittedRelativesDataframe | No | Fetched omitted relatives with ordinal, germplasmDbId, expansionNodeDbId and side; not an unvisited graph or resumable walk. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description goes well beyond by disclosing deduplication, cycle detection, direction semantics, the 24,000-byte preview budget and first-row-over-budget truncation behavior, and the fact that diagrams cover only the discovered graph. It also clarifies that unresolved frontier items are staged rather than silently dropped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences with the core action front-loaded and constraints following; every sentence carries information. Slightly heavy in packing output-field semantics (leafCount, confirmedLeafCount, frontier) into description prose when an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a graph-traversal tool with six parameters, an output schema and safety annotations, the description covers scope, direction limits, preview budgets, truncation handling, downstream staging, and diagram coverage. An agent has everything needed to invoke it correctly and know what it will not return.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents alias, diagram, maxDepth, direction, loadLimit and germplasmDbIds in detail. The description adds only a small amount, mostly clarifying that diagrams and previews are bounded and that direction='both' is a union walk rather than a full cross-link — the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — walking germplasm ancestry/descendancy — and qualifies it as a deduplicated DAG with cycle detection and depth limits. That is distinguishable from brapi_get_germplasm (record fetch) and the brapi_dataframe_* tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context on what the tool produces and explicitly routes follow-up work to brapi_dataframe_describe and brapi_dataframe_query for trimmed/omitted relatives. No explicit exclusions or 'when not to use this vs X' statement, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
15 tool updates
- Changed
brapi_build_phenotype_matrix2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `dialect_all_filters_dropped`: For every requested study, the active dialect dropped the study filter on /observationunits, so the pull would have widened to unfiltered rows. `no_observation_path`: Neither /observations nor /observationunits returned data for any requested study after probing both paths. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_not_found`: An uncaught BrAPI data request answered HTTP 404. `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `dialect_all_filters_dropped`: For every requested study, the active dialect dropped the study filter on /observationunits, so the pull would have widened to unfiltered rows. `no_observation_path`: Neither /observations nor /observationunits returned data for any requested study after probing both paths. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "dialect_all_filters_dropped", - "no_observation_path" -]New value: +[ + "upstream_not_found", + "upstream_rate_limited", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "dialect_all_filters_dropped", + "no_observation_path" +]
- Changed
brapi_export_genotype_matrix4 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `no_filters`: No variantSetDbId was provided. `search_endpoint_disabled`: The active dialect declares POST /search/calls as known-dead on this server. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_not_found`: An uncaught BrAPI data request answered HTTP 404. `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `no_filters`: No variantSetDbId was provided. `search_endpoint_disabled`: The active dialect declares POST /search/calls as known-dead on this server. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "no_filters", - "search_endpoint_disabled" -]New value: +[ + "upstream_not_found", + "upstream_rate_limited", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "no_filters", + "search_endpoint_disabled" +] - changed
Output schema / properties / map / descriptionPrevious value: -"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; `0` when absent."New value: +"PLINK .map text — chromosome, variant ID, genetic-distance placeholder 0, and one-based position (BrAPI start + 1). Missing/invalid coordinates use `0`. Present for format=\"plink\"." - changed
Output schema / properties / vcf / descriptionPrevious value: -"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 the server does not provide them."New value: +"VCF-lite text — header `#CHROM POS ID REF ALT` plus genotype columns. One-based POS is BrAPI start + 1; missing/invalid coordinates use \".\". Present for format=\"vcf-lite\"."
- Changed
brapi_find_genotype_calls2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `no_filters`: No variant set, germplasm, call set, or variant filter was provided. `search_endpoint_disabled`: The active dialect declares POST /search/calls as known-dead on this server. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_not_found`: An uncaught BrAPI data request answered HTTP 404. `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `no_filters`: No variant set, germplasm, call set, or variant filter was provided. `search_endpoint_disabled`: The active dialect declares POST /search/calls as known-dead on this server. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "no_filters", - "search_endpoint_disabled" -]New value: +[ + "upstream_not_found", + "upstream_rate_limited", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "no_filters", + "search_endpoint_disabled" +]
- Changed
brapi_find_germplasm2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_not_found`: An uncaught BrAPI data request answered HTTP 404. `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `missing_find_route`: Neither the GET list nor a usable POST search route is advertised. `search_endpoint_disabled`: Only a POST search route marked unusable by the active dialect is advertised. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "all_filters_dropped" -]New value: +[ + "upstream_not_found", + "upstream_rate_limited", + "missing_find_route", + "search_endpoint_disabled", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +]
- Changed
brapi_find_images2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_not_found`: An uncaught BrAPI data request answered HTTP 404. `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `missing_find_route`: Neither the GET list nor a usable POST search route is advertised. `search_endpoint_disabled`: Only a POST search route marked unusable by the active dialect is advertised. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "all_filters_dropped" -]New value: +[ + "upstream_not_found", + "upstream_rate_limited", + "missing_find_route", + "search_endpoint_disabled", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +]
- Changed
brapi_find_locations2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_bbox`: A nonempty bbox is incomplete or has reversed latitude or longitude bounds. `unresolved_country_names`: No countryNames resolve and no effective countryCodes restriction remains. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_not_found`: An uncaught BrAPI data request answered HTTP 404. `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `missing_find_route`: Neither the GET list nor a usable POST search route is advertised. `search_endpoint_disabled`: Only a POST search route marked unusable by the active dialect is advertised. `invalid_bbox`: A nonempty bbox is incomplete or has reversed latitude or longitude bounds. `unresolved_country_names`: No countryNames resolve and no effective countryCodes restriction remains. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_bbox", - "unresolved_country_names", - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "all_filters_dropped" -]New value: +[ + "upstream_not_found", + "upstream_rate_limited", + "missing_find_route", + "search_endpoint_disabled", + "invalid_bbox", + "unresolved_country_names", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +]
- Changed
brapi_find_observations2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_not_found`: An uncaught BrAPI data request answered HTTP 404. `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `missing_find_route`: Neither the GET list nor a usable POST search route is advertised. `search_endpoint_disabled`: Only a POST search route marked unusable by the active dialect is advertised. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "all_filters_dropped" -]New value: +[ + "upstream_not_found", + "upstream_rate_limited", + "missing_find_route", + "search_endpoint_disabled", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +]
- Changed
brapi_find_studies2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_not_found`: An uncaught BrAPI data request answered HTTP 404. `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `missing_find_route`: Neither the GET list nor a usable POST search route is advertised. `search_endpoint_disabled`: Only a POST search route marked unusable by the active dialect is advertised. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "all_filters_dropped" -]New value: +[ + "upstream_not_found", + "upstream_rate_limited", + "missing_find_route", + "search_endpoint_disabled", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +]
- Changed
brapi_find_variables8 fields changed- changed
Input schema / properties / studies / descriptionPrevious value: -"Filter by studyDbId. /variables takes one, so only the first value is sent."New value: +"Filter by studyDbId. Multiple distinct studies are collected under shared page, row and time budgets and unioned by variable ID with studyDbIds provenance; studyCoverage reports incomplete studies." - changed
Output schema / properties / dataframe / descriptionPrevious value: -"The matched rows, staged as a dataframe when results[] holds fewer."New value: +"Matched rows, staged when results[] holds fewer." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_not_found`: An uncaught BrAPI data request answered HTTP 404. `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `missing_find_route`: Neither the GET list nor a usable POST search route is advertised. `search_endpoint_disabled`: Only a POST search route marked unusable by the active dialect is advertised. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "all_filters_dropped" -]New value: +[ + "upstream_not_found", + "upstream_rate_limited", + "missing_find_route", + "search_endpoint_disabled", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +] - changed
Output schema / properties / ontologyCandidates / descriptionPrevious value: -"Top ranked candidates from the free-text query (if any). Empty when `text` was not supplied."New value: +"Ranked free-text candidates; empty without text." - changed
Output schema / properties / results / descriptionPrevious value: -"Leading observation variable rows, up to loadLimit and a 24,000-byte budget, whichever binds first. Rows matching `text` are promoted to the top when the free-text query produces candidates; nested objects with no non-empty field are omitted."New value: +"Leading variables, capped by loadLimit and 24,000 bytes. Text candidates lead; nested objects with no non-empty field are omitted." - added
Output schema / properties / results / items / properties / studyDbIdsAdded value: +{ + "anyOf": [ + { + "items": { + "description": "Study ID.", + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Requested studies containing this union row." +} - added
Output schema / properties / studyCoverageAdded value: +{ + "description": "Multi-study coverage; incomplete studies may omit variables.", + "items": { + "additionalProperties": false, + "description": "One study.", + "properties": { + "id": { + "description": "Requested study ID.", + "type": "string" + }, + "pagesFetched": { + "description": "Successful pages.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "reason": { + "description": "Stop/failure reason.", + "type": "string" + }, + "rowsScanned": { + "description": "Rows examined.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "status": { + "description": "Scan outcome.", + "enum": [ + "complete", + "partial", + "failed", + "unprocessed" + ], + "type": "string" + } + }, + "required": [ + "id", + "status", + "rowsScanned", + "pagesFetched" + ], + "type": "object" + }, + "type": "array" +}
- Changed
brapi_find_variants2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_not_found`: An uncaught BrAPI data request answered HTTP 404. `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `missing_find_route`: Neither the GET list nor a usable POST search route is advertised. `search_endpoint_disabled`: Only a POST search route marked unusable by the active dialect is advertised. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "all_filters_dropped" -]New value: +[ + "upstream_not_found", + "upstream_rate_limited", + "missing_find_route", + "search_endpoint_disabled", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +]
- Changed
brapi_germplasm_performance2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `germplasm_not_found`: Upstream returned no germplasm record for the requested germplasmDbId. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_not_found`: An uncaught BrAPI data request answered HTTP 404. `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `germplasm_not_found`: Upstream returned no germplasm record for the requested germplasmDbId. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "germplasm_not_found" -]New value: +[ + "upstream_not_found", + "upstream_rate_limited", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "germplasm_not_found" +]
- Changed
brapi_get_germplasm2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `germplasm_not_found`: Upstream returned no germplasm record for the requested DbId. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `germplasm_not_found`: Upstream returned no germplasm record for the requested DbId. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "germplasm_not_found" -]New value: +[ + "upstream_rate_limited", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "germplasm_not_found" +]
- Changed
brapi_get_study2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `study_not_found`: Upstream returned no study record for the requested DbId. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `study_not_found`: Upstream returned no study record for the requested DbId. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "study_not_found" -]New value: +[ + "upstream_rate_limited", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "study_not_found" +]
- Changed
brapi_raw_get2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `cross_origin_path`: path argument was a full URL instead of a relative BrAPI route. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_not_found`: An uncaught BrAPI data request answered HTTP 404. `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `cross_origin_path`: path argument was a full URL instead of a relative BrAPI route. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "cross_origin_path" -]New value: +[ + "upstream_not_found", + "upstream_rate_limited", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "cross_origin_path" +]
- Changed
brapi_raw_search2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `search_endpoint_disabled`: The active dialect declares this POST /search/{noun} route as known-dead on this server. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_not_found`: An uncaught BrAPI data request answered HTTP 404. `upstream_rate_limited`: An uncaught BrAPI data request exhausted retries after HTTP 429. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `search_endpoint_disabled`: The active dialect declares this POST /search/{noun} route as known-dead on this server. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "search_endpoint_disabled" -]New value: +[ + "upstream_not_found", + "upstream_rate_limited", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "search_endpoint_disabled" +]
6 tool updates
- Changed
brapi_dataframe_query2 fields changed- changed
Input schema / properties / registerAs / descriptionPrevious value: -"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 name fail — drop first via brapi_dataframe_drop. Identifier rules: letters, digits, and underscores; must start with a letter or underscore; max 63 characters."New value: +"Persist the full result as a new dataframe under this name. The response is bounded by preview and a 24,000-byte row budget. Conflicts fail — choose a different name, or remove the existing dataframe with brapi_dataframe_drop where this deployment enables it. Identifier rules: letters, digits, and underscores; must start with a letter or underscore; max 63 characters." - changed
Output schema / properties / rows / descriptionPrevious value: -"Materialized rows, bounded by preview/rowLimit."New value: +"Leading rows bounded by preview/rowLimit and 24,000 bytes on each serialized row representation. May be empty when the first row is oversized."
- Changed
brapi_export_genotype_matrix2 fields changed- changed
Input schema / properties / maxCalls / descriptionPrevious value: -"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 is reported in `warnings`."New value: +"Lower the pull cap for this call. Omit to use the deployment ceiling. Cannot raise it: a value above the deployment ceiling is clamped down to it and the effective cap is reported in `warnings`." - changed
Input schema / properties / maxColumns / descriptionPrevious value: -"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 it. When the variant set resolves more distinct variants than the effective cap, the matrix is capped at that many variant columns, `truncated` is set, and the effective cap is reported in `warnings`. Independent of `maxCalls`, which bounds the row (call) pull."New value: +"Lower the distinct-variant column cap for this call. Omit to use the deployment ceiling. Cannot raise it: a value above the deployment ceiling is clamped down to it. When the variant set resolves more distinct variants than the effective cap, the matrix is capped at that many variant columns, `truncated` is set, and the effective cap is reported in `warnings`. Independent of `maxCalls`, which bounds the row (call) pull."
- Changed
brapi_get_image6 fields changed- changed
Output schema / properties / images / items / descriptionPrevious value: -"Successfully loaded image payload."New value: +"Metadata for a successfully loaded image; bytes appear once in content[] image blocks." - removed
Output schema / properties / images / items / properties / dataRemoved value: -{ - "description": "Base64-encoded image bytes.", - "type": "string" -} - changed
Output schema / properties / images / items / properties / mimeType / descriptionPrevious value: -"Content-Type of the byte response, else the metadata mimeType, else application/octet-stream."New value: +"Validated image MIME from the response header, or metadata when absent; lowercase without parameters." - changed
Output schema / properties / images / items / requiredPrevious value: -[ - "imageDbId", - "mimeType", - "sizeBytes", - "source", - "data", - "metadata" -]New value: +[ + "imageDbId", + "mimeType", + "sizeBytes", + "source", + "metadata" +] - changed
Output schema / properties / warnings / descriptionPrevious value: -"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."New value: +"Per-image advisories; non-image MIME responses are errors, not successful images." - changed
Output schema / properties / warnings / items / descriptionPrevious value: -"Per-image advisory for loaded-but-suspect content (e.g. non-image MIME)."New value: +"Per-image advisory for successfully loaded images."
- Changed
brapi_raw_get9 fields changed- added
Output schema / properties / capAdded value: +{ + "description": "Effective loadLimit row ceiling, even when the byte budget binds first.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / dataframe / descriptionPrevious value: -"The pages of a list-shaped result, staged when the upstream advertised more rows than `loadLimit`. The inline `result` is unchanged."New value: +"Every fetched row of a list result, staged when the inline preview omits rows. Explicit paging stages only the requested page." - changed
Output schema / properties / metadata / properties / pagination / properties / currentPage / descriptionPrevious value: -"0-indexed page number the server returned."New value: +"0-indexed page number, when reported." - changed
Output schema / properties / metadata / properties / pagination / properties / pageSize / descriptionPrevious value: -"Rows per page."New value: +"Rows per page, when reported." - changed
Output schema / properties / metadata / properties / pagination / properties / totalCount / descriptionPrevious value: -"Total rows matching the query across all pages."New value: +"Total matching rows, when reported." - changed
Output schema / properties / metadata / properties / pagination / properties / totalPages / descriptionPrevious value: -"Total pages at the current pageSize."New value: +"Total pages, when reported." - removed
Output schema / properties / metadata / properties / pagination / requiredRemoved value: -[ - "currentPage", - "pageSize", - "totalCount", - "totalPages" -] - added
Output schema / properties / shownAdded value: +{ + "description": "Actual list rows returned inline.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the inline list leaves fetched or matching rows out.", + "type": "boolean" +}
- Changed
brapi_raw_search9 fields changed- added
Output schema / properties / capAdded value: +{ + "description": "Effective loadLimit row ceiling, even when the byte budget binds first.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / dataframe / descriptionPrevious value: -"Every fetched page of a list-shaped result, inline rows included, staged when the upstream advertised more rows than `loadLimit`. The inline `result` is unchanged."New value: +"Every fetched row of a list result, staged when the inline preview omits rows. Explicit paging stages only the requested page." - changed
Output schema / properties / metadata / properties / pagination / properties / currentPage / descriptionPrevious value: -"0-indexed page number the server returned."New value: +"0-indexed page number, when reported." - changed
Output schema / properties / metadata / properties / pagination / properties / pageSize / descriptionPrevious value: -"Rows per page."New value: +"Rows per page, when reported." - changed
Output schema / properties / metadata / properties / pagination / properties / totalCount / descriptionPrevious value: -"Total rows matching the query across all pages."New value: +"Total matching rows, when reported." - changed
Output schema / properties / metadata / properties / pagination / properties / totalPages / descriptionPrevious value: -"Total pages at the current pageSize."New value: +"Total pages, when reported." - removed
Output schema / properties / metadata / properties / pagination / requiredRemoved value: -[ - "currentPage", - "pageSize", - "totalCount", - "totalPages" -] - added
Output schema / properties / shownAdded value: +{ + "description": "Actual list rows returned inline.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the inline list leaves fetched or matching rows out.", + "type": "boolean" +}
- Changed
brapi_walk_pedigree14 fields changed- changed
Input schema / properties / loadLimit / descriptionPrevious value: -"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."New value: +"Row ceiling for each inline graph/frontier preview, also bounded by a 24,000-byte budget. Omit for the deployment default. A first row exceeding the byte budget yields zero preview rows; retrieve narrower projections from the staged dataframe." - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "alias", - "direction", - "maxDepth", - "nodes", - "edges", - "depthReached", - "rootCount", - "leafCount", - "cycleCount", - "deadEndCount", - "truncated", - "warnings" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "alias", + "direction", + "maxDepth", + "nodes", + "edges", + "depthReached", + "rootCount", + "leafCount", + "confirmedLeafCount", + "frontierCount", + "frontier", + "knownOmittedRelativeCount", + "cycleCount", + "deadEndCount", + "truncated", + "warnings" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / confirmedLeafCountAdded value: +{ + "description": "Non-root nodes with successful empty lookups on every reached side; unresolved directions never confirm leaves.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / diagram / descriptionPrevious value: -"Mermaid (`flowchart …`) or DOT (`digraph …`) source for the whole walk, nodes and edges past loadLimit included; present when `diagram` was requested. A diagram past 50,000 characters, or a Mermaid one past 500 edges, is omitted with a warning."New value: +"Requested Mermaid or DOT for the discovered graph, beyond previews; partial when capped. Omitted with a warning past 50,000 characters, or 500 edges for Mermaid." - changed
Output schema / properties / edges / descriptionPrevious value: -"One edge per parent–child pair."New value: +"One edge per discovered pair. Preview independently fits loadLimit and 24,000 bytes for array JSON and serialized row text; edgesDataframe retains omitted rows." - changed
Output schema / properties / edgesDataframe / descriptionPrevious value: -"The full edge set, staged when the walk exceeds loadLimit; edges[] is then a bounded preview. Reserved-word columns are renamed (`from` → `from_`; see columnLegend)."New value: +"Discovered edges when either preview is trimmed; truncated marks partial traversal. SQL renames from to from_; see columnLegend." - added
Output schema / properties / frontierAdded value: +{ + "description": "Bounded preview of unresolved directions; frontierDataframe retains omitted entries.", + "items": { + "additionalProperties": false, + "description": "One unresolved expansion direction, distinct from a confirmed empty lookup.", + "properties": { + "error": { + "description": "Failure message for a failed expansion.", + "type": "string" + }, + "germplasmDbId": { + "description": "Expansion node identifier.", + "type": "string" + }, + "knownOmittedRelativeCount": { + "description": "Already-fetched relatives omitted from the discovered graph; absent when not requested or failed.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "outcome": { + "description": "Why this direction remains unresolved.", + "enum": [ + "depth_limited", + "safety_skipped", + "failed", + "unsupported" + ], + "type": "string" + }, + "side": { + "description": "Direction not fully expanded.", + "enum": [ + "ancestor", + "descendant" + ], + "type": "string" + } + }, + "required": [ + "germplasmDbId", + "side", + "outcome" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / frontierCountAdded value: +{ + "description": "Unresolved node/side expansions across the full walk.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / frontierDataframeAdded value: +{ + "additionalProperties": false, + "description": "Every unresolved node/side expansion, with ordinal ordering.", + "properties": { + "columnLegend": { + "additionalProperties": { + "type": "string" + }, + "description": "Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "columns": { + "description": "Every column name.", + "items": { + "description": "Column name.", + "type": "string" + }, + "type": "array" + }, + "createdAt": { + "description": "ISO 8601 creation time.", + "type": "string" + }, + "expiresAt": { + "description": "ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool.", + "type": "string" + }, + "rowCount": { + "description": "Rows in the dataframe.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "tableName": { + "description": "Table name for brapi_dataframe_describe and brapi_dataframe_query.", + "type": "string" + } + }, + "required": [ + "tableName", + "rowCount", + "columns", + "createdAt", + "expiresAt" + ], + "type": "object" +} - added
Output schema / properties / knownOmittedRelativeCountAdded value: +{ + "description": "Distinct fetched relative IDs per expansion node/side omitted by safety limits; unrequested counts remain unknown.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / nodes / descriptionPrevious value: -"Deduplicated node list — every germplasm reached by the walk, sorted by depth then DbId."New value: +"Discovered nodes sorted by depth/DbId. Preview fits loadLimit and 24,000 bytes for array JSON and serialized row text; nodesDataframe retains omitted rows." - changed
Output schema / properties / nodesDataframe / descriptionPrevious value: -"The full node set, staged when the walk exceeds loadLimit; nodes[] is then a bounded preview. JOIN its germplasmDbId to the edges dataframe on from_ or to."New value: +"Discovered nodes when either preview is trimmed; truncated marks partial traversal. No unvisited relatives. JOIN germplasmDbId to the edge table on from_ or to." - changed
Output schema / properties / notice / descriptionPrevious value: -"When the walk was staged, the node and edge dataframes and how to read them."New value: +"Staged graph, frontier or omitted-relative tables and how to read them." - added
Output schema / properties / omittedRelativesDataframeAdded value: +{ + "additionalProperties": false, + "description": "Fetched omitted relatives with ordinal, germplasmDbId, expansionNodeDbId and side; not an unvisited graph or resumable walk.", + "properties": { + "columnLegend": { + "additionalProperties": { + "type": "string" + }, + "description": "Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "columns": { + "description": "Every column name.", + "items": { + "description": "Column name.", + "type": "string" + }, + "type": "array" + }, + "createdAt": { + "description": "ISO 8601 creation time.", + "type": "string" + }, + "expiresAt": { + "description": "ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool.", + "type": "string" + }, + "rowCount": { + "description": "Rows in the dataframe.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "tableName": { + "description": "Table name for brapi_dataframe_describe and brapi_dataframe_query.", + "type": "string" + } + }, + "required": [ + "tableName", + "rowCount", + "columns", + "createdAt", + "expiresAt" + ], + "type": "object" +}
5 tool updates
- Changed
brapi_build_phenotype_matrix4 fields changed- changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "alias", - "studies", - "shape", - "aggregate", - "observationCount", - "germplasmCount", - "variableCount", - "variableLegend", - "warnings" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "alias", + "studies", + "coverage", + "shape", + "aggregate", + "observationCount", + "germplasmCount", + "variableCount", + "variableLegend", + "warnings" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / coverageAdded value: +{ + "additionalProperties": false, + "description": "Collection coverage, independent of the number of contributing studies.", + "properties": { + "discoveryLimited": { + "description": "True when generic study discovery reached its bound; additional studies may exist.", + "type": "boolean" + }, + "partial": { + "description": "True when failed, truncated, or unprocessed work leaves coverage incomplete.", + "type": "boolean" + }, + "scan": { + "additionalProperties": false, + "description": "Scoped-unit scan coverage; unseen studies are unknown after an incomplete walk.", + "properties": { + "complete": { + "description": "Whether the scoped unit walk exhausted its authoritative total.", + "type": "boolean" + }, + "pagesFetched": { + "description": "Unit pages returned before stopping.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "reason": { + "description": "Bound or failure that stopped the unit walk.", + "type": "string" + }, + "scannedUnits": { + "description": "Raw upstream units examined, including repeated IDs.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "totalUnits": { + "description": "Upstream raw unit total, when reported.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "complete", + "scannedUnits", + "pagesFetched" + ], + "type": "object" + }, + "studies": { + "description": "Per-study outcomes in requested or encounter order.", + "items": { + "additionalProperties": false, + "description": "One study collection outcome.", + "properties": { + "observationCount": { + "description": "Matching observations collected for this study.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "reason": { + "description": "Why collection failed or remained incomplete.", + "type": "string" + }, + "status": { + "description": "Outcome of collecting this study; partial may contain observations.", + "enum": [ + "contributed", + "empty", + "failed", + "partial", + "unprocessed" + ], + "type": "string" + }, + "studyDbId": { + "description": "Requested study, or a study encountered in scoped units.", + "type": "string" + } + }, + "required": [ + "studyDbId", + "status", + "observationCount" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "partial", + "studies" + ], + "type": "object" +} - changed
Output schema / properties / studies / descriptionPrevious value: -"studyDbIds that were queried to build the matrix."New value: +"Requested studyDbIds; coverage records collection outcomes." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when at least one study's observation scan stopped before the study's upstream total — at loadLimit, the page cap, a failed, empty, or repeated page, or the call deadline."New value: +"True when failed, truncated, or unprocessed studies leave matrix coverage incomplete."
- Changed
brapi_find_locations6 fields changed- changed
Input schema / properties / bbox / descriptionPrevious value: -"Optional post-fetch bounding box. All four corners must be set to activate the filter."New value: +"Optional post-fetch bounding box. Nonempty boxes require all four bounds with minimum <= maximum; malformed boxes fail. An empty object is omitted." - changed
Input schema / properties / countryCodes / descriptionPrevious value: -"ISO 3166-1 alpha-3 country codes."New value: +"Country codes; alphabetic codes are uppercased, numeric upstream codes are preserved." - changed
Input schema / properties / countryNames / descriptionPrevious value: -"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 a warning. Prefer countryCodes when you already have alpha-3 codes."New value: +"English country names or aliases (e.g. \"Uganda\", \"United States\", \"USA\") resolved to alpha-3 codes and merged into countryCodes. Unresolved names warn when another effective country restriction remains; otherwise the call fails. Prefer countryCodes when known." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_bbox`: A nonempty bbox is incomplete or has reversed latitude or longitude bounds. `unresolved_country_names`: No countryNames resolve and no effective countryCodes restriction remains. `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "auth_token_exchange_failed", - "auth_no_access_token", - "capability_discovery_unavailable", - "upstream_unauthorized", - "upstream_forbidden", - "alias_base_url_invalid", - "private_address_blocked", - "all_filters_dropped" -]New value: +[ + "invalid_bbox", + "unresolved_country_names", + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +] - changed
Output schema / properties / warnings / descriptionPrevious value: -"Advisory messages (bbox malformed, filter overrides, capability gaps)."New value: +"Advisory messages (unresolved country names, filter overrides, capability gaps)."
- Changed
brapi_find_observations2 fields changed- changed
Output schema / properties / appliedFilters / descriptionPrevious value: -"Filter map sent upstream (named filters plus extraFilters)."New value: +"Upstream filter map, or separate upstreamRequests and clientSide criteria for embedded-unit collection." - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total rows reported by the server, else the rows scanned."New value: +"Upstream observation total, or the matched observations collected on the embedded-unit route; warnings disclose incomplete scans."
- Changed
brapi_germplasm_performance3 fields changed- changed
Input schema / properties / studyDbIds / descriptionPrevious value: -"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 germplasm-scoped study set retrieved via brapi_find_studies with extraFilters.germplasmDbIds. Omit to let the tool discover the germplasm’s studies automatically."New value: +"Optional studyDbIds to restrict collection to known studies and skip automatic discovery. Omit to walk germplasm-scoped embedded units on SGN/Breedbase, or discover up to 200 studies on other servers. Find known study IDs with brapi_find_studies; some servers ignore its germplasm filter." - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "alias", - "germplasmDbId", - "studyCount", - "studyDbIds", - "perVariable", - "warnings" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "alias", + "germplasmDbId", + "studyCount", + "studyDbIds", + "coverage", + "perVariable", + "warnings" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / coverageAdded value: +{ + "additionalProperties": false, + "description": "Collection coverage, independent of the number of contributing studies.", + "properties": { + "discoveryLimited": { + "description": "True when generic study discovery reached its bound; additional studies may exist.", + "type": "boolean" + }, + "partial": { + "description": "True when failed, truncated, or unprocessed work leaves coverage incomplete.", + "type": "boolean" + }, + "scan": { + "additionalProperties": false, + "description": "Scoped-unit scan coverage; unseen studies are unknown after an incomplete walk.", + "properties": { + "complete": { + "description": "Whether the scoped unit walk exhausted its authoritative total.", + "type": "boolean" + }, + "pagesFetched": { + "description": "Unit pages returned before stopping.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "reason": { + "description": "Bound or failure that stopped the unit walk.", + "type": "string" + }, + "scannedUnits": { + "description": "Raw upstream units examined, including repeated IDs.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "totalUnits": { + "description": "Upstream raw unit total, when reported.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "complete", + "scannedUnits", + "pagesFetched" + ], + "type": "object" + }, + "studies": { + "description": "Per-study outcomes in requested or encounter order.", + "items": { + "additionalProperties": false, + "description": "One study collection outcome.", + "properties": { + "observationCount": { + "description": "Matching observations collected for this study.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "reason": { + "description": "Why collection failed or remained incomplete.", + "type": "string" + }, + "status": { + "description": "Outcome of collecting this study; partial may contain observations.", + "enum": [ + "contributed", + "empty", + "failed", + "partial", + "unprocessed" + ], + "type": "string" + }, + "studyDbId": { + "description": "Requested study, or a study encountered in scoped units.", + "type": "string" + } + }, + "required": [ + "studyDbId", + "status", + "observationCount" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "partial", + "studies" + ], + "type": "object" +}
- Changed
brapi_get_study1 field changed- changed
Output schema / properties / program / descriptionPrevious value: -"Resolved program record (when the study has a programDbId and the FK lookup succeeded)."New value: +"Resolved program record (when the study or parent trial identifies a program and the FK lookup succeeded)."
21 tool updates
- Changed
brapi_build_phenotype_matrix24 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - added
Input schema / properties / germplasm / items / patternAdded value: +"\\S" - changed
Input schema / properties / loadLimit / descriptionPrevious value: -"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."New value: +"Cap on matching observations collected per study. Omit for the deployment default. A study that stops at it is reported as truncated." - added
Input schema / properties / studies / items / patternAdded value: +"\\S" - added
Input schema / properties / variables / items / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / cap / descriptionPrevious value: -"Per-study observation cap that was applied."New value: +"Per-study cap on matching observations that was applied." - changed
Output schema / properties / dataframe / descriptionPrevious value: -"Canvas dataframe handle for the materialized matrix. Omitted when no observations were found. Query with brapi_dataframe_query (SQL). Long-form columns: germplasmDbId, observationVariableDbId, studyDbId, value, replicateIndex. Wide-form columns: germplasmDbId, germplasmName, one column per variable (SQL-safe identifier derived from observationVariableDbId — see variableLegend)."New value: +"The matrix, staged; absent when no observations were found. Long-form columns: germplasmDbId, observationVariableDbId, studyDbId, value, replicateIndex. Wide-form columns: germplasmDbId, germplasmName, then one per variable (see variableLegend)." - changed
Output schema / properties / dataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / dataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / dataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / dataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / dataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / dataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / dataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / dataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / dataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / dataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `all_filters_dropped`: The active dialect dropped every filter supplied — the call would silently widen to the unfiltered baseline. `no_observation_path`: Neither /observations nor /observationunits returned data for any requested study after probing both paths. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `dialect_all_filters_dropped`: For every requested study, the active dialect dropped the study filter on /observationunits, so the pull would have widened to unfiltered rows. `no_observation_path`: Neither /observations nor /observationunits returned data for any requested study after probing both paths. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "all_filters_dropped", - "no_observation_path" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "dialect_all_filters_dropped", + "no_observation_path" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance for reaching the observations this call left out."New value: +"Guidance for reaching the observations this call left out, then the matrix dataframe and the tools that read it." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when at least one study saturated the per-study loadLimit."New value: +"True when at least one study's observation scan stopped before the study's upstream total — at loadLimit, the page cap, a failed, empty, or repeated page, or the call deadline." - changed
Output schema / properties / variableLegend / descriptionPrevious value: -"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 a column back to its variable display name."New value: +"Wide-matrix column name (SQL-safe, derived from observationVariableDbId) → observationVariableName." - changed
Output schema / properties / warnings / descriptionPrevious value: -"Advisory messages (empty studies, non-numeric aggregation skips, fallback paths)."New value: +"Advisory messages (empty or failed studies, partial study scans, extraFilters the rows contradict or cannot verify, non-numeric aggregation skips, fallback paths)."
- Changed
brapi_connect9 fields changed- changed
Output schema / properties / attribution / descriptionPrevious value: -"Attribution metadata for built-in known-server connections. Absent for custom (env-only) connections."New value: +"Attribution metadata for built-in known-server connections. Absent when the alias is not built-in or points away from its built-in base URL." - changed
Output schema / properties / capabilities / descriptionPrevious value: -"Capability profile derived from /serverinfo."New value: +"Capability profile derived from /serverinfo or /calls." - changed
Output schema / properties / capabilities / properties / supportedCount / descriptionPrevious value: -"Total distinct services the server advertises in /calls."New value: +"Total distinct services the server advertises in /serverinfo or /calls." - changed
Output schema / properties / dialect / properties / id / descriptionPrevious value: -"Active dialect id (e.g. \"spec\", \"cassavabase\"). Names a registered adapter that translates outbound filters and declares known-dead routes."New value: +"Active dialect id (e.g. \"spec\", \"cassavabase\")." - changed
Output schema / properties / dialect / properties / inferredMappingCount / descriptionPrevious value: -"Number of filter translations inferred from naming conventions but not independently verified. A non-zero count means some result narrowing on this server may not fire as expected."New value: +"Filter translations inferred from naming conventions, unverified; when non-zero, some narrowing on this server may not fire." - changed
Output schema / properties / dialect / properties / verifiedMappingCount / descriptionPrevious value: -"Number of filter translations the dialect has empirically verified against a live server. Higher means more confidence in the translation table."New value: +"Filter translations verified against a live server. Absent when the dialect publishes no mapping summary." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `auth_session_required`: Caller-supplied credentials on an HTTP deployment without per-user auth, from a request that carries no MCP session. `auth_base_url_mismatch`: The alias has server-configured credentials and the supplied baseUrl differs from the server configured for it. `alias_base_url_unset`: The alias has server-configured credentials but no base URL of its own (no BRAPI_<ALIAS>_BASE_URL and no enabled built-in), so they pair with no server. `auth_token_exchange_failed`: SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Token endpoint responded but did not return an access_token. `upstream_unauthorized`: The server answered HTTP 401 on /serverinfo or /calls — it requires login for capability discovery. `upstream_forbidden`: The server answered HTTP 403 on /serverinfo or /calls — the request (anonymous or credentialed) lacks read access. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `auth_session_required`: Caller-supplied credentials on an HTTP deployment without per-user auth, from a request that carries no MCP session. `auth_base_url_mismatch`: The alias has server-configured credentials and the supplied baseUrl differs from the server configured for it. `alias_base_url_unset`: The alias has server-configured credentials but no base URL of its own (no BRAPI_<ALIAS>_BASE_URL and no enabled built-in), so they pair with no server. `alias_base_url_invalid`: With no `baseUrl` passed, the base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL, or the OAuth token URL, is on a private or reserved address this server may not reach. `auth_token_exchange_failed`: SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Token endpoint responded but did not return an access_token. `upstream_unauthorized`: The server answered HTTP 401 on /serverinfo or /calls — it requires login for capability discovery. `upstream_forbidden`: The server answered HTTP 403 on /serverinfo or /calls — the request (anonymous or credentialed) lacks read access. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "auth_session_required", - "auth_base_url_mismatch", - "alias_base_url_unset", - "auth_token_exchange_failed", - "auth_no_access_token", - "upstream_unauthorized", - "upstream_forbidden" -]New value: +[ + "auth_session_required", + "auth_base_url_mismatch", + "alias_base_url_unset", + "alias_base_url_invalid", + "private_address_blocked", + "auth_token_exchange_failed", + "auth_no_access_token", + "upstream_unauthorized", + "upstream_forbidden", + "capability_discovery_unavailable" +] - changed
Output schema / properties / nextToolSuggestions / items / properties / args / descriptionPrevious value: -"Arguments to call the tool with. Alias only — narrow further with the tool filters."New value: +"Arguments to start the tool with (alias only)."
- Changed
brapi_dataframe_describe1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `list_all_disabled_on_shared_http`: This server is running as a shared HTTP endpoint without per-caller auth — listing every dataframe would expose other concurrent clients' workspaces, since all callers resolve to one shared tenant. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `list_all_disabled_on_shared_http`: Listing was requested on a shared HTTP endpoint without per-caller auth, from a request with no session-scoped workspace — the listing would expose other clients' dataframes, since those requests all share one tenant workspace. Other values are possible when a failure originates below the handler."
- Changed
brapi_dataframe_query8 fields changed- changed
Input schema / properties / preview / descriptionPrevious value: -"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."New value: +"Cap the number of rows returned in this response. A value above `rowLimit` (or, when `rowLimit` is omitted, above the deployment-wide response cap) returns rows up to that ceiling. When omitted, the ceiling applies. Lower this with `registerAs` when you only need a sample to verify the query." - changed
Input schema / properties / preview / maximumPrevious value: -1000New value: +9007199254740991 - changed
Input schema / properties / sql / descriptionPrevious value: -"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 paging idiom: use `LIMIT/OFFSET` to walk a large dataframe, projection to trim columns, and aggregation (`COUNT`, `GROUP BY`, `AVG`) to summarize without materializing every row."New value: +"SELECT statement against dataframes. Single statement only — writes, DDL, DESCRIBE / SUMMARIZE, file reads, and exports are rejected. Use brapi_dataframe_describe to discover available dataframes. SQL is the primary paging idiom: use `LIMIT/OFFSET` to walk a large dataframe, projection to trim columns, and aggregation (`COUNT`, `GROUP BY`, `AVG`) to summarize without materializing every row." - changed
Output schema / properties / cap / descriptionPrevious value: -"Row ceiling that bound the response (the smaller of preview and rowLimit)."New value: +"Row ceiling that bound the response: the smallest of preview, rowLimit, and the deployment-wide response cap." - changed
Output schema / properties / columns / descriptionPrevious value: -"Column metadata in projection order — name and SQL type. Use this to write follow-up queries without round-tripping through brapi_dataframe_describe."New value: +"Column names and types in projection order, enough to write a follow-up query." - changed
Output schema / properties / columns / items / properties / type / descriptionPrevious value: -"SQL/DuckDB column type (e.g. VARCHAR, BIGINT, DOUBLE, BOOLEAN, JSON) sourced from DuckDB schema metadata. The same type appears whether or not `registerAs` was supplied — without it, the handler runs an internal probe to recover authoritative types that would otherwise be lost when DuckDB BigInts serialize to JSON strings."New value: +"DuckDB column type (e.g. VARCHAR, BIGINT, DOUBLE, BOOLEAN, JSON), the same with or without `registerAs`." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `sql_rejected`: SQL violated read-only rules (multi-statement, non-SELECT, or disallowed operation). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `sql_rejected`: SQL broke the read-only rules: more than one statement, a non-SELECT, a disallowed operation or function, a file or URL named as a table, a system-catalog read, or a DESCRIBE, SUMMARIZE, or SHOW statement. `sql_execution_error`: The SELECT passed the read-only rules but failed while running on the staged data, such as a cast of a value that does not convert. `missing_table`: The SQL names a dataframe this workspace does not hold, because it expired, was dropped, or the name is mistyped. `register_as_clash`: The registerAs name is already taken by a dataframe in this workspace. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "sql_rejected" -]New value: +[ + "sql_rejected", + "sql_execution_error", + "missing_table", + "register_as_clash" +]
- Changed
brapi_export_genotype_matrix22 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - added
Input schema / properties / germplasmDbIds / items / patternAdded value: +"\\S" - changed
Input schema / properties / variantSetDbId / descriptionPrevious value: -"Variant set to pull calls for. Required."New value: +"Variant set to pull calls for. Required. List variant sets with brapi_raw_get({ path: \"/variantsets\" }) — add params.studyDbId to narrow to one study or genotyping project — and read variantSetDbId from the rows." - removed
Input schema / properties / variantSetDbId / minLengthRemoved value: -1 - added
Input schema / properties / variantSetDbId / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection used."New value: +"Connection alias the call used." - changed
Output schema / properties / dataframe / descriptionPrevious value: -"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 are the format-specific serialization of the same data."New value: +"The wide germplasm × variant matrix, staged for every format; brapi_dataframe_export writes it to a file where that tool is listed. vcf, ped, and map serialize the same data." - changed
Output schema / properties / dataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / dataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / dataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / dataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / dataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / dataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / dataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / dataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / dataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / dataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `no_filters`: No variantSetDbId was provided. `search_endpoint_disabled`: The active dialect declares POST /search/calls as known-dead on this server. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `no_filters`: No variantSetDbId was provided. `search_endpoint_disabled`: The active dialect declares POST /search/calls as known-dead on this server. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "no_filters", - "search_endpoint_disabled" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "no_filters", + "search_endpoint_disabled" +] - added
Output schema / properties / noticeAdded value: +{ + "description": "The matrix dataframe and the tools that read it.", + "type": "string" +} - changed
Output schema / properties / truncated / descriptionPrevious value: -"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_GENOTYPE_MATRIX_MAX_COLUMNS). `warnings` names which ceiling fired."New value: +"True when the matrix is not the complete upstream result: the call pull reached the effective maxCalls cap or ran out of time before the last page, or more distinct variants came back than the effective maxColumns cap. `warnings` names which." - changed
Output schema / properties / variantColumnLegend / descriptionPrevious value: -"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."New value: +"SQL-safe dataframe column name → original variantDbId."
- Changed
brapi_find_genotype_calls32 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - added
Input schema / properties / callSetDbIds / items / patternAdded value: +"\\S" - added
Input schema / properties / germplasmDbIds / items / patternAdded value: +"\\S" - changed
Input schema / properties / loadLimit / descriptionPrevious value: -"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 dataframe with brapi_dataframe_query (SQL) for the rest. Upstream pageSize is fixed for genotype calls, so this knob only affects the inline preview here (no spillover capacity tradeoff)."New value: +"Cap on rows returned inline. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any call was collected. When results[] holds fewer rows than were collected, every collected call lands in a dataframe — query it with brapi_dataframe_query (SQL) for the rest. Upstream pageSize is fixed for genotype calls, so this knob only affects the inline preview here (no spillover capacity tradeoff)." - added
Input schema / properties / variantDbIds / items / patternAdded value: +"\\S" - changed
Input schema / properties / variantSetDbId / descriptionPrevious value: -"Scope calls to a single variant set. Strongly recommended."New value: +"Scope calls to a single variant set. Strongly recommended. List variant sets with brapi_raw_get({ path: \"/variantsets\" }) — add params.studyDbId to narrow to one study or genotyping project — and read variantSetDbId from the rows." - removed
Input schema / properties / variantSetDbId / minLengthRemoved value: -1 - added
Input schema / properties / variantSetDbId / patternAdded value: +"\\S" - changed
Input schema / properties / variantSetDbIds / descriptionPrevious value: -"Alternative: multiple variant sets at once."New value: +"Alternative: multiple variant sets at once, found the same way." - added
Input schema / properties / variantSetDbIds / items / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - added
Output schema / properties / capAdded value: +{ + "description": "The effective loadLimit when results[] was cut short; shown is below it when the 24,000-byte inline budget bound first (notice says which).", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / dataframe / descriptionPrevious value: -"Dataframe handle when the full collected calls exceed loadLimit and were materialized as a dataframe. Query it with brapi_dataframe_query (SQL)."New value: +"Every collected call, staged when results[] holds fewer rows than were collected." - changed
Output schema / properties / dataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / dataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / dataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / dataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / dataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / dataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / dataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / dataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / dataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / dataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `no_filters`: No variant set, germplasm, call set, or variant filter was provided. `search_endpoint_disabled`: The active dialect declares POST /search/calls as known-dead on this server. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `no_filters`: No variant set, germplasm, call set, or variant filter was provided. `search_endpoint_disabled`: The active dialect declares POST /search/calls as known-dead on this server. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "no_filters", - "search_endpoint_disabled" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "no_filters", + "search_endpoint_disabled" +] - changed
Output schema / properties / hasMore / descriptionPrevious value: -"True when the collection was truncated (equivalent to `truncated`)."New value: +"True when the pull stopped early: the deployment pull limit fired (`truncated`), or time for upstream requests ran out before the last page (`warnings` says so). Unlike the filter finders, it ignores the inline cut — shown and cap report that." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no calls were returned — how to broaden filters or verify IDs."New value: +"Why no calls were returned, or which bound cut results[] short and the dataframe holding every collected call." - changed
Output schema / properties / results / descriptionPrevious value: -"Call rows returned in-context (up to loadLimit)."New value: +"Leading collected call rows, up to loadLimit and a 24,000-byte budget, whichever binds first." - changed
Output schema / properties / returnedCount / descriptionPrevious value: -"Length of results[] — rows returned in-context (up to loadLimit)."New value: +"Length of results[]." - added
Output schema / properties / shownAdded value: +{ + "description": "Length of results[] when loadLimit or the inline byte budget cut it short of the collected calls.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total calls collected across all pages (may be capped by the deployment-wide pull limit; check `truncated`)."New value: +"Total calls collected across all pages (below the upstream total when `hasMore` is true: the deployment-wide pull limit fired, or the upstream deadline ended the pull)." - changed
Output schema / properties / truncated / descriptionPrevious value: -"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."New value: +"True when the deployment-wide pull limit was reached and more calls exist upstream. Narrow the filters and re-pull."
- Changed
brapi_find_germplasm36 fields changed- added
Input schema / properties / accessionNumbers / items / patternAdded value: +"\\S" - changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - added
Input schema / properties / collections / items / patternAdded value: +"\\S" - added
Input schema / properties / crops / items / patternAdded value: +"\\S" - added
Input schema / properties / genus / patternAdded value: +"\\S" - added
Input schema / properties / germplasmDbIds / items / patternAdded value: +"\\S" - added
Input schema / properties / germplasmPUIs / items / patternAdded value: +"\\S" - changed
Input schema / properties / loadLimit / descriptionPrevious value: -"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."New value: +"Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row." - added
Input schema / properties / names / items / patternAdded value: +"\\S" - added
Input schema / properties / species / patternAdded value: +"\\S" - added
Input schema / properties / synonyms / items / patternAdded value: +"\\S" - changed
Input schema / properties / text / descriptionPrevious value: -"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 free-text filter, so combine with `crops` / `genus` / etc. to narrow the upstream pull first."New value: +"Free-text query. Applied client-side as a case-insensitive substring match on germplasmName, germplasmPUI, accessionNumber, defaultDisplayName, and registered synonyms — no BrAPI server reliably supports a server-side free-text filter. Every upstream row is scanned when the filtered set fits one dataframe walk; above that, a miss on the first page stops the scan, and the warnings report how many rows were checked. Combine with `crops` / `genus` / etc. to narrow the upstream pull first." - added
Input schema / properties / text / patternAdded value: +"^$|\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / appliedFilters / descriptionPrevious value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)." - added
Output schema / properties / capAdded value: +{ + "description": "The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / dataframe / descriptionPrevious value: -"Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL)."New value: +"The matched rows, staged as a dataframe when results[] holds fewer." - changed
Output schema / properties / dataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / dataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / dataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / dataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / dataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / dataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / dataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / dataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / dataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / dataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - changed
Output schema / properties / distributions / descriptionPrevious value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "all_filters_dropped" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no rows were returned — how to broaden filters or retry."New value: +"Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows." - changed
Output schema / properties / refinementHint / descriptionPrevious value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large." - changed
Output schema / properties / results / descriptionPrevious value: -"Germplasm rows returned in-context (up to loadLimit)."New value: +"Leading matched germplasm rows, up to loadLimit and a 24,000-byte budget, whichever binds first." - added
Output schema / properties / shownAdded value: +{ + "description": "Length of results[] when truncated.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total rows reported by the server."New value: +"Total rows reported by the server, else the rows scanned." - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.", + "type": "boolean" +}
- Changed
brapi_find_images32 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - added
Input schema / properties / descriptiveOntologyTerms / items / patternAdded value: +"\\S" - added
Input schema / properties / imageFileNames / items / patternAdded value: +"\\S" - added
Input schema / properties / images / items / patternAdded value: +"\\S" - changed
Input schema / properties / loadLimit / descriptionPrevious value: -"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."New value: +"Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row." - added
Input schema / properties / mimeTypes / items / patternAdded value: +"\\S" - added
Input schema / properties / observationUnits / items / patternAdded value: +"\\S" - added
Input schema / properties / observations / items / patternAdded value: +"\\S" - added
Input schema / properties / studies / items / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / appliedFilters / descriptionPrevious value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)." - added
Output schema / properties / capAdded value: +{ + "description": "The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / dataframe / descriptionPrevious value: -"Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL)."New value: +"The matched rows, staged as a dataframe when results[] holds fewer." - changed
Output schema / properties / dataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / dataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / dataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / dataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / dataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / dataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / dataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / dataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / dataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / dataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - changed
Output schema / properties / distributions / descriptionPrevious value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "all_filters_dropped" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no rows were returned — how to broaden filters or retry."New value: +"Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows." - changed
Output schema / properties / refinementHint / descriptionPrevious value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large." - changed
Output schema / properties / results / descriptionPrevious value: -"Image metadata rows returned in-context (up to loadLimit)."New value: +"Leading matched image metadata rows, up to loadLimit and a 24,000-byte budget, whichever binds first." - added
Output schema / properties / shownAdded value: +{ + "description": "Length of results[] when truncated.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total rows reported by the server."New value: +"Total rows reported by the server, else the rows scanned." - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.", + "type": "boolean" +}
- Changed
brapi_find_locations32 fields changed- added
Input schema / properties / abbreviations / items / patternAdded value: +"\\S" - changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - added
Input schema / properties / countryCodes / items / patternAdded value: +"\\S" - added
Input schema / properties / countryNames / items / patternAdded value: +"\\S" - changed
Input schema / properties / loadLimit / descriptionPrevious value: -"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."New value: +"Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row." - added
Input schema / properties / locationNames / items / patternAdded value: +"\\S" - added
Input schema / properties / locationTypes / items / patternAdded value: +"\\S" - added
Input schema / properties / locations / items / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / appliedFilters / descriptionPrevious value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)." - added
Output schema / properties / capAdded value: +{ + "description": "The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / coordinateAxisOrder / descriptionPrevious value: -"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-conformant) and bbox + rendered coordinates were interpreted accordingly."New value: +"Axis order used to read GeoJSON Point coordinates: \"spec\" is RFC 7946 [lon, lat, alt?]; \"swapped\" means the upstream stores [lat, lon, alt?] and bbox and rendered coordinates used that order." - changed
Output schema / properties / dataframe / descriptionPrevious value: -"Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL)."New value: +"The matched rows, staged as a dataframe when results[] holds fewer." - changed
Output schema / properties / dataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / dataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / dataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / dataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / dataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / dataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / dataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / dataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / dataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / dataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - changed
Output schema / properties / distributions / descriptionPrevious value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "all_filters_dropped" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no rows were returned — how to broaden filters or retry."New value: +"Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows." - changed
Output schema / properties / refinementHint / descriptionPrevious value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large." - changed
Output schema / properties / results / descriptionPrevious value: -"Location rows returned in-context (up to loadLimit). Bbox filter is applied after the upstream fetch."New value: +"Leading matched location rows, up to loadLimit and a 24,000-byte budget, whichever binds first. A bbox filter applies before the cut, across every page scanned." - added
Output schema / properties / shownAdded value: +{ + "description": "Length of results[] when truncated.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total rows reported by the server (or the post-bbox count when a bbox filter is active)."New value: +"Total rows reported by the server, else the rows scanned; with an active bbox, the scanned rows inside it." - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.", + "type": "boolean" +}
- Changed
brapi_find_observations38 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - added
Input schema / properties / germplasm / items / patternAdded value: +"\\S" - changed
Input schema / properties / loadLimit / descriptionPrevious value: -"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."New value: +"Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row." - added
Input schema / properties / observationLevels / items / patternAdded value: +"\\S" - added
Input schema / properties / observationUnits / items / patternAdded value: +"\\S" - added
Input schema / properties / observations / items / patternAdded value: +"\\S" - added
Input schema / properties / programs / items / patternAdded value: +"\\S" - added
Input schema / properties / seasons / items / patternAdded value: +"\\S" - added
Input schema / properties / studies / items / patternAdded value: +"\\S" - added
Input schema / properties / timestampFrom / patternAdded value: +"\\S" - added
Input schema / properties / timestampTo / patternAdded value: +"\\S" - added
Input schema / properties / trials / items / patternAdded value: +"\\S" - added
Input schema / properties / variables / items / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / appliedFilters / descriptionPrevious value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)." - added
Output schema / properties / capAdded value: +{ + "description": "The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / dataframe / descriptionPrevious value: -"Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL)."New value: +"The matched rows, staged as a dataframe when results[] holds fewer." - changed
Output schema / properties / dataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / dataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / dataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / dataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / dataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / dataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / dataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / dataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / dataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / dataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - changed
Output schema / properties / distributions / descriptionPrevious value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "all_filters_dropped" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no rows were returned — how to broaden filters or retry."New value: +"Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows." - changed
Output schema / properties / refinementHint / descriptionPrevious value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large." - changed
Output schema / properties / results / descriptionPrevious value: -"Observation rows returned in-context (up to loadLimit)."New value: +"Leading matched observation rows, up to loadLimit and a 24,000-byte budget, whichever binds first." - changed
Output schema / properties / results / items / properties / season / anyOfPrevious value: -[ - { - "description": "Season identifier as a flat string (older BrAPI servers).", - "type": "string" - }, - { - "additionalProperties": {}, - "description": "Structured season block per BrAPI v2.1 — may carry seasonDbId, year, season, or seasonName. Fields vary by server; all pass through and are collapsed into a single label by format().", - "properties": {}, - "type": "object" - }, - { - "description": "Field present but null on the upstream.", - "type": "null" - } -]New value: +[ + { + "description": "Season identifier as a flat string (older BrAPI servers).", + "type": "string" + }, + { + "additionalProperties": {}, + "description": "BrAPI v2.1 season object — seasonDbId, year, season, or seasonName; fields vary by server.", + "properties": {}, + "type": "object" + }, + { + "description": "Field present but null on the upstream.", + "type": "null" + } +] - changed
Output schema / properties / results / items / properties / season / descriptionPrevious value: -"Season — either a flat string or a structured object depending on the server. format() normalizes both into a single label."New value: +"Season as a flat string or a structured object, depending on the server." - added
Output schema / properties / shownAdded value: +{ + "description": "Length of results[] when truncated.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total rows reported by the server."New value: +"Total rows reported by the server, else the rows scanned." - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.", + "type": "boolean" +}
- Changed
brapi_find_studies34 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - added
Input schema / properties / crop / patternAdded value: +"\\S" - changed
Input schema / properties / loadLimit / descriptionPrevious value: -"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."New value: +"Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row." - changed
Input schema / properties / locations / descriptionPrevious value: -"Filter by locationDbIds (server-side identifiers, not display names)."New value: +"Filter by locationDbIds (server-side identifiers, not display names). On servers that ignore this filter on /studies, it is applied client-side over the scanned studies, and a study with no locationDbId never matches." - added
Input schema / properties / locations / items / patternAdded value: +"\\S" - added
Input schema / properties / programs / items / patternAdded value: +"\\S" - added
Input schema / properties / seasons / items / patternAdded value: +"\\S" - added
Input schema / properties / studyNames / items / patternAdded value: +"\\S" - added
Input schema / properties / trialTypes / items / patternAdded value: +"\\S" - added
Input schema / properties / trials / items / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / appliedFilters / descriptionPrevious value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)." - added
Output schema / properties / capAdded value: +{ + "description": "The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - added
Output schema / properties / clientSideFiltersAdded value: +{ + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "description": "Filters this server ignores on /studies, applied to the scanned rows instead of sent upstream, keyed by input name.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - changed
Output schema / properties / dataframe / descriptionPrevious value: -"Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL)."New value: +"The matched rows, staged as a dataframe when results[] holds fewer." - changed
Output schema / properties / dataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / dataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / dataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / dataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / dataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / dataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / dataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / dataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / dataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / dataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - changed
Output schema / properties / distributions / descriptionPrevious value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "all_filters_dropped" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no rows were returned — how to broaden filters or retry."New value: +"Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows." - changed
Output schema / properties / refinementHint / descriptionPrevious value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large." - changed
Output schema / properties / results / descriptionPrevious value: -"Rows returned in-context (up to loadLimit)."New value: +"Leading matched rows, up to loadLimit and a 24,000-byte budget, whichever binds first." - added
Output schema / properties / shownAdded value: +{ + "description": "Length of results[] when truncated.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total rows reported by the server."New value: +"Total rows reported by the server, else the rows scanned; with `locations` applied client-side, the matched rows fetched." - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.", + "type": "boolean" +}
- Changed
brapi_find_variables37 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - added
Input schema / properties / crop / patternAdded value: +"\\S" - changed
Input schema / properties / loadLimit / descriptionPrevious value: -"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."New value: +"Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row." - added
Input schema / properties / methods / items / patternAdded value: +"\\S" - added
Input schema / properties / ontologies / items / patternAdded value: +"\\S" - added
Input schema / properties / scales / items / patternAdded value: +"\\S" - changed
Input schema / properties / studies / descriptionPrevious value: -"Filter by studyDbIds."New value: +"Filter by studyDbId. /variables takes one, so only the first value is sent." - added
Input schema / properties / studies / items / patternAdded value: +"\\S" - changed
Input schema / properties / text / descriptionPrevious value: -"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 with matches first and unmatched rows for context. Use exact filters (`variables`, `variableNames`, `variablePUIs`, `traitClasses`, `ontologies`) to actually narrow the upstream pull. Differs from `brapi_find_germplasm.text`, which drops unmatched rows."New value: +"Free-text query. Ranks **every row the call fetched** (the whole dataframe walk, not just the first page) via the ontology resolver, then fills results[] — up to loadLimit and the 24,000-byte budget — with matches first and unmatched rows for context. Use exact filters (`variables`, `variableNames`, `variablePUIs`, `traitClasses`, `ontologies`) to actually narrow the upstream pull. Differs from `brapi_find_germplasm.text`, which drops unmatched rows." - added
Input schema / properties / text / patternAdded value: +"^$|\\S" - added
Input schema / properties / traitClasses / items / patternAdded value: +"\\S" - added
Input schema / properties / variableNames / items / patternAdded value: +"\\S" - added
Input schema / properties / variablePUIs / items / patternAdded value: +"\\S" - added
Input schema / properties / variables / items / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / appliedFilters / descriptionPrevious value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)." - added
Output schema / properties / capAdded value: +{ + "description": "The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / dataframe / descriptionPrevious value: -"Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL)."New value: +"The matched rows, staged as a dataframe when results[] holds fewer." - changed
Output schema / properties / dataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / dataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / dataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / dataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / dataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / dataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / dataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / dataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / dataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / dataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - changed
Output schema / properties / distributions / descriptionPrevious value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "all_filters_dropped" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no rows were returned — how to broaden filters or retry."New value: +"Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows." - changed
Output schema / properties / refinementHint / descriptionPrevious value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large." - changed
Output schema / properties / results / descriptionPrevious value: -"Observation variable rows returned in-context (up to loadLimit). Rows matching `text` are promoted to the top when the free-text query produces candidates."New value: +"Leading observation variable rows, up to loadLimit and a 24,000-byte budget, whichever binds first. Rows matching `text` are promoted to the top when the free-text query produces candidates; nested objects with no non-empty field are omitted." - added
Output schema / properties / shownAdded value: +{ + "description": "Length of results[] when truncated.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total rows reported by the server."New value: +"Total rows reported by the server, else the rows scanned." - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.", + "type": "boolean" +}
- Changed
brapi_find_variants33 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - changed
Input schema / properties / end / descriptionPrevious value: -"Exclusive 1-based end."New value: +"Window end, 0-based exclusive." - changed
Input schema / properties / loadLimit / descriptionPrevious value: -"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."New value: +"Cap on rows returned inline in results[]. Omit for the deployment default. results[] also stops at a 24,000-byte budget, whichever bound comes first, and keeps at least one row when any matched. When results[] holds fewer rows than matched, the matched rows are staged in a dataframe (marked truncated if the upstream walk stopped short); query it with brapi_dataframe_query (SQL) instead of paging row-by-row." - added
Input schema / properties / referenceName / patternAdded value: +"\\S" - added
Input schema / properties / references / items / patternAdded value: +"\\S" - changed
Input schema / properties / start / descriptionPrevious value: -"Inclusive 1-based start."New value: +"Window start, 0-based inclusive." - added
Input schema / properties / variantSets / items / patternAdded value: +"\\S" - added
Input schema / properties / variants / items / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / appliedFilters / descriptionPrevious value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)." - added
Output schema / properties / capAdded value: +{ + "description": "The effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / dataframe / descriptionPrevious value: -"Dataframe handle when the full result set was materialized as a dataframe. Query it with brapi_dataframe_query (SQL)."New value: +"The matched rows, staged as a dataframe when results[] holds fewer." - changed
Output schema / properties / dataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / dataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / dataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / dataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / dataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / dataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / dataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / dataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / dataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / dataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - changed
Output schema / properties / distributions / descriptionPrevious value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `all_filters_dropped`: The active dialect dropped every filter the agent supplied — the upstream server does not honor any of the requested scope filters on this endpoint, so the call would silently widen to the unfiltered baseline. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "all_filters_dropped" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "all_filters_dropped" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no rows were returned — how to broaden filters or retry."New value: +"Why results[] is empty, or which bound cut it short and the dataframe holding the matched rows." - changed
Output schema / properties / refinementHint / descriptionPrevious value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large." - changed
Output schema / properties / results / descriptionPrevious value: -"Variant rows returned in-context (up to loadLimit)."New value: +"Leading matched variant rows, up to loadLimit and a 24,000-byte budget, whichever binds first." - changed
Output schema / properties / results / items / properties / end / descriptionPrevious value: -"1-based exclusive end position."New value: +"End position, 0-based exclusive per BrAPI." - changed
Output schema / properties / results / items / properties / start / descriptionPrevious value: -"1-based inclusive start position."New value: +"Start position, 0-based inclusive per BrAPI." - added
Output schema / properties / shownAdded value: +{ + "description": "Length of results[] when truncated.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total rows reported by the server."New value: +"Total rows reported by the server, else the rows scanned." - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.", + "type": "boolean" +}
- Changed
brapi_germplasm_performance10 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - removed
Input schema / properties / germplasmDbId / minLengthRemoved value: -1 - added
Input schema / properties / germplasmDbId / patternAdded value: +"\\S" - removed
Input schema / properties / studyDbIds / items / minLengthRemoved value: -1 - added
Input schema / properties / studyDbIds / items / patternAdded value: +"\\S" - added
Input schema / properties / variables / items / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection used."New value: +"Connection alias the call used." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `germplasm_not_found`: Upstream returned no germplasm record for the requested germplasmDbId. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `germplasm_not_found`: Upstream returned no germplasm record for the requested germplasmDbId. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "germplasm_not_found" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "germplasm_not_found" +] - changed
Output schema / properties / warnings / descriptionPrevious value: -"Advisory messages (study-discovery limits, dropped filters, fallback paths, per-study failures)."New value: +"Advisory messages (study-discovery limits, dropped filters, fallback paths, per-study failures, partial study scans)."
- Changed
brapi_get_germplasm7 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - removed
Input schema / properties / germplasmDbId / minLengthRemoved value: -1 - added
Input schema / properties / germplasmDbId / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / directParentCount / descriptionPrevious value: -"Count of direct parents."New value: +"Length of parents[]; 0 also when the pedigree lookup is unsupported or failed." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `germplasm_not_found`: Upstream returned no germplasm record for the requested DbId. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `germplasm_not_found`: Upstream returned no germplasm record for the requested DbId. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "germplasm_not_found" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "germplasm_not_found" +]
- Changed
brapi_get_image7 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - removed
Input schema / properties / imageDbIds / items / minLengthRemoved value: -1 - added
Input schema / properties / imageDbIds / items / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `images_unsupported`: BrAPI server does not advertise /images in /serverinfo. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `images_unsupported`: The BrAPI server does not advertise /images. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "images_unsupported" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "images_unsupported" +] - changed
Output schema / properties / images / items / properties / mimeType / descriptionPrevious value: -"Actual MIME type of the returned bytes."New value: +"Content-Type of the byte response, else the metadata mimeType, else application/octet-stream."
- Changed
brapi_get_study6 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - removed
Input schema / properties / studyDbId / minLengthRemoved value: -1 - added
Input schema / properties / studyDbId / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `study_not_found`: Upstream returned no study record for the requested DbId. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `study_not_found`: Upstream returned no study record for the requested DbId. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "study_not_found" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "study_not_found" +]
- Changed
brapi_raw_get20 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - removed
Input schema / properties / path / minLengthRemoved value: -1 - added
Input schema / properties / path / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / dataframe / descriptionPrevious value: -"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_dataframe_query."New value: +"The pages of a list-shaped result, staged when the upstream advertised more rows than `loadLimit`. The inline `result` is unchanged." - changed
Output schema / properties / dataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / dataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / dataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / dataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / dataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / dataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / dataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / dataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / dataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / dataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `cross_origin_path`: path argument was a full URL instead of a relative BrAPI route. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `cross_origin_path`: path argument was a full URL instead of a relative BrAPI route. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "cross_origin_path" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "cross_origin_path" +] - added
Output schema / properties / noticeAdded value: +{ + "description": "When a dataframe was staged, its name and the tools that read it.", + "type": "string" +} - changed
Output schema / properties / suggestion / descriptionPrevious value: -"Emitted when a curated goal-shaped tool covers this endpoint."New value: +"Emitted when a curated goal-shaped tool covers this endpoint, or takes the IDs it lists." - added
Output schema / properties / warningsAdded value: +{ + "description": "Advisory messages — present when the dataframe walk stopped before the upstream total.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
brapi_raw_search18 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / dataframe / descriptionPrevious value: -"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_dataframe_query."New value: +"Every fetched page of a list-shaped result, inline rows included, staged when the upstream advertised more rows than `loadLimit`. The inline `result` is unchanged." - changed
Output schema / properties / dataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / dataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / dataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / dataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / dataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / dataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / dataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / dataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / dataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / dataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. `search_endpoint_disabled`: The active dialect declares this POST /search/{noun} route as known-dead on this server. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. `search_endpoint_disabled`: The active dialect declares this POST /search/{noun} route as known-dead on this server. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias", - "search_endpoint_disabled" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked", + "search_endpoint_disabled" +] - added
Output schema / properties / noticeAdded value: +{ + "description": "When a dataframe was staged, its name and the tools that read it.", + "type": "string" +} - changed
Output schema / properties / suggestion / descriptionPrevious value: -"Emitted when a curated goal-shaped tool covers this search."New value: +"Emitted when a curated goal-shaped tool covers this search, or takes the IDs it lists." - added
Output schema / properties / warningsAdded value: +{ + "description": "Advisory messages — present when the dataframe walk stopped before the upstream total.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
brapi_server_info10 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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 same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via `brapi_connect` works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - changed
Output schema / properties / attribution / descriptionPrevious value: -"Attribution metadata for built-in known-server connections. Absent for custom (env-only) connections."New value: +"Attribution metadata for built-in known-server connections. Absent when the alias is not built-in or points away from its built-in base URL." - changed
Output schema / properties / capabilities / descriptionPrevious value: -"Capability profile derived from /serverinfo."New value: +"Capability profile derived from /serverinfo or /calls." - changed
Output schema / properties / capabilities / properties / supportedCount / descriptionPrevious value: -"Total distinct services the server advertises in /calls."New value: +"Total distinct services the server advertises in /serverinfo or /calls." - changed
Output schema / properties / dialect / properties / id / descriptionPrevious value: -"Active dialect id (e.g. \"spec\", \"cassavabase\"). Names a registered adapter that translates outbound filters and declares known-dead routes."New value: +"Active dialect id (e.g. \"spec\", \"cassavabase\")." - changed
Output schema / properties / dialect / properties / inferredMappingCount / descriptionPrevious value: -"Number of filter translations inferred from naming conventions but not independently verified. A non-zero count means some result narrowing on this server may not fire as expected."New value: +"Filter translations inferred from naming conventions, unverified; when non-zero, some narrowing on this server may not fire." - changed
Output schema / properties / dialect / properties / verifiedMappingCount / descriptionPrevious value: -"Number of filter translations the dialect has empirically verified against a live server. Higher means more confidence in the translation table."New value: +"Filter translations verified against a live server. Absent when the dialect publishes no mapping summary." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked" +] - changed
Output schema / properties / nextToolSuggestions / items / properties / args / descriptionPrevious value: -"Arguments to call the tool with. Alias only — narrow further with the tool filters."New value: +"Arguments to start the tool with (alias only)."
- Changed
brapi_walk_pedigree42 fields changed- changed
Input schema / properties / alias / descriptionPrevious value: -"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-default alias must pass that same alias here."New value: +"Connection alias. Omit to use alias `default`. An alias registered via brapi_connect works, and so does one the server has a URL configured for (a built-in alias, an operator-configured alias, or `default` on a deployment with a default server), which connects on first use. Calls that used a non-default alias must pass that same alias here." - added
Input schema / properties / diagramAdded value: +{ + "description": "Also return the walk as diagram source: `mermaid` (flowchart) or `dot` (Graphviz). Edges point parent → child, roots are bold, loop-closing edges are dashed. Omit for no diagram.", + "enum": [ + "mermaid", + "dot" + ], + "type": "string" +} - changed
Input schema / properties / direction / descriptionPrevious value: -"Which direction to walk: ancestors (parents), descendants (progeny), or both."New value: +"Which direction to walk: ancestors (parents), descendants (progeny), or both — the union of the two walks. Ancestors are walked only upward and descendants only downward, so a descendant's other parent is not included." - removed
Input schema / properties / germplasmDbIds / items / minLengthRemoved value: -1 - added
Input schema / properties / germplasmDbIds / items / patternAdded value: +"\\S" - changed
Output schema / properties / alias / descriptionPrevious value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used." - changed
Output schema / properties / cycleCount / descriptionPrevious value: -"Number of times the walk revisited an already-registered node (cycles broken)."New value: +"Number of edges with isCycle: true. Paths that reconverge on one germplasm (shared ancestors, siblings, a parent shared by two roots) are not cycles." - added
Output schema / properties / diagramAdded value: +{ + "description": "Mermaid (`flowchart …`) or DOT (`digraph …`) source for the whole walk, nodes and edges past loadLimit included; present when `diagram` was requested. A diagram past 50,000 characters, or a Mermaid one past 500 edges, is omitted with a warning.", + "type": "string" +} - changed
Output schema / properties / edges / descriptionPrevious value: -"Deduplicated edge list. `relationship: \"parent\"` means `from` is a parent of `to`; `relationship: \"child\"` means `from` is a descendant of `to`."New value: +"One edge per parent–child pair." - changed
Output schema / properties / edges / items / descriptionPrevious value: -"One deduplicated pedigree edge between two nodes."New value: +"One parent–child pair, recorded once whichever side found it." - added
Output schema / properties / edges / items / properties / isCycleAdded value: +{ + "description": "True when this edge closes a loop (the parent is already a descendant of the child); the walk does not continue past it. Absent on other edges.", + "type": "boolean" +} - changed
Output schema / properties / edges / items / properties / parentType / descriptionPrevious value: -"E.g. MALE, FEMALE, SELF, when the upstream response supplies it."New value: +"The parent's role in the cross (e.g. MALE, FEMALE, SELF), when the upstream response supplies it." - changed
Output schema / properties / edges / items / properties / relationship / descriptionPrevious value: -"Direction: parent = from is a parent of to; child = from is a descendant of to."New value: +"Which lookup found the pair. parent = from is a parent of to (found via /pedigree); child = from is a child of to (found via /progeny). A pair found both ways is listed once, as parent." - changed
Output schema / properties / edgesDataframe / descriptionPrevious value: -"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 to a SQL-safe identifier; columnLegend maps it back. Query with brapi_dataframe_query (SQL)."New value: +"The full edge set, staged when the walk exceeds loadLimit; edges[] is then a bounded preview. Reserved-word columns are renamed (`from` → `from_`; see columnLegend)." - changed
Output schema / properties / edgesDataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / edgesDataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / edgesDataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / edgesDataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / edgesDataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / edgesDataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / edgesDataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / edgesDataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / edgesDataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / edgesDataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection has been registered under the requested alias. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_alias`: No connection is registered under the requested alias, and the server has no base URL configured for it to connect on first use. `auth_token_exchange_failed`: Connecting the alias on first use, the SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Connecting the alias on first use, the token endpoint answered without returning an access token. `capability_discovery_unavailable`: Neither /serverinfo nor /calls listed any call, and at least one of them timed out, was unreachable, or answered 429 or a 5xx other than 501, so nothing was cached. `upstream_unauthorized`: The BrAPI server answered HTTP 401: it requires credentials, or rejected the ones sent. `upstream_forbidden`: The BrAPI server answered HTTP 403: the credentials sent, or their absence, lack access. `alias_base_url_invalid`: The base URL configured on the server for this alias is not an absolute http(s) URL, or carries credentials. `private_address_blocked`: The base URL configured for this alias, or its token URL, is on a private or reserved address this server may not reach. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "unknown_alias" -]New value: +[ + "unknown_alias", + "auth_token_exchange_failed", + "auth_no_access_token", + "capability_discovery_unavailable", + "upstream_unauthorized", + "upstream_forbidden", + "alias_base_url_invalid", + "private_address_blocked" +] - changed
Output schema / properties / leafCount / descriptionPrevious value: -"Nodes that have no outgoing edges in the walked direction — terminal in the DAG."New value: +"Non-root nodes with nothing recorded beyond them: ancestors with no parents, descendants with no progeny (a node on both sides needs neither). Includes nodes the depth limit stopped at." - changed
Output schema / properties / nodes / items / properties / direction / descriptionPrevious value: -"Side of the root this node was reached from. `root` = the starting germplasm itself. `ancestor` = reached via /pedigree (a parent of the root or one of its parents). `descendant` = reached via /progeny. `both` = encountered as both an ancestor and a descendant in a bidirectional walk (rare — backcross or selfing chain)."New value: +"`root` = a starting germplasm; `ancestor` = reached upward via /pedigree; `descendant` = reached downward via /progeny; `both` = reached from both sides (a descendant of one root and an ancestor of another, or a node on a pedigree loop)." - changed
Output schema / properties / nodesDataframe / descriptionPrevious value: -"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 germplasmDbId."New value: +"The full node set, staged when the walk exceeds loadLimit; nodes[] is then a bounded preview. JOIN its germplasmDbId to the edges dataframe on from_ or to." - changed
Output schema / properties / nodesDataframe / properties / columnLegend / descriptionPrevious value: -"Maps a sanitized column name back to its original upstream key, for columns renamed to clear the SQL-safe-identifier gate (e.g. `end` → `end_`). Present only when a column was renamed — write SQL against the sanitized (left-hand) names."New value: +"Sanitized column name → original upstream key, present only when a column was renamed to be SQL-safe (e.g. `end` → `end_`). SQL uses the sanitized names." - changed
Output schema / properties / nodesDataframe / properties / columns / descriptionPrevious value: -"Full column list of the dataframe."New value: +"Every column name." - changed
Output schema / properties / nodesDataframe / properties / columns / items / descriptionPrevious value: -"Column name from the materialized rows."New value: +"Column name." - changed
Output schema / properties / nodesDataframe / properties / createdAt / descriptionPrevious value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time." - changed
Output schema / properties / nodesDataframe / properties / expiresAt / descriptionPrevious value: -"ISO 8601 timestamp after which the dataframe metadata will be purged. Re-run the find_* tool to refresh, or copy results out before expiry."New value: +"ISO 8601 time the dataframe metadata is purged; copy rows out before, or re-run the producing tool." - changed
Output schema / properties / nodesDataframe / properties / maxRows / descriptionPrevious value: -"Cap that was applied at create time, when truncation occurred."New value: +"Row cap that ended the pull, present only when that cap fired." - changed
Output schema / properties / nodesDataframe / properties / rowCount / descriptionPrevious value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe." - changed
Output schema / properties / nodesDataframe / properties / tableName / descriptionPrevious value: -"Dataframe name. Use with brapi_dataframe_describe (schema + provenance) and brapi_dataframe_query (SQL)."New value: +"Table name for brapi_dataframe_describe and brapi_dataframe_query." - changed
Output schema / properties / nodesDataframe / properties / totalCount / descriptionPrevious value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount." - changed
Output schema / properties / nodesDataframe / properties / truncated / descriptionPrevious value: -"True when the dataframe hit a row cap before exhausting upstream."New value: +"True when the dataframe holds less than the upstream reports: a cap, failed page, deadline, or short upstream ended the pull, or it was skipped. warnings says which. Absent otherwise." - added
Output schema / properties / noticeAdded value: +{ + "description": "When the walk was staged, the node and edge dataframes and how to read them.", + "type": "string" +} - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when the walk hit the 1000-node safety cap before exhausting depth."New value: +"True when the walk hit its safety cap (1000 nodes or 10000 edges) before exhausting depth." - changed
Output schema / properties / warnings / descriptionPrevious value: -"Advisory messages (capability gaps, per-node expansion failures)."New value: +"Advisory messages (capability gaps, per-node expansion failures, an omitted diagram)."
2 tool updates
- Changed
brapi_connect4 fields changed- changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "alias", - "baseUrl", - "server", - "auth", - "capabilities", - "dialect", - "content", - "notes", - "fetchedAt" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "alias", + "baseUrl", + "server", + "auth", + "capabilities", + "dialect", + "content", + "nextToolSuggestions", + "notes", + "fetchedAt" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `auth_token_exchange_failed`: SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Token endpoint responded but did not return an access_token. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `auth_session_required`: Caller-supplied credentials on an HTTP deployment without per-user auth, from a request that carries no MCP session. `auth_base_url_mismatch`: The alias has server-configured credentials and the supplied baseUrl differs from the server configured for it. `alias_base_url_unset`: The alias has server-configured credentials but no base URL of its own (no BRAPI_<ALIAS>_BASE_URL and no enabled built-in), so they pair with no server. `auth_token_exchange_failed`: SGN or OAuth token exchange against the BrAPI /token endpoint failed. `auth_no_access_token`: Token endpoint responded but did not return an access_token. `upstream_unauthorized`: The server answered HTTP 401 on /serverinfo or /calls — it requires login for capability discovery. `upstream_forbidden`: The server answered HTTP 403 on /serverinfo or /calls — the request (anonymous or credentialed) lacks read access. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "auth_token_exchange_failed", - "auth_no_access_token" -]New value: +[ + "auth_session_required", + "auth_base_url_mismatch", + "alias_base_url_unset", + "auth_token_exchange_failed", + "auth_no_access_token", + "upstream_unauthorized", + "upstream_forbidden" +] - added
Output schema / properties / nextToolSuggestionsAdded value: +{ + "description": "Entry-point finders (studies, germplasm, variables, locations — in that order) whose GET or POST /search route this server exposes under the active dialect. Empty when none apply.", + "items": { + "additionalProperties": false, + "description": "A finder the connected server supports, with the arguments to start it.", + "properties": { + "args": { + "additionalProperties": false, + "description": "Arguments to call the tool with. Alias only — narrow further with the tool filters.", + "properties": { + "alias": { + "description": "Connection alias to pass to the suggested tool.", + "type": "string" + } + }, + "required": [ + "alias" + ], + "type": "object" + }, + "reason": { + "description": "Why this tool applies to the connected server.", + "type": "string" + }, + "toolName": { + "description": "Entry-point finder tool this server can serve.", + "enum": [ + "brapi_find_studies", + "brapi_find_germplasm", + "brapi_find_variables", + "brapi_find_locations" + ], + "type": "string" + } + }, + "required": [ + "toolName", + "reason", + "args" + ], + "type": "object" + }, + "type": "array" +}
- Changed
brapi_server_info2 fields changed- changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "alias", - "baseUrl", - "server", - "auth", - "capabilities", - "dialect", - "content", - "notes", - "fetchedAt" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "alias", + "baseUrl", + "server", + "auth", + "capabilities", + "dialect", + "content", + "nextToolSuggestions", + "notes", + "fetchedAt" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / nextToolSuggestionsAdded value: +{ + "description": "Entry-point finders (studies, germplasm, variables, locations — in that order) whose GET or POST /search route this server exposes under the active dialect. Empty when none apply.", + "items": { + "additionalProperties": false, + "description": "A finder the connected server supports, with the arguments to start it.", + "properties": { + "args": { + "additionalProperties": false, + "description": "Arguments to call the tool with. Alias only — narrow further with the tool filters.", + "properties": { + "alias": { + "description": "Connection alias to pass to the suggested tool.", + "type": "string" + } + }, + "required": [ + "alias" + ], + "type": "object" + }, + "reason": { + "description": "Why this tool applies to the connected server.", + "type": "string" + }, + "toolName": { + "description": "Entry-point finder tool this server can serve.", + "enum": [ + "brapi_find_studies", + "brapi_find_germplasm", + "brapi_find_variables", + "brapi_find_locations" + ], + "type": "string" + } + }, + "required": [ + "toolName", + "reason", + "args" + ], + "type": "object" + }, + "type": "array" +}
22 tool updates
- First observed
brapi_build_phenotype_matrix - First observed
brapi_connect - First observed
brapi_dataframe_describe - First observed
brapi_dataframe_query - First observed
brapi_describe_filters - First observed
brapi_export_genotype_matrix - First observed
brapi_find_genotype_calls - First observed
brapi_find_germplasm - First observed
brapi_find_images - First observed
brapi_find_locations - First observed
brapi_find_observations - First observed
brapi_find_studies - First observed
brapi_find_variables - First observed
brapi_find_variants - First observed
brapi_germplasm_performance - First observed
brapi_get_germplasm - First observed
brapi_get_image - First observed
brapi_get_study - First observed
brapi_raw_get - First observed
brapi_raw_search - First observed
brapi_server_info - First observed
brapi_walk_pedigree
Related MCP Connectors
MCP gateway federating 22 biomedical MCP servers behind one endpoint: gnomAD, ClinVar, HPO, VEP.
MetaboLights MCP — EBI's metabolomics study repository.
MCP server for Gramps genealogy via the Gramps Web API: CRUD, search, merge, timelines, DNA.
MyGene.info MCP. Docs: https://docs.mygene.info/en/latest/
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides access to EBI's MetaboLights metabolomics study repository via an MCP gateway, enabling querying and retrieval of metabolomics data.399 npmMIT
- AlicenseBqualityAmaintenanceEnables querying organism taxonomy, OBO reference terms, food and nutrition composition, organism and weather observations, and Wikidata alignments through nine MCP tools, with keyed source credentials resolved server-side.9MIT
- AlicenseBqualityBmaintenanceEnables biomedical research workflows via MCP, including experiment and document search, PDF text extraction, evidence retrieval, and validation with provenance tracking.10MIT
- AlicenseBqualityDmaintenanceMCP server providing access to the BERtron API for aggregating genomic and environmental data from multiple BER data sources, enabling geospatial search and health checks.83BSD 3-Clause
Glama MCP Gateway
Add one secure layer between your agents and this server.