v1.10.0
A minor rather than a patch: this adds a tool and moves where search comes from.
Search goes through VFBquery
search_terms used to build its own Solr query with its own fq filters and its own field boosts. The website built a different one, and the Python client a third, so the same words could rank three ways depending on which door you came in by. Search now calls VFBquery's /search, which owns the query construction, the boosts and the ranking — so the MCP, the website and the client agree by construction rather than by anyone remembering to keep three copies in step.
Two behaviours follow from that:
uniqueis applied server-side where the deployment supports it. The MCP can only tell whether the server honoured the flag by whether it echoes it back, so an absent echo now means "collapse the synonym rows here" rather than "assume the server is old". A response cached by nginx from beforeuniqueshipped can answer without the flag while a novel URL answers with it, so the answer is re-read rather than frozen for the life of the process; server-side truncation is only used when the server is doing the collapsing, because otherwise the rows past the limit are exactly the ones de-duplication would have kept.- A partial result says so. When Solr matched more terms than were ranked, the result carries a note naming both numbers, so a caller knows to narrow the query or add
filter_typesrather than paging into nothing.
list_search_facets
New tool: the ~233-name facet vocabulary that filter_types accepts, read live from /facets and cached, falling back to a bundled snapshot only when the service is unreachable. Previously a caller had to guess a type name, and a misspelling returned zero rows that looked exactly like a real absence.
query_connectivity pages
It returned whole tables. It now takes limit and offset and reports the total, so a broad class-level query is a page rather than a wall.
Rejections explain themselves
VFBquery's handlers put the reason in the body — an unknown type name comes back with suggestions, a connectivity call with neither upstream_type nor downstream_type says so. Passing the bare error up said only "status code 400", which tells the caller nothing about what to change. The body is now surfaced for both query_connectivity and get_hierarchy.
get_hierarchy also now omits an absent relationship instead of sending the literal string undefined, so a caller that drops it gets the endpoint's own default (part_of) rather than a 400.
Housekeeping
The lockfile's root version had been left at 1.8.1 through both the 1.9.0 and 1.9.1 releases; package.json, server.json and package-lock.json now agree.
Pairs with VFBquery v1.22.36, which is where /facets, server-side unique and the type-name validation live.