Skip to main content
Glama

Server Details

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

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
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

A4.1/5.0

Scored across 22 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness5/5

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 tools
brapi_build_phenotype_matrixBrapi Build Phenotype MatrixA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
aliasNoConnection 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.
shapeNoMatrix 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
studiesYesstudyDbIds to include in the matrix. At least one is required — the tool is study-anchored to avoid full-table scans.
aggregateNoHow 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
germplasmNoOptional subset of germplasmDbIds to include. Omit to include all germplasm found in the queried studies.
loadLimitNoCap on matching observations collected per study. Omit for the deployment default. A study that stops at it is reported as truncated.
variablesNoOptional subset of observationVariableDbIds to include. Omit to include all variables found in the queried studies.
extraFiltersNoExtra 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

NameRequiredDescription
capNoPer-study cap on matching observations that was applied.
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
shapeNoMatrix shape — wide (one row per germplasm, one column per variable) or long (one row per observation).
shownNoObservations collected across all studies after filtering.
noticeNoGuidance for reaching the observations this call left out, then the matrix dataframe and the tools that read it.
studiesNoRequested studyDbIds; coverage records collection outcomes.
coverageNoCollection coverage, independent of the number of contributing studies.
warningsNoAdvisory messages (empty or failed studies, partial study scans, extraFilters the rows contradict or cannot verify, non-numeric aggregation skips, fallback paths).
aggregateNoAggregation applied to replicate observations (wide shape only). `all` keeps one row per replicate.
dataframeNoThe 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).
truncatedNoTrue when failed, truncated, or unprocessed studies leave matrix coverage incomplete.
variableCountNoNumber of distinct observation variables in the matrix.
germplasmCountNoNumber of distinct germplasm in the matrix.
variableLegendNoWide-matrix column name (SQL-safe, derived from observationVariableDbId) → observationVariableName.
observationCountNoTotal raw observations collected before pivoting.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ConnectA
Idempotent
Inspect

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.

NameRequiredDescriptionDefault
authNoAuth payload. Omit to use credentials configured server-side for this alias (or no auth when none are configured).
aliasNoAlias for this connection. Use distinct aliases to register multiple BrAPI servers in one session.default
baseUrlNoBrAPI 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

NameRequiredDescription
authNoAuth summary for the active connection.
aliasNoConnection alias.
errorNoPresent when the call failed. Absent on success.
notesNoServer-specific quirks or degradation notes.
serverNoNormalized server identity block.
baseUrlNoBrAPI v2 base URL for this connection.
contentNoContent summary (crops + optional totals).
dialectNoActive dialect adapter — translates outbound filters and declares known-dead routes for this server.
fetchedAtNoISO 8601 timestamp of when this envelope was composed.
attributionNoAttribution metadata for built-in known-server connections. Absent when the alias is not built-in or points away from its built-in base URL.
capabilitiesNoCapability profile derived from /serverinfo or /calls.
nextToolSuggestionsNoEntry-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

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 DescribeA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
dataframeNoWhen set, return only the named dataframe. Omit to list all dataframes.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
tablesNoAll described dataframes.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
sqlYesSELECT 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.
previewNoCap 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.
rowLimitNoHard 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.
registerAsNoPersist 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

NameRequiredDescription
capNoRow ceiling that bound the response: the smallest of preview, rowLimit, and the deployment-wide response cap.
rowsNoLeading rows bounded by preview/rowLimit and 24,000 bytes on each serialized row representation. May be empty when the first row is oversized.
errorNoPresent when the call failed. Absent on success.
shownNoRows materialized into `rows`.
noticeNoGuidance for reaching the rows this response left out.
columnsNoColumn names and types in projection order, enough to write a follow-up query.
rowCountNoTotal rows the query produced (may exceed `rows.length` when capped).
dataframeNoName of the dataframe holding the full result, populated when `registerAs` was supplied. Reference this name in follow-up queries.
truncatedNoTrue when the response carries fewer rows than the query produced.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 FiltersA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
endpointYesBrAPI endpoint to describe filters for.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
filtersNoFilter catalog entries.
endpointNoThe endpoint the filters apply to.
filterCountNoNumber of filters in the catalog.
specReferenceNoPointer to the BrAPI v2 spec section for this endpoint.
availableEndpointsNoEvery endpoint this tool can describe — useful for discovery.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 MatrixA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
aliasNoConnection 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.
formatYesOutput 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.
maxCallsNoLower 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`.
maxColumnsNoLower 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.
germplasmDbIdsNoRestrict to these germplasm. Omit to pull all germplasm in the variant set (use with caution on large sets).
variantSetDbIdYesVariant 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

NameRequiredDescription
mapNoPLINK .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".
pedNoPLINK .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`.
vcfNoVCF-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".
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
formatNoThe output format that was produced.
noticeNoThe matrix dataframe and the tools that read it.
rowCountNoNumber of call-set (germplasm) rows in the matrix.
warningsNoAdvisory messages (truncation, missing fields, etc.).
dataframeNoThe 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.
truncatedNoTrue 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.
columnCountNoNumber of variant columns in the matrix (excluding the germplasm ID column).
callFormattingNoGenotype-encoding hints echoed by the server.
variantColumnLegendNoSQL-safe dataframe column name → original variantDbId.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 CallsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
aliasNoConnection 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.
loadLimitNoCap 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).
callFormatNoRequested call-encoding format, when the server honors it.
callSetDbIdsNoRestrict to these call sets directly.
variantDbIdsNoRestrict to specific variants.
germplasmDbIdsNoRestrict to these germplasm (call sets).
variantSetDbIdNoScope 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.
variantSetDbIdsNoAlternative: multiple variant sets at once, found the same way.

Output Schema

NameRequiredDescription
capNoThe effective loadLimit when results[] was cut short; shown is below it when the 24,000-byte inline budget bound first (notice says which).
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
shownNoLength of results[] when loadLimit or the inline byte budget cut it short of the collected calls.
noticeNoWhy no calls were returned, or which bound cut results[] short and the dataframe holding every collected call.
hasMoreNoTrue 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.
resultsNoLeading collected call rows, up to loadLimit and a 24,000-byte budget, whichever binds first.
warningsNoAdvisory messages (truncation, capability gaps, partial pulls).
dataframeNoEvery collected call, staged when results[] holds fewer rows than were collected.
truncatedNoTrue when the deployment-wide pull limit was reached and more calls exist upstream. Narrow the filters and re-pull.
totalCountNoTotal 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).
distributionsNoValue frequency per field across the full collected call set.
returnedCountNoLength of results[].
appliedFiltersNoThe body sent to POST /search/calls (variant/germplasm/call-set scope plus pageSize).
callFormattingNoGenotype-encoding hints echoed by the server.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines5/5

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 GermplasmA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
textNoFree-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.
aliasNoConnection 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.
cropsNoFilter by common crop names.
genusNoBotanical genus.
namesNoFilter by germplasm display names.
speciesNoBotanical species.
synonymsNoMatch registered synonyms.
loadLimitNoCap 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.
collectionsNoFilter by germplasm collection names.
extraFiltersNoExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
germplasmPUIsNoPersistent unique identifiers.
germplasmDbIdsNoFilter by DbIds.
accessionNumbersNoFilter by accession numbers (gene-bank catalog codes).

Output Schema

NameRequiredDescription
capNoThe effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
shownNoLength of results[] when truncated.
noticeNoWhy results[] is empty, or which bound cut it short and the dataframe holding the matched rows.
hasMoreNoTrue when more rows exist beyond the returned set.
resultsNoLeading matched germplasm rows, up to loadLimit and a 24,000-byte budget, whichever binds first.
warningsNoAdvisory messages (filter overrides, partial data, capability gaps).
dataframeNoThe matched rows, staged as a dataframe when results[] holds fewer.
truncatedNoTrue when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.
totalCountNoTotal rows reported by the server, else the rows scanned.
distributionsNoValue frequency per field across every matched row fetched.
returnedCountNoLength of results[].
appliedFiltersNoFilter map sent upstream (named filters plus extraFilters).
refinementHintNoSuggested refinement when the result set is large.

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 ImagesA
Read-only
Inspect

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

NameRequiredDescriptionDefault
aliasNoConnection 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.
imagesNoFilter by imageDbIds.
studiesNoFilter by studyDbIds.
loadLimitNoCap 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.
mimeTypesNoFilter by MIME type — e.g. "image/jpeg", "image/png".
extraFiltersNoExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
observationsNoFilter by observationDbIds.
imageFileNamesNoFilter by uploaded file name.
observationUnitsNoFilter by observationUnitDbIds.
descriptiveOntologyTermsNoFilter by ontology tags (e.g. "CO_334:plot").

Output Schema

NameRequiredDescription
capNoThe effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
shownNoLength of results[] when truncated.
noticeNoWhy results[] is empty, or which bound cut it short and the dataframe holding the matched rows.
hasMoreNoTrue when more rows exist beyond the returned set.
resultsNoLeading matched image metadata rows, up to loadLimit and a 24,000-byte budget, whichever binds first.
warningsNoAdvisory messages (filter overrides, partial data, capability gaps).
dataframeNoThe matched rows, staged as a dataframe when results[] holds fewer.
truncatedNoTrue when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.
totalCountNoTotal rows reported by the server, else the rows scanned.
distributionsNoValue frequency per field across every matched row fetched.
returnedCountNoLength of results[].
appliedFiltersNoFilter map sent upstream (named filters plus extraFilters).
refinementHintNoSuggested refinement when the result set is large.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 LocationsA
Read-only
Inspect

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

NameRequiredDescriptionDefault
bboxNoOptional post-fetch bounding box. Nonempty boxes require all four bounds with minimum <= maximum; malformed boxes fail. An empty object is omitted.
aliasNoConnection 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.
loadLimitNoCap 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.
locationsNoFilter by locationDbIds.
countryCodesNoCountry codes; alphabetic codes are uppercased, numeric upstream codes are preserved.
countryNamesNoEnglish 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.
extraFiltersNoExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
abbreviationsNoShort location abbreviations.
locationNamesNoFilter by display name.
locationTypesNoLocation type — e.g. "Research Station", "Field".

Output Schema

NameRequiredDescription
capNoThe effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
shownNoLength of results[] when truncated.
noticeNoWhy results[] is empty, or which bound cut it short and the dataframe holding the matched rows.
hasMoreNoTrue when more rows exist beyond the returned set.
resultsNoLeading 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.
warningsNoAdvisory messages (unresolved country names, filter overrides, capability gaps).
dataframeNoThe matched rows, staged as a dataframe when results[] holds fewer.
truncatedNoTrue when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.
totalCountNoTotal rows reported by the server, else the rows scanned; with an active bbox, the scanned rows inside it.
distributionsNoValue frequency per field across every matched row fetched.
returnedCountNoLength of results[] after any bbox filtering.
appliedFiltersNoFilter map sent upstream (named filters plus extraFilters).
refinementHintNoSuggested refinement when the result set is large.
coordinateAxisOrderNoAxis 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

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ObservationsA
Read-only
Inspect

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

NameRequiredDescriptionDefault
aliasNoConnection 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.
trialsNoFilter by trialDbIds.
seasonsNoFilter by seasonDbIds (e.g. "2022").
studiesNoFilter by studyDbIds.
programsNoFilter by programDbIds.
germplasmNoFilter by germplasmDbIds.
loadLimitNoCap 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.
variablesNoFilter by observationVariableDbIds.
timestampToNoISO 8601 end of the observation-time window.
extraFiltersNoExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
observationsNoFilter by observationDbIds.
timestampFromNoISO 8601 start of the observation-time window.
observationUnitsNoFilter by observationUnitDbIds.
observationLevelsNoObservation unit level (plot, plant, field, etc.).

Output Schema

NameRequiredDescription
capNoThe effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
shownNoLength of results[] when truncated.
noticeNoWhy results[] is empty, or which bound cut it short and the dataframe holding the matched rows.
hasMoreNoTrue when more rows exist beyond the returned set.
resultsNoLeading matched observation rows, up to loadLimit and a 24,000-byte budget, whichever binds first.
warningsNoAdvisory messages (filter overrides, partial data, capability gaps).
dataframeNoThe matched rows, staged as a dataframe when results[] holds fewer.
truncatedNoTrue when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.
totalCountNoUpstream observation total, or the matched observations collected on the embedded-unit route; warnings disclose incomplete scans.
distributionsNoValue frequency per field across every matched row fetched.
returnedCountNoLength of results[].
appliedFiltersNoUpstream filter map, or separate upstreamRequests and clientSide criteria for embedded-unit collection.
refinementHintNoSuggested refinement when the result set is large.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 StudiesA
Read-only
Inspect

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

NameRequiredDescriptionDefault
cropNoFilter by common crop name (single value).
aliasNoConnection 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.
activeNoRestrict to active / inactive studies.
trialsNoFilter by trialDbIds.
seasonsNoFilter by seasons (e.g. "2022").
programsNoFilter by programDbIds.
loadLimitNoCap 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.
locationsNoFilter 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.
studyNamesNoFilter by study display name.
trialTypesNoFilter by study types.
extraFiltersNoExtra 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

NameRequiredDescription
capNoThe effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
shownNoLength of results[] when truncated.
noticeNoWhy results[] is empty, or which bound cut it short and the dataframe holding the matched rows.
hasMoreNoTrue when more rows exist beyond the returned set.
resultsNoLeading matched rows, up to loadLimit and a 24,000-byte budget, whichever binds first.
warningsNoAdvisory messages (filter overrides, partial data).
dataframeNoThe matched rows, staged as a dataframe when results[] holds fewer.
truncatedNoTrue when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.
totalCountNoTotal rows reported by the server, else the rows scanned; with `locations` applied client-side, the matched rows fetched.
distributionsNoValue frequency per field across every matched row fetched.
returnedCountNoLength of results[].
appliedFiltersNoFilter map sent upstream (named filters plus extraFilters).
refinementHintNoSuggested refinement when the result set is large.
clientSideFiltersNoFilters this server ignores on /studies, applied to the scanned rows instead of sent upstream, keyed by input name.

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 VariablesA
Read-only
Inspect

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

NameRequiredDescriptionDefault
cropNoFilter by common crop name (single value).
textNoFree-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.
aliasNoConnection 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.
scalesNoFilter by scaleDbIds.
methodsNoFilter by methodDbIds.
studiesNoFilter 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.
loadLimitNoCap 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.
variablesNoFilter by observationVariableDbIds.
ontologiesNoFilter by ontologyDbIds.
extraFiltersNoExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
traitClassesNoFilter by trait class.
variablePUIsNoFilter by persistent ontology URIs.
variableNamesNoFilter by exact observationVariableNames.

Output Schema

NameRequiredDescription
capNoThe effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
shownNoLength of results[] when truncated.
noticeNoWhy results[] is empty, or which bound cut it short and the dataframe holding the matched rows.
hasMoreNoTrue when more rows exist beyond the returned set.
resultsNoLeading variables, capped by loadLimit and 24,000 bytes. Text candidates lead; nested objects with no non-empty field are omitted.
warningsNoAdvisory messages (filter overrides, partial data, capability gaps).
dataframeNoMatched rows, staged when results[] holds fewer.
truncatedNoTrue when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.
totalCountNoTotal rows reported by the server, else the rows scanned.
distributionsNoValue frequency per field across every matched row fetched.
returnedCountNoLength of results[].
studyCoverageNoMulti-study coverage; incomplete studies may omit variables.
appliedFiltersNoFilter map sent upstream (named filters plus extraFilters).
refinementHintNoSuggested refinement when the result set is large.
ontologyCandidatesNoRanked free-text candidates; empty without text.

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 VariantsA
Read-only
Inspect

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

NameRequiredDescriptionDefault
endNoWindow end, 0-based exclusive.
aliasNoConnection 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.
startNoWindow start, 0-based inclusive.
variantsNoFilter by variantDbIds.
loadLimitNoCap 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.
referencesNoFilter by referenceDbIds.
variantSetsNoFilter by variantSetDbIds.
extraFiltersNoExtra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.
referenceNameNoReference display name (e.g. "chr01", "chr1").

Output Schema

NameRequiredDescription
capNoThe effective loadLimit when truncated; shown is below it when the 24,000-byte inline budget bound first (notice says which).
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
shownNoLength of results[] when truncated.
noticeNoWhy results[] is empty, or which bound cut it short and the dataframe holding the matched rows.
hasMoreNoTrue when more rows exist beyond the returned set.
resultsNoLeading matched variant rows, up to loadLimit and a 24,000-byte budget, whichever binds first.
warningsNoAdvisory messages (filter overrides, partial data, capability gaps).
dataframeNoThe matched rows, staged as a dataframe when results[] holds fewer.
truncatedNoTrue when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.
totalCountNoTotal rows reported by the server, else the rows scanned.
distributionsNoValue frequency per field across every matched row fetched.
returnedCountNoLength of results[].
appliedFiltersNoFilter map sent upstream (named filters plus extraFilters).
refinementHintNoSuggested refinement when the result set is large.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 PerformanceA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
aliasNoConnection 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.
variablesNoOptional subset of observationVariableDbIds to aggregate. Omit to include every variable observed for the germplasm.
studyDbIdsNoOptional 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.
germplasmDbIdYesThe germplasmDbId to summarize performance for.

Output Schema

NameRequiredDescription
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
coverageNoCollection coverage, independent of the number of contributing studies.
warningsNoAdvisory messages (study-discovery limits, dropped filters, fallback paths, per-study failures, partial study scans).
studyCountNoNumber of distinct studies that contributed any observation.
studyDbIdsNoDistinct studyDbIds that contributed observations.
perVariableNoPer-variable aggregates, sorted by observationVariableDbId.
germplasmDbIdNoThe germplasm that was analyzed.
germplasmNameNoDisplay name of the germplasm, when the server provides one.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 GermplasmA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
aliasNoConnection 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.
germplasmDbIdYesGermplasm identifier.

Output Schema

NameRequiredDescription
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
parentsNoDirect parents from /germplasm/{id}/pedigree.
warningsNoAdvisory messages — failed sub-endpoint lookups, missing counts.
germplasmNoCanonical germplasm record as returned by `/germplasm/{id}`.
attributesNoGermplasm attributes from /germplasm/{id}/attributes.
studyCountNoHow many studies this germplasm has appeared in.
directParentCountNoLength of parents[]; 0 also when the pedigree lookup is unsupported or failed.
directDescendantCountNoCount of direct descendants from /germplasm/{id}/progeny.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 ImageA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
aliasNoConnection 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.
imageDbIdsYes1–5 image identifiers.

Output Schema

NameRequiredDescription
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
errorsNoImages that could not be loaded, one entry per id.
imagesNoSuccessfully loaded images.
warningsNoPer-image advisories; non-image MIME responses are errors, not successful images.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 StudyA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
aliasNoConnection 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.
studyDbIdYesStudy identifier.

Output Schema

NameRequiredDescription
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
studyNoCanonical study record as returned by `/studies/{id}`.
trialNoResolved trial record (when the study has a trialDbId and the FK lookup succeeded).
programNoResolved program record (when the study or parent trial identifies a program and the FK lookup succeeded).
locationNoResolved location record (when the study has a locationDbId and the FK lookup succeeded).
warningsNoAdvisory messages — failed FK lookups, missing counts.
variableCountNoTotal 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.
observationCountNoTotal 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.
observationUnitCountNoTotal observation units (plots, plants, samples) in this study.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 GetA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
pathYesEndpoint path — e.g. "/samples", "/methods". Leading "/" is optional.
aliasNoConnection 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.
paramsNoQuery parameters to append. Arrays are repeated per BrAPI convention.
loadLimitNoCap 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

NameRequiredDescription
capNoEffective loadLimit row ceiling, even when the byte budget binds first.
urlNoFully resolved URL that was fetched (baseUrl + path + query string).
pathNoNormalized path (leading `/` preserved) that was appended to the baseUrl.
aliasNoConnection alias the call used.
errorNoPresent when the call failed. Absent on success.
shownNoActual list rows returned inline.
noticeNoWhen a dataframe was staged, its name and the tools that read it.
resultNoRaw BrAPI `result` value — whatever shape the endpoint returns.
metadataNoBrAPI envelope metadata (pagination and any additional upstream fields).
warningsNoAdvisory messages — present when the dataframe walk stopped before the upstream total.
dataframeNoEvery fetched row of a list result, staged when the inline preview omits rows. Explicit paging stages only the requested page.
truncatedNoTrue when the inline list leaves fetched or matching rows out.
suggestionNoEmitted when a curated goal-shaped tool covers this endpoint, or takes the IDs it lists.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_server_infoBrapi Server InfoA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
aliasNoConnection 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.
forceRefreshNoBypass the cached capability profile and refetch from the server.

Output Schema

NameRequiredDescription
authNoAuth summary for the active connection.
aliasNoConnection alias.
errorNoPresent when the call failed. Absent on success.
notesNoServer-specific quirks or degradation notes.
serverNoNormalized server identity block.
baseUrlNoBrAPI v2 base URL for this connection.
contentNoContent summary (crops + optional totals).
dialectNoActive dialect adapter — translates outbound filters and declares known-dead routes for this server.
fetchedAtNoISO 8601 timestamp of when this envelope was composed.
attributionNoAttribution metadata for built-in known-server connections. Absent when the alias is not built-in or points away from its built-in base URL.
capabilitiesNoCapability profile derived from /serverinfo or /calls.
nextToolSuggestionsNoEntry-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

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 PedigreeA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
aliasNoConnection 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.
diagramNoAlso 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.
maxDepthNoMax generations to walk per direction (default 3, cap 10).
directionNoWhich 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
loadLimitNoRow 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.
germplasmDbIdsYesStarting germplasm (1–20 roots). All roots are walked concurrently.

Output Schema

NameRequiredDescription
aliasNoConnection alias the call used.
edgesNoOne edge per discovered pair. Preview independently fits loadLimit and 24,000 bytes for array JSON and serialized row text; edgesDataframe retains omitted rows.
errorNoPresent when the call failed. Absent on success.
nodesNoDiscovered nodes sorted by depth/DbId. Preview fits loadLimit and 24,000 bytes for array JSON and serialized row text; nodesDataframe retains omitted rows.
noticeNoStaged graph, frontier or omitted-relative tables and how to read them.
diagramNoRequested 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.
frontierNoBounded preview of unresolved directions; frontierDataframe retains omitted entries.
maxDepthNoThe maximum depth the walk was allowed to reach (echoed from the input).
warningsNoAdvisory messages (capability gaps, per-node expansion failures, an omitted diagram).
directionNoThe direction the walk expanded (echoed from the input).
leafCountNoNon-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.
rootCountNoNumber of starting germplasm roots.
truncatedNoTrue when the walk hit its safety cap (1000 nodes or 10000 edges) before exhausting depth.
cycleCountNoNumber of edges with isCycle: true. Paths that reconverge on one germplasm (shared ancestors, siblings, a parent shared by two roots) are not cycles.
deadEndCountNoNodes whose upstream pedigree/progeny lookup failed.
depthReachedNoDeepest BFS level that produced at least one new edge (0 if only roots were walked).
frontierCountNoUnresolved node/side expansions across the full walk.
edgesDataframeNoDiscovered edges when either preview is trimmed; truncated marks partial traversal. SQL renames from to from_; see columnLegend.
nodesDataframeNoDiscovered nodes when either preview is trimmed; truncated marks partial traversal. No unvisited relatives. JOIN germplasmDbId to the edge table on from_ or to.
frontierDataframeNoEvery unresolved node/side expansion, with ordinal ordering.
confirmedLeafCountNoNon-root nodes with successful empty lookups on every reached side; unresolved directions never confirm leaves.
knownOmittedRelativeCountNoDistinct fetched relative IDs per expansion node/side omitted by safety limits; unrequested counts remain unknown.
omittedRelativesDataframeNoFetched omitted relatives with ordinal, germplasmDbId, expansionNodeDbId and side; not an unvisited graph or resumable walk.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 15 tool updates
    • Changedbrapi_build_phenotype_matrix2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_export_genotype_matrix4 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / map / description
        Previous 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\"."
      • changedOutput schema / properties / vcf / description
        Previous 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\"."
    • Changedbrapi_find_genotype_calls2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_find_germplasm2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_find_images2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_find_locations2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_find_observations2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_find_studies2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_find_variables8 fields changed
      • changedInput schema / properties / studies / description
        Previous 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."
      • changedOutput schema / properties / dataframe / description
        Previous value: -"The matched rows, staged as a dataframe when results[] holds fewer."New value: +"Matched rows, staged when results[] holds fewer."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / ontologyCandidates / description
        Previous 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."
      • changedOutput schema / properties / results / description
        Previous 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."
      • addedOutput schema / properties / results / items / properties / studyDbIds
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "description": "Study ID.",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Requested studies containing this union row."
        +}
      • addedOutput schema / properties / studyCoverage
        Added 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"
        +}
    • Changedbrapi_find_variants2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_germplasm_performance2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_get_germplasm2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_get_study2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_raw_get2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_raw_search2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
  2. 6 tool updates
    • Changedbrapi_dataframe_query2 fields changed
      • changedInput schema / properties / registerAs / description
        Previous 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."
      • changedOutput schema / properties / rows / description
        Previous 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."
    • Changedbrapi_export_genotype_matrix2 fields changed
      • changedInput schema / properties / maxCalls / description
        Previous 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`."
      • changedInput schema / properties / maxColumns / description
        Previous 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."
    • Changedbrapi_get_image6 fields changed
      • changedOutput schema / properties / images / items / description
        Previous value: -"Successfully loaded image payload."New value: +"Metadata for a successfully loaded image; bytes appear once in content[] image blocks."
      • removedOutput schema / properties / images / items / properties / data
        Removed value: -{
        -  "description": "Base64-encoded image bytes.",
        -  "type": "string"
        -}
      • changedOutput schema / properties / images / items / properties / mimeType / description
        Previous 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."
      • changedOutput schema / properties / images / items / required
        Previous value: -[
        -  "imageDbId",
        -  "mimeType",
        -  "sizeBytes",
        -  "source",
        -  "data",
        -  "metadata"
        -]New value: +[
        +  "imageDbId",
        +  "mimeType",
        +  "sizeBytes",
        +  "source",
        +  "metadata"
        +]
      • changedOutput schema / properties / warnings / description
        Previous 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."
      • changedOutput schema / properties / warnings / items / description
        Previous value: -"Per-image advisory for loaded-but-suspect content (e.g. non-image MIME)."New value: +"Per-image advisory for successfully loaded images."
    • Changedbrapi_raw_get9 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "Effective loadLimit row ceiling, even when the byte budget binds first.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / dataframe / description
        Previous 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."
      • changedOutput schema / properties / metadata / properties / pagination / properties / currentPage / description
        Previous value: -"0-indexed page number the server returned."New value: +"0-indexed page number, when reported."
      • changedOutput schema / properties / metadata / properties / pagination / properties / pageSize / description
        Previous value: -"Rows per page."New value: +"Rows per page, when reported."
      • changedOutput schema / properties / metadata / properties / pagination / properties / totalCount / description
        Previous value: -"Total rows matching the query across all pages."New value: +"Total matching rows, when reported."
      • changedOutput schema / properties / metadata / properties / pagination / properties / totalPages / description
        Previous value: -"Total pages at the current pageSize."New value: +"Total pages, when reported."
      • removedOutput schema / properties / metadata / properties / pagination / required
        Removed value: -[
        -  "currentPage",
        -  "pageSize",
        -  "totalCount",
        -  "totalPages"
        -]
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Actual list rows returned inline.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the inline list leaves fetched or matching rows out.",
        +  "type": "boolean"
        +}
    • Changedbrapi_raw_search9 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "Effective loadLimit row ceiling, even when the byte budget binds first.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / dataframe / description
        Previous 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."
      • changedOutput schema / properties / metadata / properties / pagination / properties / currentPage / description
        Previous value: -"0-indexed page number the server returned."New value: +"0-indexed page number, when reported."
      • changedOutput schema / properties / metadata / properties / pagination / properties / pageSize / description
        Previous value: -"Rows per page."New value: +"Rows per page, when reported."
      • changedOutput schema / properties / metadata / properties / pagination / properties / totalCount / description
        Previous value: -"Total rows matching the query across all pages."New value: +"Total matching rows, when reported."
      • changedOutput schema / properties / metadata / properties / pagination / properties / totalPages / description
        Previous value: -"Total pages at the current pageSize."New value: +"Total pages, when reported."
      • removedOutput schema / properties / metadata / properties / pagination / required
        Removed value: -[
        -  "currentPage",
        -  "pageSize",
        -  "totalCount",
        -  "totalPages"
        -]
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Actual list rows returned inline.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the inline list leaves fetched or matching rows out.",
        +  "type": "boolean"
        +}
    • Changedbrapi_walk_pedigree14 fields changed
      • changedInput schema / properties / loadLimit / description
        Previous 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."
      • changedOutput schema / anyOf
        Previous 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"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / confirmedLeafCount
        Added value: +{
        +  "description": "Non-root nodes with successful empty lookups on every reached side; unresolved directions never confirm leaves.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / diagram / description
        Previous 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."
      • changedOutput schema / properties / edges / description
        Previous 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."
      • changedOutput schema / properties / edgesDataframe / description
        Previous 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."
      • addedOutput schema / properties / frontier
        Added 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"
        +}
      • addedOutput schema / properties / frontierCount
        Added value: +{
        +  "description": "Unresolved node/side expansions across the full walk.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / frontierDataframe
        Added 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"
        +}
      • addedOutput schema / properties / knownOmittedRelativeCount
        Added value: +{
        +  "description": "Distinct fetched relative IDs per expansion node/side omitted by safety limits; unrequested counts remain unknown.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / nodes / description
        Previous 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."
      • changedOutput schema / properties / nodesDataframe / description
        Previous 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."
      • changedOutput schema / properties / notice / description
        Previous 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."
      • addedOutput schema / properties / omittedRelativesDataframe
        Added 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"
        +}
  3. 5 tool updates
    • Changedbrapi_build_phenotype_matrix4 fields changed
      • changedOutput schema / anyOf
        Previous 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"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / coverage
        Added 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"
        +}
      • changedOutput schema / properties / studies / description
        Previous value: -"studyDbIds that were queried to build the matrix."New value: +"Requested studyDbIds; coverage records collection outcomes."
      • changedOutput schema / properties / truncated / description
        Previous 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."
    • Changedbrapi_find_locations6 fields changed
      • changedInput schema / properties / bbox / description
        Previous 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."
      • changedInput schema / properties / countryCodes / description
        Previous value: -"ISO 3166-1 alpha-3 country codes."New value: +"Country codes; alphabetic codes are uppercased, numeric upstream codes are preserved."
      • changedInput schema / properties / countryNames / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / warnings / description
        Previous value: -"Advisory messages (bbox malformed, filter overrides, capability gaps)."New value: +"Advisory messages (unresolved country names, filter overrides, capability gaps)."
    • Changedbrapi_find_observations2 fields changed
      • changedOutput schema / properties / appliedFilters / description
        Previous value: -"Filter map sent upstream (named filters plus extraFilters)."New value: +"Upstream filter map, or separate upstreamRequests and clientSide criteria for embedded-unit collection."
      • changedOutput schema / properties / totalCount / description
        Previous 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."
    • Changedbrapi_germplasm_performance3 fields changed
      • changedInput schema / properties / studyDbIds / description
        Previous 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."
      • changedOutput schema / anyOf
        Previous 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"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / coverage
        Added 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"
        +}
    • Changedbrapi_get_study1 field changed
      • changedOutput schema / properties / program / description
        Previous 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)."
  4. 21 tool updates
    • Changedbrapi_build_phenotype_matrix24 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • addedInput schema / properties / germplasm / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / loadLimit / description
        Previous 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."
      • addedInput schema / properties / studies / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / variables / items / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / cap / description
        Previous value: -"Per-study observation cap that was applied."New value: +"Per-study cap on matching observations that was applied."
      • changedOutput schema / properties / dataframe / description
        Previous 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)."
      • changedOutput schema / properties / dataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / dataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / dataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / dataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / dataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / dataframe / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / variableLegend / description
        Previous 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."
      • changedOutput schema / properties / warnings / description
        Previous 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)."
    • Changedbrapi_connect9 fields changed
      • changedOutput schema / properties / attribution / description
        Previous 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."
      • changedOutput schema / properties / capabilities / description
        Previous value: -"Capability profile derived from /serverinfo."New value: +"Capability profile derived from /serverinfo or /calls."
      • changedOutput schema / properties / capabilities / properties / supportedCount / description
        Previous value: -"Total distinct services the server advertises in /calls."New value: +"Total distinct services the server advertises in /serverinfo or /calls."
      • changedOutput schema / properties / dialect / properties / id / description
        Previous 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\")."
      • changedOutput schema / properties / dialect / properties / inferredMappingCount / description
        Previous 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."
      • changedOutput schema / properties / dialect / properties / verifiedMappingCount / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / nextToolSuggestions / items / properties / args / description
        Previous 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)."
    • Changedbrapi_dataframe_describe1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
    • Changedbrapi_dataframe_query8 fields changed
      • changedInput schema / properties / preview / description
        Previous 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."
      • changedInput schema / properties / preview / maximum
        Previous value: -1000New value: +9007199254740991
      • changedInput schema / properties / sql / description
        Previous 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."
      • changedOutput schema / properties / cap / description
        Previous 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."
      • changedOutput schema / properties / columns / description
        Previous 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."
      • changedOutput schema / properties / columns / items / properties / type / description
        Previous 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`."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "sql_rejected"
        -]New value: +[
        +  "sql_rejected",
        +  "sql_execution_error",
        +  "missing_table",
        +  "register_as_clash"
        +]
    • Changedbrapi_export_genotype_matrix22 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • addedInput schema / properties / germplasmDbIds / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / variantSetDbId / description
        Previous 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."
      • removedInput schema / properties / variantSetDbId / minLength
        Removed value: -1
      • addedInput schema / properties / variantSetDbId / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / dataframe / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / dataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / dataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / dataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / dataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / dataframe / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "The matrix dataframe and the tools that read it.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / variantColumnLegend / description
        Previous 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."
    • Changedbrapi_find_genotype_calls32 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • addedInput schema / properties / callSetDbIds / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / germplasmDbIds / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / loadLimit / description
        Previous 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)."
      • addedInput schema / properties / variantDbIds / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / variantSetDbId / description
        Previous 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."
      • removedInput schema / properties / variantSetDbId / minLength
        Removed value: -1
      • addedInput schema / properties / variantSetDbId / pattern
        Added value: +"\\S"
      • changedInput schema / properties / variantSetDbIds / description
        Previous value: -"Alternative: multiple variant sets at once."New value: +"Alternative: multiple variant sets at once, found the same way."
      • addedInput schema / properties / variantSetDbIds / items / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • addedOutput schema / properties / cap
        Added 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"
        +}
      • changedOutput schema / properties / dataframe / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / dataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / dataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / dataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / dataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / dataframe / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / hasMore / description
        Previous 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."
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / results / description
        Previous 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."
      • changedOutput schema / properties / returnedCount / description
        Previous value: -"Length of results[] — rows returned in-context (up to loadLimit)."New value: +"Length of results[]."
      • addedOutput schema / properties / shown
        Added 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"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous 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)."
      • changedOutput schema / properties / truncated / description
        Previous 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."
    • Changedbrapi_find_germplasm36 fields changed
      • addedInput schema / properties / accessionNumbers / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / alias / description
        Previous 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."
      • addedInput schema / properties / collections / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / crops / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / genus / pattern
        Added value: +"\\S"
      • addedInput schema / properties / germplasmDbIds / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / germplasmPUIs / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / loadLimit / description
        Previous 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."
      • addedInput schema / properties / names / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / species / pattern
        Added value: +"\\S"
      • addedInput schema / properties / synonyms / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / text / description
        Previous 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."
      • addedInput schema / properties / text / pattern
        Added value: +"^$|\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / appliedFilters / description
        Previous value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)."
      • addedOutput schema / properties / cap
        Added 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"
        +}
      • changedOutput schema / properties / dataframe / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / dataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / dataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / dataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / dataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / dataframe / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / distributions / description
        Previous value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / refinementHint / description
        Previous value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large."
      • changedOutput schema / properties / results / description
        Previous 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."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Length of results[] when truncated.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total rows reported by the server."New value: +"Total rows reported by the server, else the rows scanned."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.",
        +  "type": "boolean"
        +}
    • Changedbrapi_find_images32 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • addedInput schema / properties / descriptiveOntologyTerms / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / imageFileNames / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / images / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / loadLimit / description
        Previous 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."
      • addedInput schema / properties / mimeTypes / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / observationUnits / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / observations / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / studies / items / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / appliedFilters / description
        Previous value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)."
      • addedOutput schema / properties / cap
        Added 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"
        +}
      • changedOutput schema / properties / dataframe / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / dataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / dataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / dataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / dataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / dataframe / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / distributions / description
        Previous value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / refinementHint / description
        Previous value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large."
      • changedOutput schema / properties / results / description
        Previous 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."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Length of results[] when truncated.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total rows reported by the server."New value: +"Total rows reported by the server, else the rows scanned."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.",
        +  "type": "boolean"
        +}
    • Changedbrapi_find_locations32 fields changed
      • addedInput schema / properties / abbreviations / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / alias / description
        Previous 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."
      • addedInput schema / properties / countryCodes / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / countryNames / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / loadLimit / description
        Previous 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."
      • addedInput schema / properties / locationNames / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / locationTypes / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / locations / items / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / appliedFilters / description
        Previous value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)."
      • addedOutput schema / properties / cap
        Added 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"
        +}
      • changedOutput schema / properties / coordinateAxisOrder / description
        Previous 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."
      • changedOutput schema / properties / dataframe / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / dataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / dataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / dataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / dataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / dataframe / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / distributions / description
        Previous value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / refinementHint / description
        Previous value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large."
      • changedOutput schema / properties / results / description
        Previous 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."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Length of results[] when truncated.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous 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."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.",
        +  "type": "boolean"
        +}
    • Changedbrapi_find_observations38 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • addedInput schema / properties / germplasm / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / loadLimit / description
        Previous 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."
      • addedInput schema / properties / observationLevels / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / observationUnits / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / observations / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / programs / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / seasons / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / studies / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / timestampFrom / pattern
        Added value: +"\\S"
      • addedInput schema / properties / timestampTo / pattern
        Added value: +"\\S"
      • addedInput schema / properties / trials / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / variables / items / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / appliedFilters / description
        Previous value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)."
      • addedOutput schema / properties / cap
        Added 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"
        +}
      • changedOutput schema / properties / dataframe / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / dataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / dataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / dataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / dataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / dataframe / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / distributions / description
        Previous value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / refinementHint / description
        Previous value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large."
      • changedOutput schema / properties / results / description
        Previous 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."
      • changedOutput schema / properties / results / items / properties / season / anyOf
        Previous 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"
        +  }
        +]
      • changedOutput schema / properties / results / items / properties / season / description
        Previous 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."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Length of results[] when truncated.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total rows reported by the server."New value: +"Total rows reported by the server, else the rows scanned."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.",
        +  "type": "boolean"
        +}
    • Changedbrapi_find_studies34 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • addedInput schema / properties / crop / pattern
        Added value: +"\\S"
      • changedInput schema / properties / loadLimit / description
        Previous 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."
      • changedInput schema / properties / locations / description
        Previous 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."
      • addedInput schema / properties / locations / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / programs / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / seasons / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / studyNames / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / trialTypes / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / trials / items / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / appliedFilters / description
        Previous value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)."
      • addedOutput schema / properties / cap
        Added 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"
        +}
      • addedOutput schema / properties / clientSideFilters
        Added 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"
        +}
      • changedOutput schema / properties / dataframe / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / dataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / dataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / dataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / dataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / dataframe / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / distributions / description
        Previous value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / refinementHint / description
        Previous value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large."
      • changedOutput schema / properties / results / description
        Previous 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."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Length of results[] when truncated.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous 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."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.",
        +  "type": "boolean"
        +}
    • Changedbrapi_find_variables37 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • addedInput schema / properties / crop / pattern
        Added value: +"\\S"
      • changedInput schema / properties / loadLimit / description
        Previous 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."
      • addedInput schema / properties / methods / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / ontologies / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / scales / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / studies / description
        Previous value: -"Filter by studyDbIds."New value: +"Filter by studyDbId. /variables takes one, so only the first value is sent."
      • addedInput schema / properties / studies / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / text / description
        Previous 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."
      • addedInput schema / properties / text / pattern
        Added value: +"^$|\\S"
      • addedInput schema / properties / traitClasses / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / variableNames / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / variablePUIs / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / variables / items / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / appliedFilters / description
        Previous value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)."
      • addedOutput schema / properties / cap
        Added 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"
        +}
      • changedOutput schema / properties / dataframe / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / dataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / dataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / dataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / dataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / dataframe / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / distributions / description
        Previous value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / refinementHint / description
        Previous value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large."
      • changedOutput schema / properties / results / description
        Previous 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."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Length of results[] when truncated.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total rows reported by the server."New value: +"Total rows reported by the server, else the rows scanned."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.",
        +  "type": "boolean"
        +}
    • Changedbrapi_find_variants33 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • changedInput schema / properties / end / description
        Previous value: -"Exclusive 1-based end."New value: +"Window end, 0-based exclusive."
      • changedInput schema / properties / loadLimit / description
        Previous 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."
      • addedInput schema / properties / referenceName / pattern
        Added value: +"\\S"
      • addedInput schema / properties / references / items / pattern
        Added value: +"\\S"
      • changedInput schema / properties / start / description
        Previous value: -"Inclusive 1-based start."New value: +"Window start, 0-based inclusive."
      • addedInput schema / properties / variantSets / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / variants / items / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / appliedFilters / description
        Previous value: -"The final filter map sent to the server (named + extraFilters)."New value: +"Filter map sent upstream (named filters plus extraFilters)."
      • addedOutput schema / properties / cap
        Added 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"
        +}
      • changedOutput schema / properties / dataframe / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / dataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / dataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / dataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / dataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / dataframe / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / distributions / description
        Previous value: -"Value frequency per field across the full result set."New value: +"Value frequency per field across every matched row fetched."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / refinementHint / description
        Previous value: -"Suggested next-step query refinement when the result set is large."New value: +"Suggested refinement when the result set is large."
      • changedOutput schema / properties / results / description
        Previous 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."
      • changedOutput schema / properties / results / items / properties / end / description
        Previous value: -"1-based exclusive end position."New value: +"End position, 0-based exclusive per BrAPI."
      • changedOutput schema / properties / results / items / properties / start / description
        Previous value: -"1-based inclusive start position."New value: +"Start position, 0-based inclusive per BrAPI."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Length of results[] when truncated.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total rows reported by the server."New value: +"Total rows reported by the server, else the rows scanned."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when results[] holds fewer rows than matched because loadLimit or the inline byte budget bound.",
        +  "type": "boolean"
        +}
    • Changedbrapi_germplasm_performance10 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • removedInput schema / properties / germplasmDbId / minLength
        Removed value: -1
      • addedInput schema / properties / germplasmDbId / pattern
        Added value: +"\\S"
      • removedInput schema / properties / studyDbIds / items / minLength
        Removed value: -1
      • addedInput schema / properties / studyDbIds / items / pattern
        Added value: +"\\S"
      • addedInput schema / properties / variables / items / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / warnings / description
        Previous 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)."
    • Changedbrapi_get_germplasm7 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • removedInput schema / properties / germplasmDbId / minLength
        Removed value: -1
      • addedInput schema / properties / germplasmDbId / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / directParentCount / description
        Previous value: -"Count of direct parents."New value: +"Length of parents[]; 0 also when the pedigree lookup is unsupported or failed."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_get_image7 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • removedInput schema / properties / imageDbIds / items / minLength
        Removed value: -1
      • addedInput schema / properties / imageDbIds / items / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / images / items / properties / mimeType / description
        Previous value: -"Actual MIME type of the returned bytes."New value: +"Content-Type of the byte response, else the metadata mimeType, else application/octet-stream."
    • Changedbrapi_get_study6 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • removedInput schema / properties / studyDbId / minLength
        Removed value: -1
      • addedInput schema / properties / studyDbId / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
    • Changedbrapi_raw_get20 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • removedInput schema / properties / path / minLength
        Removed value: -1
      • addedInput schema / properties / path / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / dataframe / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / dataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / dataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / dataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / dataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / dataframe / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "When a dataframe was staged, its name and the tools that read it.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / suggestion / description
        Previous 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."
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Advisory messages — present when the dataframe walk stopped before the upstream total.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedbrapi_raw_search18 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / dataframe / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / dataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / dataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / dataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / dataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / dataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / dataframe / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "When a dataframe was staged, its name and the tools that read it.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / suggestion / description
        Previous 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."
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "description": "Advisory messages — present when the dataframe walk stopped before the upstream total.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedbrapi_server_info10 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • changedOutput schema / properties / attribution / description
        Previous 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."
      • changedOutput schema / properties / capabilities / description
        Previous value: -"Capability profile derived from /serverinfo."New value: +"Capability profile derived from /serverinfo or /calls."
      • changedOutput schema / properties / capabilities / properties / supportedCount / description
        Previous value: -"Total distinct services the server advertises in /calls."New value: +"Total distinct services the server advertises in /serverinfo or /calls."
      • changedOutput schema / properties / dialect / properties / id / description
        Previous 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\")."
      • changedOutput schema / properties / dialect / properties / inferredMappingCount / description
        Previous 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."
      • changedOutput schema / properties / dialect / properties / verifiedMappingCount / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / nextToolSuggestions / items / properties / args / description
        Previous 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)."
    • Changedbrapi_walk_pedigree42 fields changed
      • changedInput schema / properties / alias / description
        Previous 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."
      • addedInput schema / properties / diagram
        Added 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"
        +}
      • changedInput schema / properties / direction / description
        Previous 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."
      • removedInput schema / properties / germplasmDbIds / items / minLength
        Removed value: -1
      • addedInput schema / properties / germplasmDbIds / items / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / alias / description
        Previous value: -"Alias of the registered BrAPI connection the call used."New value: +"Connection alias the call used."
      • changedOutput schema / properties / cycleCount / description
        Previous 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."
      • addedOutput schema / properties / diagram
        Added 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"
        +}
      • changedOutput schema / properties / edges / description
        Previous 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."
      • changedOutput schema / properties / edges / items / description
        Previous value: -"One deduplicated pedigree edge between two nodes."New value: +"One parent–child pair, recorded once whichever side found it."
      • addedOutput schema / properties / edges / items / properties / isCycle
        Added 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"
        +}
      • changedOutput schema / properties / edges / items / properties / parentType / description
        Previous 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."
      • changedOutput schema / properties / edges / items / properties / relationship / description
        Previous 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."
      • changedOutput schema / properties / edgesDataframe / description
        Previous 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)."
      • changedOutput schema / properties / edgesDataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / edgesDataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / edgesDataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / edgesDataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / edgesDataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / edgesDataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / edgesDataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / edgesDataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / edgesDataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / edgesDataframe / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / leafCount / description
        Previous 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."
      • changedOutput schema / properties / nodes / items / properties / direction / description
        Previous 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)."
      • changedOutput schema / properties / nodesDataframe / description
        Previous 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."
      • changedOutput schema / properties / nodesDataframe / properties / columnLegend / description
        Previous 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."
      • changedOutput schema / properties / nodesDataframe / properties / columns / description
        Previous value: -"Full column list of the dataframe."New value: +"Every column name."
      • changedOutput schema / properties / nodesDataframe / properties / columns / items / description
        Previous value: -"Column name from the materialized rows."New value: +"Column name."
      • changedOutput schema / properties / nodesDataframe / properties / createdAt / description
        Previous value: -"ISO 8601 timestamp the dataframe was created."New value: +"ISO 8601 creation time."
      • changedOutput schema / properties / nodesDataframe / properties / expiresAt / description
        Previous 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."
      • changedOutput schema / properties / nodesDataframe / properties / maxRows / description
        Previous 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."
      • changedOutput schema / properties / nodesDataframe / properties / rowCount / description
        Previous value: -"Number of rows materialized in the dataframe."New value: +"Rows in the dataframe."
      • changedOutput schema / properties / nodesDataframe / properties / tableName / description
        Previous 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."
      • changedOutput schema / properties / nodesDataframe / properties / totalCount / description
        Previous value: -"Total rows reported by the upstream server (may exceed rowCount when truncated)."New value: +"Upstream-reported row total, when known; can exceed rowCount."
      • changedOutput schema / properties / nodesDataframe / properties / truncated / description
        Previous 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."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "When the walk was staged, the node and edge dataframes and how to read them.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / truncated / description
        Previous 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."
      • changedOutput schema / properties / warnings / description
        Previous value: -"Advisory messages (capability gaps, per-node expansion failures)."New value: +"Advisory messages (capability gaps, per-node expansion failures, an omitted diagram)."
  5. 2 tool updates
    • Changedbrapi_connect4 fields changed
      • changedOutput schema / anyOf
        Previous 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"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • addedOutput schema / properties / nextToolSuggestions
        Added 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"
        +}
    • Changedbrapi_server_info2 fields changed
      • changedOutput schema / anyOf
        Previous 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"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / nextToolSuggestions
        Added 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"
        +}
  6. 22 tool updates
    • First observedbrapi_build_phenotype_matrix
    • First observedbrapi_connect
    • First observedbrapi_dataframe_describe
    • First observedbrapi_dataframe_query
    • First observedbrapi_describe_filters
    • First observedbrapi_export_genotype_matrix
    • First observedbrapi_find_genotype_calls
    • First observedbrapi_find_germplasm
    • First observedbrapi_find_images
    • First observedbrapi_find_locations
    • First observedbrapi_find_observations
    • First observedbrapi_find_studies
    • First observedbrapi_find_variables
    • First observedbrapi_find_variants
    • First observedbrapi_germplasm_performance
    • First observedbrapi_get_germplasm
    • First observedbrapi_get_image
    • First observedbrapi_get_study
    • First observedbrapi_raw_get
    • First observedbrapi_raw_search
    • First observedbrapi_server_info
    • First observedbrapi_walk_pedigree

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.