PATCH release. Fifteen PRs since v11.8.2, carried by three security fixes that share a shape: each was wrong in a way that looked fine.
Upgrade if you run the HTTP server, and especially if you run it with TLS.
A reachable MCP transport advisory (#277)
mcp 1.27.1 to 1.29.0. Three advisories applied; one of them matters here. CVE-2026-52869 — HTTP transports serve session requests without verifying the authenticated principal — is reachable, because SseServerTransport and StreamableHTTPSessionManager are both wired up in utils/startup_orchestrator.py. CVE-2026-52870 covers experimental task handlers this project does not use, and CVE-2026-59950 the WebSocket transport it does not ship; the bump clears both anyway.
HTTPS was silently downgraded to HTTP on every restart (#279)
memory launch built its uvicorn command line as a fixed list — host, port, log level — and never passed --ssl-certfile/--ssl-keyfile. uvicorn's CLI knows nothing about MCP_HTTPS_ENABLED, so the translation step did not exist, while scripts/server/run_http_server.py did honour the same settings. Anyone using the CLI the docs recommend was served plain HTTP regardless of their configuration.
memory info agreed, which is what made it hard to spot: the CLI's health probe reads os.environ only — deliberately, since v11.7.0 — while the server's config comes from .env. Both halves were wrong in the same direction.
TLS that is requested but unusable now fails the launch instead of falling back, and the launched scheme is recorded in the PID file so later health checks probe what actually runs. Certificate auto-generation is still only in run_http_server.py; that gap is tracked in #281.
The API key was written to the access log (#285)
The dashboard authenticates its SSE connection through the query string, because EventSource cannot send an Authorization header. uvicorn logs the full request line, so every SSE connection wrote the key in cleartext into ~/.local/share/mcp-memory/logs/server.log. TLS does not help — it protects the wire, not the file, and that file outlives the session.
Sensitive query parameters are now redacted before the record is formatted. The key still travels in a URL; the short-lived SSE ticket that would fix that properly is tracked in #282.
Also in this release
- Log-injection sanitisation across the consolidator, retrieve path and
server_impl(#268, #270, #271). #271 covers the multi-line calls the line-based pre-PR guard could not see. - An LM Studio compatibility patch had silently stopped applying (#284) — its target left the MCP SDK some time ago and the
hasattrguard meant nothing said so. Behaviour is unchanged; the module now has an alarm for the next drift. - The pre-PR quality gate now runs against a local model instead of skipping its complexity and security checks and reporting a pass anyway (#276).
- Correctness fixes: graph node selection on undrawable edges (#269), a comma-separated tag string exploding into one entity per character (#267), and the
pymilvusbound pinned back below 3.0.0 after a bulk bump widened it by accident (#265).
Full detail in CHANGELOG.md.
Note on the version number
There is a feat: commit in the range (#272, the Codeberg triage digest). It added one file under scripts/, and the wheel ships only src/mcp_memory_service, so nothing about the published package gained a feature. PATCH is the honest number.