---
summary: "format() / structuredContent parity — every find_* and get_* tool now emits passthrough fields so text-only clients see the full upstream payload."
breaking: false
---

# 0.4.4 — 2026-04-30

Cross-client parity fix for the `format()` rendering path. Different MCP clients consume different surfaces — Claude Code reads `structuredContent`, Claude Desktop reads `content[]` text blocks — and the agent-protocol checklist requires both to carry the same data. Until now, every `find_*` and `get_*` tool curated a hand-picked bullet list in `format()`, so any field the schema declared but the bullet list omitted (and any field the upstream returned beyond the schema) was visible to Claude Code but invisible to Claude Desktop. This release closes that gap with two new shared helpers and updates all eleven affected tools to use them.

## Added

- **`collectPassthroughParts(row, renderedKeys)` and `appendPassthroughLines(lines, record, renderedKeys)`** in `src/mcp-server/tools/shared/find-helpers.ts`. The former returns `key=value` strings for the bullet-list `find_*` layout; the latter appends `- **key:** value` lines for the line-per-field `get_*` layout. Each helper iterates the record's top-level keys, skips keys already rendered by the curated formatter, and stringifies object values via `JSON.stringify`. Reusable across any future tool that exposes a schema-typed envelope to text-only clients.

## Fixed

- **`brapi_find_studies`, `brapi_find_germplasm`, `brapi_find_observations`, `brapi_find_images`, `brapi_find_locations`, `brapi_find_variables`, `brapi_find_variants`, `brapi_find_genotype_calls`** — every list-shaped `find_*` `format()` now ends each row with `collectPassthroughParts`, so any field the upstream returns beyond the curated bullet set is preserved in the `content[]` text block instead of being silently dropped on text-only clients.
- **`brapi_get_study`, `brapi_get_germplasm`, `brapi_get_image`** — the detail-view `get_*` formatters now call `appendPassthroughLines` after the curated header lines, surfacing every top-level field the upstream returned. `brapi_get_study.renderKeyValues` also stringifies non-array object values instead of skipping them.
- **Nested-object renderings collapsed to inline JSON** where the curated key-by-key extraction was lossy: `germplasmOrigin` (was `${.length} record(s)`), `find_variables.trait` / `scale` / `method` (was a fan-out of seven optional sub-fields), and `find_genotype_calls.genotype` (was `values.join('|')`). Inline JSON keeps the full object visible without per-tool key fanout.

## Changed

- **`find_locations` `coordinates` is intentionally excluded from the rendered set** so the passthrough helper renders the full GeoJSON object alongside the extracted lat/lon. Other rendered sets enumerate exactly the keys the curated formatter handles, so the passthrough helper's set difference produces the right surface.
