Atlas / MCP servers / memtomem / memtomem-stm

memtomem-stmBLOCK

mcp/memtomem/memtomem-stm

Short-term memory proxy gateway with proactive memory surfacing for AI agents

Verdict
BLOCK
Grade
D
Trust score
61 /100
Exposed tools
14 14r · 0w · 0d
Transport
sse · stdio · streamable-http
License
Apache-2.0
Stars
5
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Official website & docs: [https://memtomem.com](https://memtomem.com)

[](https://pypi.org/project/memtomem-stm/) [](https://python.org) [](LICENSE) [](CLA.md)

🚧 Alpha — APIs and defaults may change between 0.x minor releases. Feedback and issue reports are especially welcome: Issues · Discussions.

Spend fewer tokens. Remember more. Ship faster.

memtomem-stm is an MCP proxy that can substantially reduce the model-visible size of large tool responses and surface cross-session memory from a configured memtomem LTM — with no changes to your upstream MCP servers. The actual reduction depends on response shape, compression strategy, and whether the call travels through MCP; verify it against your workload with the repository's deterministic bench_qa suite.

It sits between your AI agent and its upstream MCP servers, compressing tool responses, caching repeated calls, and automatically surfacing relevant context from prior sessions via a memtomem LTM server.

What memtomem-stm does:

  • Cuts token spend on repeated reads — compresses and caches tool responses, so the agent doesn't re-pay for the same file or search result. Works with Claude Code, Cursor, Claude Desktop, or any MCP client.
  • Carries context across sessions — surfaces prior decisions from memtomem LTM automatically, so the agent picks up where it left off rather than re-discovering what it already knew.
  • Drops in front of any MCP server — adds compression, caching, and observability as a proxy layer, without changes to upstream code.
flowchart TB
Agent["Agent(Claude Code, Cursor, ...)"]
Read from source at commit ff7574d9f9f8OBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add memtomem-stm --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env MEMTOMEM_STM_SURFACING__MIN_QUERY_TOKENS=${MEMTOMEM_STM_SURFACING__MIN_QUERY_TOKENS} --env OPENAI_API_KEY=${OPENAI_API_KEY} -- uvx memtomem-stm
claude-desktop
{
  "mcpServers": {
    "memtomem-stm": {
      "command": "uvx",
      "args": [
        "memtomem-stm"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "MEMTOMEM_STM_SURFACING__MIN_QUERY_TOKENS": "${MEMTOMEM_STM_SURFACING__MIN_QUERY_TOKENS}",
        "OPENAI_API_KEY": "${OPENAI_API_KEY}"
      }
    }
  }
}
03

Exposed tools (14)

14 read · 0 write · 0 destructive.

ToolRiskDescription
describereadReturn a short description of what this fixture exposes.
eligible_toolsreadCanned ``eligible_tools`` consult mirroring the real structured shape.
get_documentreadReturn the full structured document as a JSON object.
greetreadreturn f
mem_doreadStand-in for the ``mem_do`` meta-tool.
mem_searchreadReturn two canned search hits in core
rank_featuresreadCanned ``rank_features`` consult mirroring the real per-candidate shape.
sayreadReturn the input text prefixed with a greeting.
stm_compression_feedbackreadReport missing information from a compressed proxy response.
stm_proxy_describe_toolreadRead bounded pages of a registered tool
stm_proxy_read_morereadRead more content from a progressive delivery response.
stm_proxy_select_chunksreadRetrieve selected sections from a TOC response.
stm_surfacing_feedbackreadProvide feedback on proactively surfaced memories.
unrelated_toolreadreturn
04

Trust audit

BLOCKgrade D · trust 61/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
none-observed
Network
declared (5 observation(s))
Shell
declared (1 observation(s))
Dependencies
pinned
Secrets in source
found

Findings (25)

CRITICALHard-coded secrets · secret.anthropic · CWE-798, CWE-321
src/memtomem_stm/proxy/privacy.py:166
# "sk-ant-api03-release-notes-2026-migration-guide". The terminal guard is
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/memtomem_stm/cli/proxy.py:1537
loaded = getattr(importlib.import_module(module_name), attr)
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
tests/test_privacy.py:281
"sk-ant-api03-release-notes-2026-migration-guide",  # Anthropic kebab slug
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
tests/cli/test_proxy_cli.py:11385
"env": {"DATABASE_URL": "postgres://u:pw-DO-NOT-PRINT@h/db"},
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
tests/test_surfacing_persist_query_text.py:212
"gh ghp_ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
tests/test_config_persistence.py:621
assert contains_sensitive_content("-----BEGIN RSA PRIVATE KEY-----")
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
tests/test_privacy.py:208
"-----BEGIN RSA PRIVATE KEY-----",
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
tests/test_privacy.py:209
"-----BEGIN DSA PRIVATE KEY-----",
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
tests/test_privacy.py:210
"-----BEGIN PGP PRIVATE KEY-----",
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
tests/test_privacy.py:364
"-----BEGIN RSA PRIVATE KEY-----",
MEDIUMHard-coded secrets · secret.slack · CWE-798, CWE-321
tests/test_privacy.py:163
"xoxb-123456-abcdef",  # Slack bot
MEDIUMHard-coded secrets · secret.slack · CWE-798, CWE-321
tests/test_privacy.py:164
"xoxp-123456-abcdef",  # Slack user
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/cli/test_health_doctor_value_audit.py:505
httpx_mod = importlib.import_module(module_name)
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/cli/test_health_doctor_value_audit.py:893
mod = importlib.import_module(module)
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/test_sqlite_init_cleanup.py:51
mod = importlib.import_module(module_path)
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/memtomem_stm/surfacing/cache.py:62
return hashlib.md5(
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
tests/test_surfacing_cache.py:122
== hashlib.md5(
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
tests/test_privacy.py:177
"aws_session_token = FAKEFwoGZXIvYXdzFAKE",  # ~/.aws/credentials form
Why it matters. touches a credential store
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/test_memory_ops.py:229
server="../../tmp/evil",
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/test_memory_ops.py:381
server="../../tmp/evil",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/cli/test_health_doctor_value_audit.py:434
_PARTIAL_URL = "http://127.0.0.1:9/mcp?token=cnryPartQuery#cnryPartFrag"
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/cli/test_health_doctor_value_audit.py:456
"'http://127.0.0.1:9/mcp?token=cnryPartQuery#cnryPartFrag'; "
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/cli/test_health_doctor_value_audit.py:546
("http://127.0.0.1:9/mcp?token=cnryQ#cnryF", "http://127.0.0.1:9/mcp"),
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/cli/test_proxy_cli.py:16299
"embedding_base_url": "http://127.0.0.1:9",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/cli/test_proxy_cli.py:16321
assert "verify the local Ollama at http://127.0.0.1:9" in result.output

Gates applied: critical_finding, no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha ff7574d9f9f8full audit observations/trust-audit/mcp-server/memtomem__memtomem-stm.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-11ff7574d9f9f8BLOCKD61first audit
06

Questions

What is the memtomem-stm MCP server?

Short-term memory proxy gateway with proactive memory surfacing for AI agents

What tools does memtomem-stm expose?

14 in total: 14 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is memtomem-stm safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (61/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on.

What credentials does memtomem-stm need?

It reads ANTHROPIC_API_KEY, MEMTOMEM_STM_SURFACING__MIN_QUERY_TOKENS and OPENAI_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does memtomem-stm run?

It speaks sse, stdio and streamable-http, so it runs as a local process your client starts. It is published on PyPI as memtomem-stm.

How current is this page?

The grade is for one exact copy of the source (ff7574d9f9f8), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement