Skip to content

v0.16.0

Choose a tag to compare

@github-actions github-actions released this 23 Oct 15:10
· 24 commits to main since this release
7f19235

A MINOR: it adds an output field to two tools.

Added

  • memory_read and memory_list_recent name the shared rooms they did not
    search, as data and on a hit too.
    Both declare a new optional output field,
    rooms_not_searched: {state, rooms?, note}, present only on a call without
    domain when the caller has rooms or the room list could not be checked.
    state is live (the rooms listed can be read by passing an address as
    domain), archived-only or unknown; rooms carries the live rooms in
    memory_list_rooms's row shape (the two now share one schema and one row
    builder, so memory_list_rooms's tools/list entry is unchanged); note is
    the disclosure the text ends with. A scoped call, and a caller with no rooms,
    get no field. Why: the disclosure lived in the text only, and only on an
    empty result. A client that hands the model structuredContent instead of
    the text (Claude Code, observed 2026-10-23) got {"items":[]} from an empty
    unscoped read and nothing else, while twenty live rooms held the answer.
    Room content is still NOT searched or mixed into the result; whether it
    should be is a separate decision. A row missing room_id, address or
    role is left out of rooms (still named in note), the rule
    memory_list_rooms already applies. Differs from the hosted connector:
    its memory_read and memory_list_recent schemas have no
    rooms_not_searched yet.

Changed

  • An unscoped memory_read hit and an unscoped memory_list_recent page now
    end with the same room disclosure an empty result already carried.
    A match
    in your own domains says nothing about what a room holds. The 96,000-character
    cap reserves the note, so a capped page plus the note still fits, and an
    answer carries one escape legend, at its end.

  • A capped memory_read or memory_list_recent page now fits the cap with its
    escape legend too.
    The legend (275 characters) was appended after the cap,
    so a capped page with an escaped domain or author name ran past
    MAX_RESULT_CHARS by its length, scoped calls included and before this
    release. The cap now reserves it whenever a name on the page would print
    escaped and the room note does not already carry the legend, so such a page
    is cut up to 275 characters earlier than before. Pages with no escaped name
    are cut exactly where they were. A memory_list_recent page can
    exceed its 40,000-character page budget by the note, at most about 2,200
    characters; the budget is a target, the cap is the limit.

  • One added read-only probe: GET /memory/rooms once per unscoped call
    that returns results, issued after the read succeeds (an empty unscoped
    result already made it, and a failed read still makes none). It spends rate
    budget like any read, and it runs after the read rather than beside it, so
    it adds the room list's response time to every unscoped hit: up to 4 seconds
    when that endpoint is slow, the probe timeout, after which the note says the
    room list could not be fetched. The README's privacy section, which lists the
    probes, now names this one.

  • Two descriptions name the new field. memory_read's domain parameter
    points to rooms_not_searched next to memory_list_rooms as a place to find
    room addresses, and memory_list_recent's description says an unscoped call
    names the rooms it does not cover. The server instructions are unchanged:
    they sit at their 800-character ceiling.

  • npm: https://www.npmjs.com/package/@mnemoverse/mcp-memory-server

  • MCP Registry: https://registry.modelcontextprotocol.io/v0.1/servers?search=mnemoverse

What's Changed

  • feat(rooms): unscoped read and feed name the rooms they did not search, as data by @izgorodin in #228
  • release: v0.16.0 by @izgorodin in #229

Full Changelog: v0.15.4...v0.16.0