Skip to content

v1.10.0

Choose a tag to compare

@Robbie1977 Robbie1977 released this 31 Jul 07:28
· 10 commits to main since this release
4a3b40b

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:

  • unique is 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 before unique shipped 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_types rather 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.