---
summary: "Sweetpotatobase follow-up: keep Breedbase location filters plural, add URL-pattern dialect detection, and fail soft when observation spillover pages stall."
breaking: false
---

# 0.4.9 — 2026-05-02

Live Sweetpotatobase testing showed the SGN family is not uniform: unlike CassavaBase, Sweetpotatobase honors plural `/locations` filters such as `countryCodes`, `locationDbIds`, and `abbreviations`, while the singular forms are silently ignored. This release splits that Breedbase behavior from CassavaBase, tightens filter-leak warnings, and makes slow observation spillover return useful first-page data instead of surfacing a generic execution failure.

## Added

- **URL-pattern dialect detection** — `detectDialectFromBaseUrl(...)` recognizes `cassavabase.org`, `sweetpotatobase.org`, Yambase, Musabase, BananaBase, and `test-server.brapi.org`. The orientation envelope now reports `source: "url-pattern"` when the base URL, rather than `/serverinfo` names, selected the dialect. This directly supports sparse identities like Sweetpotatobase's `serverName: "SPB"`.
- **Strict equality filter match checks** — `checkFilterMatchRates(...)` can now warn when requested values appear in the returned distribution but unrelated values appear too. That catches the Sweetpotatobase failure mode where `countryCodes=["PER"]` returned all 136 locations, including 21 Peruvian rows, so the old "any requested value appears" heuristic looked satisfied.

## Changed

- **Breedbase `/locations` filters stay plural** — the broader `breedbase` dialect no longer rewrites location filters to singular keys. Sweetpotatobase live probes verified plural `countryCodes`, `locationDbIds`, `locationNames`, and `abbreviations` filter correctly, while singular `countryCode`, `locationDbId`, `locationName`, and `abbreviation` leak the full baseline. CassavaBase keeps its existing singularizing location mapping.
- **Observation spillover is best-effort on page-fetch failures** — `brapi_find_observations` now pulls spillover pages with companion-call options (short timeout, zero retries). If a later page stalls, the tool returns the first page with `hasMore: true` plus a warning instead of failing the whole call. Storage or programming failures still throw; only upstream page-fetch failures degrade.
- **Meta-analysis prompt recovery guidance** — the cross-study prompt now tells agents not to retry stalled germplasm-only observation pulls. It directs them to use study-anchored observation calls when SGN/Breedbase preflight warns about an unanchored query.

## Fixed

- **`brapi_find_locations(countryCodes=["PER"])` on Sweetpotatobase** now returns the 21 Peruvian locations instead of all 136 locations. The applied filter is `countryCodes`, not ignored `countryCode`. Closes [#20](https://github.com/cyanheads/brapi-mcp-server/issues/20).
- **`brapi_find_observations(studies=["1131"])` on Sweetpotatobase** no longer turns a slow spillover into a generic tool execution failure. With default-sized page pulls, callers get the first page, the true upstream `totalCount`, and a concrete spillover warning. Closes [#21](https://github.com/cyanheads/brapi-mcp-server/issues/21).
- **Germplasm-only observation recovery on SGN/Breedbase** is clearer: preflight warnings and the meta-analysis workflow now point to the practical study-anchored path instead of offering only dead-end narrowing advice. Related: [#9](https://github.com/cyanheads/brapi-mcp-server/issues/9).
