github doobidoo/mcp-memory-service v11.9.0

latest release: v11.10.0
2 hours ago

MINOR release. The headline is a dependency bump that closes two high-severity transformers advisories with no fix anywhere in the 4.x line (#305) — the reason to upgrade if you install the [ml] or [nli] extras. Verifying it needed a CI job that actually installs those extras (#303), and that job promptly earned its keep: it turned up a real quality-system bug where a disabled quality system still built and exported a full ONNX model on its first call, found when it blew pytest's 120s timeout in CI (#316). Everything else this cycle is dependency and test-hygiene follow-through from those two changes, a docs fix, and finally wiring in a dead-reference check that had existed since #702 without ever running once (#314).

Security

  • deps: move to transformers 5.x, closing two high-severity advisories (#305). GHSA-29pf-2h5f-8g72 (RCE via _attn_implementation_internal in a crafted config.json, fixed in 5.3.0) and GHSA-fgcw-684q-jj6r (trust_remote_code=False overridden by a nested config on the LightGlue load path, fixed in 5.5.0) — neither advisory has a 4.x patch. [ml] and [nli] now both declare transformers>=5.5.0,<6.0.0; before this the [ml] extra capped at <5.0.0 while [nli] carried a bare >=4.30.0, so an [nli]-only install was already resolving 5.x. Verified against the same selection the new ml-extras job (#303) runs, on both transformers 4.57.6 and 5.15.1: 2347 passed, 63 skipped, 8 deselected, 13 xfailed, 2 xpassed — identical on both. The lock moves huggingface-hub 0.36.0 to 1.28.0 and safetensors 0.4.5 to 0.8.0; torch does not move.

Fixed

  • fix(quality): stop a disabled quality system from loading the ONNX ranker (#316, closes #315). evaluate_quality() and evaluate_quality_batch() return a neutral 0.5 when the quality system is off, but both called _ensure_initialized() before checking config.enabled, so MCP_MEMORY_QUALITY_ENABLED=false still paid for a full torch.onnx.export of DeBERTa on the first call. Surfaced as CI noise on an unrelated docs PR (#314), which failed twice on identical content with exactly one test timing out — the twelve green runs before it were the same code getting lucky on timing, since the export path only became reachable in CI once #310 added onnxscript. Three regression tests in tests/quality/test_disabled_skips_model_load.py assert the loader is never invoked while the system is disabled.
  • fix(quality): let huggingface_hub resolve its own cache (#307, closes #304). onnx_ranker.py built the model cache path by hand and took snapshots[0] from a glob with no ordering or completeness guarantee, so it ignored HF_HOME/HF_HUB_CACHE (which this project sets itself in offline_mode.py) and could pick an empty snapshot left behind by an interrupted download. Addressing models by repository id through huggingface_hub fixes both; get_onnx_ranker_model now resolves through the same onnx_model_dir() helper ONNXRankerModel already used instead of checking Path.home() directly.
  • fix(deps): correct the setuptools bound that keeps milvus-lite importable (#300). The [milvus] extra's setuptools<83; python_version >= '3.13' bound was wrong on both counts: pkg_resources was removed in setuptools 82.0.0, not 81 as the comment claimed, and Python 3.12 already ships without setuptools in a fresh venv, so the marker left that case uncovered entirely. One unconditional setuptools<82 covers both; uv.lock moves 82.0.1 down to 81.0.0.
  • deps: put onnxscript in the [ml] extra (#310). torch.onnx.export routes through the dynamo exporter, which imports onnxscript. It was declared only in tools/docker/Dockerfile.quality-cpu, so a plain pip install mcp-memory-service[ml] could never perform the export itself and failed with ModuleNotFoundError: No module named 'onnxscript' partway through loading the DeBERTa ranker.

Changed

  • ci: run the suite once with the ml and nli extras installed (#303). transformers and sentence-transformers had never been imported in CI, so the quality ranker, the SentenceTransformer embedding path, and anything branching on a real embedding model being present rather than the hash fallback were uncovered by a green build. The job found three pre-existing failures on its first run (next entry) and is what made the transformers 5.x move above verifiable at all.
  • test(storage): stop the 1024-dim migration tests from passing by accident. Three fixtures ran with the default strict_dimension_check=True and only worked because CI had no embedding model installed; with the ml extras added, a real 384-dim all-MiniLM-L6-v2 load trips the dimension guard these tests were never meant to exercise. Set to strict_dimension_check=False, which is what they actually cover.
  • test(quality): make the two ONNX tests test what they claim (#309, closes #306). One test's tokenizer call passed a query/document pair as a single tuple where the API expects two separate arguments. The other's fallback-path mock patched onnx_ranker.get_onnx_ranker_model through the src. import prefix, which resolves to a different module object than the one ai_evaluator actually imports, so the patch never reached the code under test. Also drops six long-xfailed tests in test_lightweight_onnx.py that mocked an internal code path removed since #307.
  • test(quality): stop the async-scorer test from exporting a real ONNX model (#319). test_async_background_scoring used the default evaluator, so with onnxscript installed the worker's first queued item triggered a synchronous, multi-minute torch.onnx.export inside an async worker — blocking the event loop badly enough that even stop()'s own 5s wait_for could not fire, which showed up as another 120s CI timeout. Switched to a disabled evaluator, which since #316 returns a neutral score without loading anything; every assertion in the test is unchanged.
  • docs: correct the venv Python version and note the missing dev tooling (#302). CLAUDE.md said 3.11 in both places it mentions the venv; it's 3.12. Also documents that a uv-created .venv carries runtime dependencies only, with no pip and no pytest — the repair command is now in the same section as the trap.
  • docs: point contributors at Codeberg, keep security reports on GitHub (#311, reported by FBISiri). CONTRIBUTING.md never mentioned Codeberg once, so a visitor landing on the read-only GitHub mirror had no way to learn where development actually happens; it now opens with that, and a new .github/PULL_REQUEST_TEMPLATE.md says the same in the one place a would-be contributor can't miss it. SECURITY.md's supported-version table still claimed 8.x and 7.x and now reads 11.x only, and both files explain why security reports stay on the GitHub mirror instead of moving to Codeberg too — Forgejo has no confidential-issue or security-advisory feature, so a Codeberg issue is always public.
  • fix: run the dead-ref check that was never wired up (#314, closes #313). scripts/ci/check_dead_refs.sh has existed since #702 and was extended twice since, but nothing ever ran it — no Forgejo workflow, no git hook, not pre_pr_check.sh — despite CLAUDE.md telling contributors it catches dead refs in CI. It is now check 6.8 of the pre-PR gate, scoped to docs/ and README.md. Wiring it into CI itself is tracked separately as #312.

Install: pip install mcp-memory-service==11.9.0 · Docker: doobidoo/mcp-memory-service:11.9.0 (and :11.9.0-slim)

Don't miss a new mcp-memory-service release

NewReleases is sending notifications on new releases.