memtomem for Hermes Agent
Markdown-first long-term memory shared across your coding agents. This package starts a
local memtomem MCP server and adds six memory workflow skills. Notes saved here are
searchable from Claude Code, Codex CLI, Kimi Code and any other client that uses the same
~/.memtomem store.
mcp.json, plugin.json and skills/ are generated by tools/render_plugin_assets.py
from packages/memtomem-plugin-assets/; edit the sources there, not the files here.
Requirements
- Hermes Agent 0.21.5 or later (the version this package was verified against).
- Git on
PATH, for the commit lookup under Install. uvonPATH. The server is started withuvx --python 3.12 --from 'memtomem[onnx]==0.6.6' memtomem-server. Withoutuvthe plugin still installs and enables, and the server fails at start withmissing executable 'uvx'.- Python 3.12. uv uses a 3.12 it can find; if there is none, it downloads one (about 70 MiB)
on first start. If that is not possible — offline, or uv's Python downloads turned off —
the server does not start and
$HERMES_HOME/logs/mcp-stderr.log(default~/.hermes/logs/) shows uv's error; runuv python install 3.12once to fix it.
Install
Install from this repository, pinned to the commit of a memtomem release tag. Hermes
(0.21.5) takes a full 40-character commit SHA for --ref and refuses a tag name such as
v<version>, so look the commit up first:
git ls-remote --exit-code https://github.com/memtomem/memtomem "refs/tags/v<version>" "refs/tags/v<version>^{}"
<version> is a memtomem release that includes this directory and is listed on
PyPI. The command prints one line for a
lightweight tag and two for an annotated one; no output and exit status 2 mean there is no
such tag. Copy the SHA at the start of the line that ends in ^{} if there is one,
otherwise of the only line, and install at it:
hermes plugins install "https://github.com/memtomem/memtomem#packages/memtomem-hermes-plugin" --ref <commit-sha> --enable
At a release commit, mcp.json pins that same memtomem version, so the server installs
the release you picked. Hermes marks a direct Git install as a custom (unreviewed) source.
Hermes records that commit as the plugin's pin. To move to a later release, look up its
commit the same way and reinstall with --force --ref <new-commit-sha>. A --force
reinstall without --ref installs the pinned commit again, and hermes plugins update memtomem refuses to move a pinned plugin.
An install without --ref takes the tip of main, unless Hermes still holds a pin for this
source from an earlier install; then it installs that pinned commit, even if the plugin
directory was deleted. Use main only for development: right after a version bump is
merged, main can pin a memtomem version that is not published yet, and the server then
fails to start until it is.
Once memtomem is listed in the Hermes plugin catalog, hermes plugins install memtomem
installs the catalog's pinned commit instead.
First run
Start a new Hermes session. No separate setup is needed: on a machine where memtomem
has never been configured, the server uses its defaults (SQLite store in
~/.memtomem/memtomem.db, notes in ~/.memtomem/memories, BM25 search). If memtomem is
already set up for your other agents through ~/.memtomem/config.json, the server reads
that configuration and shares the same store — provided the storage and memory paths in it
are absolute or start with ~. A relative path resolves against this server's working
directory (the plugin directory), so it would open a different store. Ask Hermes for memtomem status and check
the reported DB path before relying on sharing.
Settings from your shell environment do not carry over. Hermes passes only a small
allowlist of environment variables to MCP servers (plus any variables supplied by an
external secret source you configured in Hermes), so a MEMTOMEM_* variable exported in
your shell (for example MEMTOMEM_STORAGE__SQLITE_PATH) does not reach this server, and
it opens the store from config.json, a .env file (below), or the defaults instead. If
you configure memtomem that way, add your own mcp_servers.memtomem entry with those
variables under env: (see "Scope" below; it takes precedence over this package).
memtomem also loads a .env file itself at startup, after Hermes's filtering.
python-dotenv searches upward from memtomem's installed location, not from the working
directory; with a uvx launch that location is inside uv's cache (normally ~/.cache/uv),
so the nearest .env among that cache's ancestor directories is applied — normally
~/.env, unless a nearer one such as ~/.cache/.env exists — while one in the plugin
directory or where you start Hermes is not. A MEMTOMEM_* setting in
~/.env therefore does reach this server.
Scope
This package runs memtomem at user scope. The server starts in the plugin directory,
so it has no project context: there is no per-project (project_local) memory, and
paths given to indexing must be absolute. Notes are shared with your other agents through
the user-scope store. The handoff workflow of the other memtomem plugins is not included,
because it needs a project.
Indexing a whole project directory also reads any project memory inside it
(<project>/.memtomem/memories*). What happens to those files depends on memtomem's
configuration, not on this package:
- Registered project memory (listed in memtomem's project memory directories) keeps its project scope. It is indexed, but user-scope searches from this package do not return it.
- Unregistered project memory is indexed as ordinary user-scope notes and does show up in searches here and in your other agents.
Search visibility is not the same as not indexing: to keep a directory out of the index entirely, index a narrower path.
If you need project scope, use the manual integration instead: disable this package
(hermes plugins disable memtomem — its skills are written for user scope only) and add
your own server entry to config.yaml:
mcp_servers:
memtomem:
command: uvx
args: ["--python", "3.12", "--from", "memtomem[onnx]==0.6.6", "memtomem-server"]
env:
MEMTOMEM_TOOL_MODE: core
# copy any MEMTOMEM_* settings you rely on here
cwd: /path/to/project
Network
Memory is stored locally in ~/.memtomem. The server is downloaded from PyPI on first
start, and uv downloads Python 3.12 then too if it cannot find one. With a fresh BM25-only
configuration nothing else leaves the machine. An existing
memtomem configuration may enable its own network paths: model downloads from Hugging Face
(ONNX embedding or local reranker), a remote embedding or LLM provider, Cohere reranking
(sends the query and candidate chunks), or search webhooks (send events including the query).
License
Apache-2.0.