Caduceus Memory MCP
Integrates with Hermes Agent to store and retrieve durable memory via Markdown files and SQLite fact store.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Caduceus Memory MCPremember that my favorite color is blue"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Caduceus Memory MCP

A local shared-memory MCP server for Claude, Codex, Hermes, and other MCP-aware agents.
The goal is simple: one durable memory layer that every agent can read from and write to.
Claude Code ----\
Codex ----- caduceus-memory-mcp ---- ~/.hermes
Hermes ----/ memories/ + memory_store.dbWhy Caduceus?
Hermes carries messages. The caduceus is Hermes' staff. This project is the staff: the bridge that lets different agents carry the same memory forward.
Related MCP server: SafeFlo
Artwork
The project artwork uses an original ultramarine-and-ivory engraving style: two agent forms, a shared ribbon between them, and a persistent memory layer above. It is meant to nod toward the mythic Hermes lineage without copying or implying affiliation with Hermes Agent, Nous Research, or any other project.
What It Stores
Caduceus stores memory in two local forms:
Markdown files for always-on human-readable memory:
~/.hermes/memories/USER.md~/.hermes/memories/MEMORY.md
SQLite FTS fact store for searchable recall:
~/.hermes/memory_store.db
It is designed to sit next to Hermes, but it does not require Hermes Agent to be running.
Tools
The MCP server exposes:
memory_summary- read the current Markdown memory summarymemory_search- search the SQLite fact storememory_list- list recent factsmemory_add- add a durable memorymemory_update- update a fact by idmemory_remove- remove a fact by id
Install From A Clone
git clone https://github.com/ethos-zero/caduceus-memory-mcp.git
cd caduceus-memory-mcp
python3 -m venv .venv
.venv/bin/pip install -e .Your server command will be:
/absolute/path/to/caduceus-memory-mcp/.venv/bin/caduceus-memory-mcpConfigure Codex
Add this to ~/.codex/config.toml:
[mcp_servers.caduceus_memory]
command = "/absolute/path/to/caduceus-memory-mcp/.venv/bin/caduceus-memory-mcp"
args = []
startup_timeout_sec = 120
[mcp_servers.caduceus_memory.env]
HERMES_HOME = "/Users/YOU/.hermes"Restart Codex or open a fresh session so it reloads MCP servers.
Configure Claude Code
Add this to ~/.claude.json:
{
"mcpServers": {
"caduceus-memory": {
"type": "stdio",
"command": "/absolute/path/to/caduceus-memory-mcp/.venv/bin/caduceus-memory-mcp",
"args": [],
"env": {
"HERMES_HOME": "/Users/YOU/.hermes"
}
}
}
}If you already have other mcpServers, merge the caduceus-memory entry into the existing object.
Optional Claude SessionStart Hook
Claude Code can also auto-inject the Markdown memory at the beginning of each session. Copy:
examples/sessionstart-hermes-memory.shto something like:
~/.claude/hooks/sessionstart-hermes-memory.shThen add a SessionStart hook in ~/.claude/settings.json.
The MCP server is still the source of truth for search and writes; the hook just makes the high-signal Markdown summary visible immediately.
Environment Variables
Defaults are chosen for Hermes compatibility:
Variable | Default | Purpose |
| unset | Primary Caduceus home override |
|
| Hermes-compatible memory home |
|
| Markdown memory directory |
|
| SQLite fact store path |
Priority for home is:
CADUCEUS_HOMEHERMES_HOME~/.hermes
Local Smoke Test
python -m unittest discover -s tests -vTo test through an MCP client, use any MCP-compatible inspector/client and run:
caduceus-memory-mcpPrivacy
This server is local-first. It does not send memory anywhere by itself. Any agent you connect to it can read or write the configured local memory, so only connect agents you trust.
Name Ideas
If you want a different name before publishing:
caduceus-memory-mcp- Hermes' staff; strong bridge metaphormneme-mcp- Greek memory spirit; short and directmnemosyne-mcp- Greek goddess of memory; beautiful but harder to typeiris-memory-mcp- divine messenger bridge; lighter than Hermesatlas-memory-mcp- carries the world of contextaegis-memory-mcp- protective shared memory layerthreadkeeper-mcp- less mythic, very clear
Available Tools
6 toolsmemory_addA
Add a durable fact to shared memory.
Use target='user' for identity, preferences, and working style. Use target='memory' for projects, tools, paths, decisions, and setup notes.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| target | No | memory | |
| category | No | general | |
| tags | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey behavioral traits. It indicates the operation creates a durable fact (persistent storage) and gives context for targets, but lacks details on potential side effects, authorization needs, or limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: the first states the tool's purpose, the second provides clear usage guidance for the key parameter. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the output schema (unseen) may define return values, the description fails to explain three of four parameters. Given the tool's 4 parameters and no schema descriptions, the description is incomplete for agent understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. Only the 'target' parameter receives explanation; 'content', 'category', and 'tags' are not described. This leaves the agent uncertain about the use of the other three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Add a durable fact to shared memory,' providing a specific verb and resource. It implicitly distinguishes from sibling tools (list, remove, search, summary, update) which involve different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance for the 'target' parameter: use 'user' for personal data and 'memory' for other facts. However, it does not explicitly state when to use this tool instead of alternatives like memory_update.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_listB
List recent facts from the shared memory fact store.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavior. It mentions 'recent' but does not define recency, ordering, or whether all facts are returned. The output schema exists but is not referenced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no extraneous words. It is highly concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool (1 optional param, output schema present), the description adequately states purpose but lacks details like what 'recent' means, default behavior, or how results are ordered. It is minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description adds no meaning to the 'limit' parameter beyond its name. For a tool with one parameter, the description should at least clarify its effect, which it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists recent facts from the shared memory fact store, which is a specific verb+resource combination. It is distinct from siblings like memory_add, memory_remove, memory_search, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for viewing recent facts, but it offers no explicit guidance on when to use it vs. memory_search or memory_summary, nor any exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_removeA
Remove a fact by id and remove the matching Markdown bullet if present.
| Name | Required | Description | Default |
|---|---|---|---|
| fact_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the matching Markdown bullet is removed if present, but with no annotations, it omits side effects, authorization, and idempotency details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the action, and no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple tool with one parameter and output schema, but lacks details on error handling and preconditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one required parameter (fact_id) and 0% schema coverage, the description 'Remove a fact by id' effectively explains the parameter's purpose beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it removes a fact by id and removes the matching Markdown bullet, distinguishing it from sibling tools that add, list, search, summarize, or update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies use when you have a fact_id and want to delete, but provides no explicit guidance on when not to use or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_searchC
Search the shared memory fact store.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. The description only says 'Search' but does not disclose whether it is read-only, what data it returns, or any side effects. Essential behavioral traits are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence is front-loaded but under-specified. It is concise but at the expense of informativeness. Could benefit from more detail without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 2 parameters and an output schema, the description is incomplete. No information about search semantics, result format, or pagination. Output schema exists but is not described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (no parameter descriptions). The description adds no meaning beyond the name 'query' and 'limit' in the schema. Agent cannot infer how to construct queries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states 'Search the shared memory fact store.' The verb 'Search' and resource 'shared memory fact store' are clear. Context from sibling tool names (memory_add, memory_list, etc.) distinguishes it, but the description does not explicitly differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus siblings like memory_list or memory_summary. The description provides no usage context or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_summaryA
Return the always-on shared memory summary.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It identifies the tool as a read operation returning a summary, but does not elaborate on what the summary contains, whether it is a snapshot, or any other behavioral details. The description is minimally adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that exactly conveys the tool's purpose with no unnecessary words. It is front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has no parameters and an output schema exists (though not shown), the description is largely complete. It could benefit from a brief indication of what the summary includes (e.g., 'total memory count, last updated timestamp'), but the current wording is sufficient for a simple retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, and the input schema is already fully documented with 100% coverage. The description does not add parameter semantics because none exist. Baseline of 4 is appropriate given the absence of parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a summary of shared memory, distinguishing it from sibling tools like memory_list (which likely lists individual entries) and memory_search (which queries specific items). The verb 'Return' and noun 'summary' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as memory_list or memory_search. An agent must infer the purpose, but there are no explicit when-to-use or when-not-to-use instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_updateC
Update a fact by id.
| Name | Required | Description | Default |
|---|---|---|---|
| fact_id | Yes | ||
| content | No | ||
| category | No | ||
| tags | No | ||
| trust_score | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, and the description only states 'Update a fact by id' without disclosing whether the update is partial or full, what happens if the id doesn't exist, or any side effects. The description carries the full burden but provides minimal behavior info.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, but it sacrifices necessary detail. It is front-loaded but too brief to be helpful on its own.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters, no schema descriptions, and no annotations, the description is insufficient. It does not explain the output schema or the behavior of partial updates, leaving significant gaps for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain any of the 5 parameters (fact_id, content, category, tags, trust_score). The tool name implies update, but no parameter semantics are added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource ('Update a fact by id'), distinguishing it from sibling tools like memory_add (create) and memory_remove (delete). However, it does not specify which fields can be updated, relying on the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., when to update vs. add or remove), no prerequisites or context provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
memory_add - First observed
memory_list - First observed
memory_remove - First observed
memory_search - First observed
memory_summary - First observed
memory_update
TDQS
Scored across 6 tools
Each tool has a distinct operation: add, list, remove, search, summary, update. No overlap in functionality.
All tools follow the consistent pattern 'memory_' followed by a verb in imperative form (add, list, remove, search, summary, update).
6 tools cover essential CRUD plus search and summary, appropriate for a memory management server without being excessive.
Covers all basic operations: create, read (list/search), update, delete, plus a summary. No obvious gaps.
Maintenance
Related MCP Connectors
Shared memory and actions for Claude, Kiro, OpenAI, Cursor, and other MCP-compatible AI clients.
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
Persistent AI memory shared across Claude, ChatGPT, coding agents, and compatible MCP clients.
Persistent memory for AI agents across Claude, ChatGPT and any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA shared memory and coordination server for multiple AI coding agents, built on the Model Context Protocol (MCP).5MIT
- AlicenseNot gradedqualityCmaintenanceLocal MCP server for Claude Code providing persistent memory, task planning, and agent coordination with full transparency and no network calls.2MIT
- AlicenseNot gradedqualityCmaintenanceA local-first MCP memory server providing persistent, searchable memory for AI agents, powered by SQLite.1 npm1Apache 2.0
- FlicenseNot gradedqualityAmaintenanceAn MCP server that provides a shared memory layer for Claude across claude.ai, Claude Code CLI, and Desktop, storing revisioned memory entries, session timelines, handoffs, and uploaded artifacts in SQLite.-