0.48.2 — the MCP endpoint answers again
The MCP endpoint answers again — and the numbers say what they count
A patch on top of 0.48.1. Everything here came out of a test report against the live endpoint.
Fixed — ten MCP tools were unusable
Asking an assistant to list your collection, browse the catalogue's makers, read your timeline or match a list of names came back as "tool execution failed" with nothing else to go on.
It was not the database, the migrations or the query text. structuredContent carried the raw serialised value, so a tool returning a list produced a top-level JSON array — and the protocol revisions in use type that field as a record. The server was emitting something invalid and the client had no way to say which side was wrong. Tools that happened to wrap their result in a struct worked, which is exactly what made it look like a data problem.
The shape is now normalised once at the boundary rather than per tool, so it cannot diverge again: a list answers {count, items}, and every list-bearing result states its own count.
Two neighbours of the same defect: find_figure_by_barcode answered a miss with a bare null — indistinguishable from a tool that produced nothing — and now says {found, figure}. And search_catalogue / get_activity accept limit and offset but could not tell a caller more rows existed, so a full page read as the whole answer; they now carry a has_more that is exact.
Fixed — four statistics meant something other than their name
- Pre-orders "Total" was computed identically to "En cours", so the stats screen contradicted your own achievements, and the pre-order export card under-counted. It counts every pre-order ever placed now.
- Plus-value compared what you paid against a value that, with nothing valued by hand, is the shop's asking price or the manufacturer's list price — for a full-price purchase, mechanically ~0. The totals now carry a
valuationblock naming the tier behind them. - Series completion counts entries in this instance's catalogue, not everything a maker released. 100% means "I have entered every piece of this series that I own", and the payload says so.
- Pre-order slip stats claimed makers below the sample floor were dropped. Only the per-maker list dropped them; the overall figure reported a median off a single slip. Each row now carries
reliable.
Fixed — a year's pieces landed in the wrong year
Year-in-review counted spend from the purchase date but counted pieces, the top maker, the monthly curve and first/last acquisition from when the row was typed into the app. A piece bought in 2025 and entered in 2026 landed in two different years, so a year could report €1,150 spent and 0 pieces acquired. Anything predating the activity feed, or imported, counted nowhere at all.
Changed — price alerts fire on the crossing
An alert used to key on the price level, so any movement below your target counted as a fresh event: a shop wobbling €161.19 → €160.85 → €161.19 pinged three times, and one figure could produce ten notifications for a target it had crossed once. You are now told once per crossing, and again if the price climbs back above and drops. The notification also carries how the comparison was made — basis, both sides in EUR, and the rate date — and a figure every shop reports out of stock no longer alerts, since the restock alert already covers the moment it becomes buyable.
Added — duplicate makers can be prevented and undone
A maker is created from free text and matched by slug, so "Crown Studio" and "CROWN Studio (new)" became two rows and split every per-maker statistic between them. Series and characters have had a merge path for as long as their screens existed; manufacturers had none. Creating a near-identical maker over MCP is now refused with the existing spelling named (overridable for a genuinely different company), and an administrator can fold two that already exist together.
📘 MCP documentation · Wishlist alerts · La Cote
🐳 ghcr.io/dim145/figurecollector-{server,client,docs}:0.48.2
📝 Full changelog: 0.48.1...0.48.2