v0.4.0 — ask as the public, use any discovery filter
Driven entirely by a report from real use: an agent working through a logged-in server could not obtain the public view of a repository, so it bypassed the server and used curl instead. That is the worst possible outcome — a request made outside this server has no enforced GET-only guarantee, no error mapping, no download size limit, and no response flattening.
Everything here closes a gap that pushed it there.
Fixed: compare_access failed in its own use case
It listed files from the ORIGINAL bundle, and that call raises when the bundle does not exist — so the tool built to answer "the user says files are missing" refused to answer exactly when files were missing. Confirmed against a live repository, where publicly visible records frequently carry only a THUMBNAIL. It now compares across every bundle, and each file reports which bundle it came from.
New: as_anonymous on every read tool
Ask as the anonymous public instead of the logged-in account, without logging out. This reverses a decision made in 0.3.0, which rejected the parameter on the grounds that it costs tokens in every conversation. That arithmetic was wrong: the cost of not having it was the server being bypassed altogether. A few dozen tokens are cheaper than losing every guarantee the server exists to provide.
Anonymous and account installs still expose byte-for-byte identical tool schemas.
New: filters on search_items
get_repository_info has always advertised which discovery filters an instance supports; now they can actually be used:
search_items(filters={"access_status": "restricted"})
search_items(filters={"title": "cancer,contains"})
Names are validated against what the instance declares, so an unknown filter gets a clear sentence instead of a raw 422. Values take a default equals operator; an explicit one is recognised by name rather than by the presence of a comma, so "Smith, John" is not mistaken for a value plus operator.
A trap this removes: query="access_status:restricted" looks like it works and quietly returns zero, because query is full-text search and never reaches the filters. The tool description now says so.
New: list_bundles, and item state flags
list_bundlesreports which bundles an item actually has. Previously that was discoverable only from an error message — an outage doubling as an interface.get_itemand search results now carrywithdrawn,discoverableandin_archive, so a withdrawn record can be told apart from one you simply cannot see.nullmeans the instance did not say, notfalse.
Verified against a live repository
access_status=restricted returns 9153 records where MCP previously offered no way to ask at all.