yonro/hermes-xmemo-plugin
XMemo memory provider for Hermes Agent — durable cross-session AI memory with semantic search
The hermes-xmemo plugin is a native memory provider for Hermes Agent that enables cross-session recall and state preservation. It integrates with XMemo to provide long-term memory through pre-turn context injection and session-end snapshots.
- Provides pre-turn context injection and session-end snapshots
- Includes tools for searching, remembering, and updating state
- Features a local SQLite reliability layer and write outbox
full readme from github
XMemo for Hermes Agent
Native, user-owned long-term memory for Hermes Agent.
Recall across sessions, preserve working state, and keep Hermes connected to the same private memory layer as your other AI agents.
Quick start · Architecture · Tools · Configuration · Reliability · Security
hermes-xmemo is the native XMemo memory provider for
Hermes Agent. It joins Hermes'
memory lifecycle directly: pre-turn recall, explicit memory tools, built-in
memory mirroring, per-session working context, and session-end snapshots.
[!NOTE] This provider reads memories that you saved or authorized in XMemo. It does not read the private built-in memory of ChatGPT, Claude, or another client.
At a glance
| Package | hermes-xmemo |
| Hermes provider | xmemo |
| Runtime role | Native memory provider |
| Configuration | $HERMES_HOME/xmemo.json |
| Cloud service | https://xmemo.dev |
| Python | 3.10+ |
| License | MIT |
Why a native provider?
- First-class lifecycle — recall starts before a turn and snapshots happen when a session ends.
- Cross-agent continuity — Hermes can recall user-approved XMemo memories written by other connected agents.
- Bounded context — recall is ranked and limited before it reaches the prompt.
- Write isolation — Hermes-authored entries use a dedicated bucket and scope while reads can span all memories visible to the account.
- Graceful degradation — timeouts, a circuit breaker, local read cache, and a write outbox keep memory failures from blocking the conversation.
Quick start
1. Install with XMemo CLI (recommended)
npm install -g @xmemo/client
xmemo login
xmemo setup hermes
This installs or updates the Python package, deploys the native provider into Hermes, and reuses your user-scoped XMemo credential. Hosted MCP is not added by default.
For a custom Hermes home:
xmemo setup hermes --hermes-home /path/to/.hermes
2. Install directly from PyPI
pip install hermes-xmemo
hermes-xmemo install
hermes memory setup xmemo
3. Install without cloning
curl -fsSL https://raw.githubusercontent.com/yonro/hermes-xmemo-plugin/main/install-remote.sh | bash
hermes memory setup xmemo
The native Hermes setup wizard remains supported. If xmemo login has already
stored a shared credential, the wizard can reuse it; otherwise it asks for an
XMemo token.
Architecture
The provider runs inside Hermes and communicates with XMemo over bounded HTTPS requests. Its local SQLite reliability layer belongs to the Hermes profile; it is not a second source of truth.
Lifecycle
- Before a turn — Hermes starts a background prefetch and injects a bounded XMemo context pack when it is ready.
- During a turn — the agent can search, remember, or update working state
with explicit tools. Writes through Hermes' built-in
memorytool are mirrored to XMemo while this provider is active. - After a turn — high-signal timeline capture is available as an opt-in.
- At session end — the provider captures a restart snapshot and schedules a final outbox sync.
Prefetch state is isolated by profile and session, preventing one concurrent Hermes session from receiving another session's recall context.
Native provider or hosted MCP?
| Native provider | Hosted MCP | |
|---|---|---|
| Best for | Hermes Agent | MCP-only clients |
| Hermes lifecycle hooks | Yes | No |
| Pre-turn context injection | Yes | Client-dependent |
| Built-in memory mirroring | Yes | No |
| Local cache and outbox | Yes | Client-dependent |
| Endpoint | Installed plugin | https://xmemo.dev/mcp |
Use the native provider for Hermes. Add xmemo setup hermes --with-mcp only
when you deliberately want the portable MCP fallback as well.
Tools
Default
| Tool | Purpose |
|---|---|
xmemo_recall_context |
Build a bounded, ranked context pack |
xmemo_search |
Search durable memories semantically |
xmemo_remember |
Save a durable fact, preference, or decision |
xmemo_update_state |
Save active task, next action, or blocker with TTL |
Optional workflow tools
Set "enable_workflow_tools": true in xmemo.json:
| Tool | Purpose |
|---|---|
xmemo_record_event |
Append a timeline event or milestone |
xmemo_create_reminder |
Create a TODO or action item |
xmemo_list_reminders |
List open or completed reminders |
xmemo_complete_reminder |
Mark a reminder complete |
Optional destructive tool
Set "enable_destructive_tools": true to expose xmemo_forget. Deletion
requires an exact memory ID and stays disabled by default.
Configuration
Most installations need no manual configuration. Non-secret settings live in
$HERMES_HOME/xmemo.json:
| Key | Default | Purpose |
|---|---|---|
agent_id |
hermes |
Agent family identifier |
agent_instance_id |
generated | Stable, opaque installation identifier |
bucket |
work |
Namespace for new Hermes-authored writes |
scope |
hermes/default |
Scope for new Hermes-authored writes |
read_bucket |
% |
Recall/search bucket filter (% means all visible) |
read_scope |
unset | Recall/search scope filter (unset means all visible) |
timeout_seconds |
5.0 |
REST request timeout |
prefetch_max_items |
5 |
Maximum recalled items |
prefetch_max_tokens |
900 |
Maximum recalled context tokens |
enable_workflow_tools |
false |
Expose reminder and event tools |
enable_destructive_tools |
false |
Expose xmemo_forget |
capture_timeline |
false |
Record high-signal turns |
enable_non_idempotent_replay |
false |
Auto-replay non-idempotent queued writes |
Example:
{
"bucket": "work",
"scope": "hermes/default",
"read_bucket": "%",
"prefetch_max_items": 5,
"prefetch_max_tokens": 900,
"enable_workflow_tools": false
}
Environment overrides
| Variable | Overrides |
|---|---|
XMEMO_KEY |
API key |
XMEMO_URL |
Service base URL |
XMEMO_AGENT_ID |
agent_id |
XMEMO_AGENT_INSTANCE_ID |
agent_instance_id |
XMEMO_BUCKET |
bucket |
XMEMO_SCOPE |
scope |
XMEMO_READ_BUCKET |
read_bucket |
XMEMO_READ_SCOPE |
read_scope |
XMEMO_TIMEOUT_SECONDS |
timeout_seconds |
XMEMO_PREFETCH_MAX_ITEMS |
prefetch_max_items |
XMEMO_PREFETCH_MAX_TOKENS |
prefetch_max_tokens |
Legacy MEMORY_OS_API_KEY, MEMORY_OS_MCP_TOKEN, and MEMORY_OS_URL
variables remain accepted.
Credential resolution
Credentials are resolved in this order:
XMEMO_KEY, then the supported legacy environment variables.- The user-scoped credential saved by
xmemo login.
Secrets are never read from or written to xmemo.json. The setup flow can sync
the active token to $HERMES_HOME/.env for Hermes compatibility.
Reliability
The plugin maintains $HERMES_HOME/xmemo_cache.db so temporary service or
network failures degrade safely.
| Layer | Behavior |
|---|---|
| Fresh read cache | Reuses matching recall/search results for 5 minutes |
| Stale fallback | Returns marked cache results during transient failures, up to 24 hours old |
| Write outbox | Queues transiently failed writes with stable idempotency keys |
| Replay | Retries idempotent writes up to 5 times with exponential backoff capped at 1 hour |
| Non-idempotent writes | Held by default to avoid duplicate reminders or events |
| Dead letters | Permanent failures and exhausted retries are retained for diagnosis |
| Retention | Sent entries: 24 hours; failed entries: 7 days; failed queue capped at 100 |
Fallback responses are explicitly marked with stale: true and
source: "cache" so the agent does not confuse an offline cache result with
fresh cloud state.
[!WARNING]
xmemo_cache.dbcontains cached memory responses and queued write payloads as plain-text JSON. It never stores API credentials, but$HERMES_HOMEshould still be readable only by the owning user.
Security
| Control | Default |
|---|---|
| Credentials outside project configuration | Enabled |
| Destructive memory tool | Disabled |
| Automatic timeline capture | Disabled |
| Exact ID required for deletion | Enabled |
| Per-session prefetch isolation | Enabled |
| Bounded network timeout | 5 seconds |
| Circuit breaker | Enabled |
Avoid committing $HERMES_HOME/.env, xmemo.json, or runtime cache files.
Treat the XMemo token like any other service credential.
Operations
Disable XMemo without removing files:
hermes config set memory.provider ""
Re-enable it:
hermes config set memory.provider xmemo
Remove the installed provider:
rm -rf "${HERMES_HOME:-$HOME/.hermes}/plugins/xmemo"
Development
git clone https://github.com/yonro/hermes-xmemo-plugin.git
cd hermes-xmemo-plugin
python -m pip install -e .
python -m pytest -q
python -m build
The implementation shipped to Hermes lives in
src/hermes_xmemo/xmemo/. Keep its bundled README aligned with this repository
README whenever installation or configuration behavior changes.
Agent-readable metadata
| Field | Value |
|---|---|
| Package | hermes-xmemo |
| Provider name | xmemo |
| Recommended mode | hermes_plugin_preferred |
| Agent discovery | https://xmemo.dev/.well-known/agent-discovery.json |
| Hermes configuration | https://xmemo.dev/v1/mcp/config/hermes |
| MCP fallback | https://xmemo.dev/mcp |
| Repository | https://github.com/yonro/hermes-xmemo-plugin |
Links
License
MIT © XMemo contributors.