memtomem-stm 0.4.0 — a minor, not a patch. Sixteen behavior changes across the
advertised tool surface, config validation, client import/prune, daemon
concurrency and surfacing telemetry. Two of them break a working setup with no
user action, which is what promotes this release rather than the size of the
diff: a config with +inf as chars_per_token now fails validation at load
(#977), and under the strict exposure profile a tool whose title or icon URL
is credential-shaped is now withheld rather than advertised (#895).
Read the upgrade notes below first. The full entry-by-entry list is in
CHANGELOG.md
— at 50 KB the section is past what a release body should carry, so this note
keeps the aggregate rather than every bullet.
uv tool install --force memtomem-stm # or: pip install -U memtomem-stmUpgrade notes
-
Proxied tools can look different in your client's picker, and
strictcan
withhold more of them (#895, #922). A tool whose upstream sets a top-level
titlenow displays as[{server}] {title}instead of its prefixed name, and
itsiconsreach the client. A tool that supplies no description now
advertises its own prefixed name rather than a bare[proxied]prefix. Under
thestrictexposure profile, a tool whose title or icon URL is
credential-shaped is withheld (sensitive_metadata); underreviewit is
demoted. If a tool disappears from your picker after upgrading, check its
upstream metadata against the credential scan before assuming a regression. -
Two config values that used to load now fail validation at load (#977,
#929).+infaschars_per_tokenat any of the three levels, and a
max_result_tokensabove the signed-64-bit ceiling, are refused at load
instead of loading and then failing the calls that used them. Separately, a
per-toolchars_per_tokennow applies to a token budget inherited from the
server, so a deployment that sets both sees that tool's resolved char budget
re-scaled (a server at 400 tokens x 2.5 with a tool ratio of 4.0 moves from
1000 to 1600 chars). -
mms pruneandmms add --from-clientsnow compare identity, not just
name (#981, #983, #984, #955). A prune no longer removes a source
entry whoseenvorheadersdiverge from the STM upstream — divergence in a
second client is reported as a conflict, in the first by name. A prune that
previously removed a same-name entry from a second client now removes only the
sources that hold the same server and says which ones it left. Cursor's MCP
configs are now scanned, so--alladopts more servers than before on a
machine that has them; Cursor entries are reported but never written. -
The daemon runs several LTM operations at once, and its telemetry says so
(#874, #994). Setdaemon.max_concurrent_ltm_opsto1to restore the older
serialized daemon — that is the only value that does, since a core with no
parallel capacity degrades the same way at2as at4.mms daemon status
reportsqueue.in_flightabove 1 and gainsqueue.concurrency. Latency
classification changed with it: how a call ended now outranks whether the LTM
was warm, so a request that connected, searched and then failed is filed as
the failure it was rather than incold_samples. -
Durable surfacing telemetry no longer lands before the response (#996).
Fault counters, diagnostics and retention sweeps are queued when their branch
runs and land whenever the FIFO worker gets to them. A request cancelled by
its deadline mid-write still lands its event row, so a shed request can leave
a row for a manifest its client never received. Reads ofstm_surfacing_stats
immediately after a call may not see the row yet. -
max_upstream_bytesis enforced on the inbound envelope, and the embedding
scorer falls back further (issue #957, #873). The cap measures the decoded
message's compact serialization, which is whatdocs/configuration.mdhas
always described; a result that serializes larger than the envelope that
carried it is no longer rejected on that parsed size. And an embedding
provider that returns a different number of vectors than it was given inputs
now falls back to BM25 for that call.