Special Thanks
Huge thanks to our community contributors who made this release possible:
- @filhocf — mem0 benchmark adapter with end-to-end cloud API validation (#954) + temporal contradiction detection (#949)
- @henry201605 — Milvus instance-level graph cache fix and superseded memory filtering in retrieve (#948)
Added
- feat(consolidation): temporal contradiction detection via embedding similarity band (#949, @filhocf): New module
src/mcp_memory_service/consolidation/contradictions.py. Detects contradictions using a similarity band of 0.4–0.75 (too similar to be independent facts, too different to be duplicates). Emits aCONTRADICTED_BYgraph edge and setssuperseded_byon the older memory. Opt-in viaMCP_CONTRADICTION_DETECTION_ENABLED=trueandMCP_CONTRADICTION_ON_STORE=true. Integrated as Step 7 inhandlers/quality.pymaintain flow. 8 new tests intests/consolidation/test_contradictions.py. - feat(benchmarks): mem0 adapter — tested end-to-end with cloud API (#954, @filhocf): Adds
scripts/benchmarks/adapters/with an abstractBenchmarkAdapterbase class and a concreteMem0Adapterimplementation that wraps the mem0 cloud API. Validated end-to-end with the mem0 cloud service. Provides a foundation for systematic latency/quality comparisons between mcp-memory-service and alternative memory backends.
Fixed
- fix(milvus): instance-level graph cache + filter superseded in retrieve (#948, @henry201605): Replaces the class-variable
_graph_storage_cachewith an instance attribute protected by double-checked locking, preventing cross-instance contamination in tests.retrieve()now filters outsuperseded_bymemories before trimming results to match the sqlite_vec behavior. - fix(hooks): use protocol-correct default port for standard HTTPS/HTTP URLs (#952, fixes #950):
memory-client.jsandmemory-retrieval.jsusedurl.port || 8443(or|| 8080) as the default port. For standardhttps://URLs (e.g. Cloudflare Tunnel, reverse proxy)url.portis empty string — causing the fallback to always trigger and producinghttps://host:8443/...instead of the correct portless URL. Fix: use the protocol's default port (443for https,80for http) whenurl.portis absent, and omit the port from the constructed URL if it matches the protocol default. Resolves broken hook connectivity for all Cloudflare Tunnel and reverse proxy deployments.
Full changelog: https://github.com/doobidoo/mcp-memory-service/blob/main/CHANGELOG.md