mcp-data-platform-v1.61.2
What's fixed
A portal page could go entirely blank when the asset list contained a row whose tags field had been persisted as JSON null. The React render path called .slice(...) on the null value with no surrounding guard, and with no error boundary the whole tree unmounted.
The trigger was specific: api_export calls that didn't supply a tags parameter wrote []string(nil) into the portal_assets.tags jsonb column, which the FE received as "tags": null. Any operator with an api_export-created asset that lacked tags would hit this on the My Assets page.
What changed
Backend — pkg/portal/store.go
Insertnormalizesnilto[]string{}before marshaling, so new rows can never round-trip asnull.unmarshalAssetJSONnormalizes decodednilback to[]string{}on every read, so rows already persisted asnullsurface to the API as[]. No DB migration needed — affected rows recover on the next portal load.
Frontend — defense in depth
Added (x.tags ?? []).slice(...) guards on every asset-list render site (My Assets, Shared With Me, Resources, Collection Editor) so a single malformed row can never blank the portal again, even if a future regression reintroduces nullable tags.
Upgrading
Drop in v1.61.2 and restart. Affected rows in portal_assets will start returning "tags": [] to the API immediately; no manual DB cleanup is required.
Pull requests
- #402 — fix(portal): normalize asset tags so nil never reaches the FE
Installation
Homebrew (macOS)
brew install txn2/tap/mcp-data-platformClaude Code CLI
claude mcp add mcp-data-platform -- mcp-data-platformDocker
docker pull ghcr.io/txn2/mcp-data-platform:v1.61.2Verification
All release artifacts are signed with Cosign. Verify with:
cosign verify-blob --bundle mcp-data-platform_1.61.2_linux_amd64.tar.gz.sigstore.json \
mcp-data-platform_1.61.2_linux_amd64.tar.gz