• v5.5.3 f783e5dc31

    v5.5.3 Stable

    ric_harvey released this 2026-07-09 17:58:28 +00:00 | 81 commits to main since this release

    If you're coming from the 3.x line, this is a big jump. v5 has been run hard internally for months before shipping. This release page collects the headline changes since v3 alongside the v5.5.3 fixes.

    Fixed in v5.5.3

    • bandit B324 High-severity failure in the security pipeline: _cache_key() in mcp_server/memory/query_expansion.py used hashlib.sha1() to fingerprint a query into a cache key, which bandit flags as a weak hash for security. The digest carries no security property (it's only a cache key), so the call now passes usedforsecurity=False, the idiomatic fix that clears the finding without a blanket # nosec

    Also in the 5.5.x line

    • v5.5.2: OAuth refresh raised AttributeError → 500 under FastMCP 3.x. The newer MCP SDK reads refresh_token.expires_at, but _StoredToken only stored created_at + expires_in, so every refresh 500d and desktop/claude.ai clients couldn't get a token. _StoredToken now exposes expires_at as a computed property
    • v5.5.1: OAuth / MCP access behind a reverse proxy or tunnel (Traefik, Caddy, Tailscale funnel) broke after the FastMCP 3.x upgrade. Its HostOriginGuardMiddleware 421d on unlisted hosts and 403d on scheme-mismatched origins. server.py now derives the allowed host and full scheme://host[:port] origin from OAUTH_BASE_URL / MCP_PUBLIC_URL, with MCP_ALLOWED_HOSTS / MCP_ALLOWED_ORIGINS for extras

    Highlights since v3

    Connect claude.ai from the browser (v4.0.0)

    A full OAuth 2.1 authorisation server, so claude.ai connects to your self-hosted OmniMem as a connector with no local proxy. Dynamic client registration, PKCE, token refresh with rotation, and a browser login page. Token state persists in Valkey (with AOF) so sessions survive restarts. The 5.5.x fixes above harden this path for real-world proxy/tunnel deployments.

    Smarter recall (v5.0.0)

    • Fact extraction at ingest: Claude Haiku pulls atomic facts from raw input before storing
    • New preference namespace for prescriptive rules ("always update the changelog after a feature")
    • Temporal-aware retrieval: date-shaped queries get a scoring boost against a memory's event_date
    • Query expansion: alternative phrasings unioned at recall time
    • remember_document() with turn-pair chunking took zero-recall on long transcripts from 45% down to 0%

    Faster (v5.2.0, v5.3.0)

    • Non-blocking ingest via a background enrichment queue (~0.25s to store and return)
    • Recall, dedup and maintenance reuse embeddings already stored in Valkey instead of recomputing them
    • Project and state filters are pushed into the vector search so candidate slots stay in-scope
    • Projected batch fetches (get_fields_multi) halve round trips on the scan-heavy hot paths

    Security pass (v5.3.0)

    • Constant-time bearer token comparison (hmac.compare_digest)
    • Fail closed: the server refuses to start unauthenticated on a non-loopback address, and Compose refuses an empty VALKEY_PASSWORD
    • Path-traversal hardening on all web UI backup operations
    • Denial-of-service caps on uploads (100 MB) and RSS page fetches (RSS_MAX_PAGE_BYTES)
    • Per-IP brute-force protection on OAuth login

    Self-hosted, open source, runs on Docker Compose. Python 3.12, FastMCP, Valkey.

    Full detail in CHANGELOG.md.

    Downloads