Caduceus Memory MCP
Integrates with Hermes Agent to store and retrieve durable memory via Markdown files and SQLite fact store.
Click on "Install 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 disclose behavioral traits. It only states the tool adds a fact but does not mention mutation, required permissions, idempotency, or side effects (e.g., whether duplicate content is allowed). The description is insufficient for safe usage.
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 extremely concise, consisting of two short sentences and a line break. All information is front-loaded with no redundant text, making it efficient for an agent to parse.
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 presence of 4 parameters (2 with enums) and an output schema, the description is incomplete. It omits parameter semantics, behavioral details, and guidance on the output. The sibling tools are not referenced, leaving the agent to infer context on its own.
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 should compensate. It briefly explains 'target' but leaves 'content', 'category', and 'tags' unexplained. The enum values for 'category' (e.g., 'user_pref', 'project') are not defined, and 'tags' format is unspecified. Minimal value added over 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?
The description clearly states the verb 'Add' and the resource 'a durable fact to shared memory', effectively capturing the tool's core functionality. It distinguishes from siblings by focusing on addition vs. listing, removal, search, update, or summary.
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 on when to use 'target=user' vs 'target=memory', aiding in correct invocation. However, it does not discuss when to avoid this tool or mention alternatives (e.g., memory_update for modifying existing facts).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_listC
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 provided; description does not disclose behavioral traits like read-only nature, ordering, or what 'recent' means. The limit parameter is not explained.
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?
One sentence is too brief; it omits critical details about behavior and parameter usage. Being concise should not sacrifice necessary information.
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?
Despite low complexity, the description fails to define 'recent', clarify ordering, or indicate what the output contains. Output schema exists but description should still add context.
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% for the limit parameter. The description does not mention or explain the parameter beyond the schema, leaving the agent without guidance on its semantics.
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 action (list) and resource (recent facts from shared memory fact store). It implies a difference from search tools, though 'recent' is ambiguous.
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 vs siblings like memory_search or memory_summary. Context for when to choose listing over searching is absent.
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?
Since no annotations are provided, the description bears the full burden of behavioral disclosure. It transparently reveals that the tool not only removes the fact but also removes any corresponding Markdown bullet. However, it does not mention error handling or side effects on other related data.
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, concise sentence that front-loads the action and includes both key behaviors. Every word contributes to understanding; there is no redundancy.
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?
For a simple removal tool with one parameter and an output schema present, the description is minimally adequate. However, it lacks guidance on edge cases or expected behavior when the fact_id does not exist, which would improve completeness.
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 tool description adds no additional meaning to the sole parameter 'fact_id'. It simply mentions 'by id' without clarifying expected format, range, or source of the ID. For a single-parameter tool, the description should provide more context.
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's verb 'Remove' and the resource 'fact by id', and also specifies the additional action of removing the matching Markdown bullet. This distinguishes it from sibling tools like memory_add or memory_update, which serve different purposes.
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 the tool is for removing a single fact by its ID, but it provides no explicit guidance on when to use it versus alternatives (e.g., memory_update for modifications) or conditions to avoid (e.g., missing fact). No prerequites or when-not-to-use information is given.
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?
With no annotations, the description must disclose behavioral traits. It only states it searches, but does not mention read-only nature, performance implications, or any side effects.
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 extremely concise (5 words), but lacks sufficient detail. It is front-loaded but under-informative for the complexity of a search tool.
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?
Despite having 2 parameters (0% schema coverage) and an output schema, the description fails to explain what is returned or any behavioral details. The output schema may cover return values, but usage context is missing.
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 'query' or 'limit'. The parameters are completely undocumented beyond schema titles.
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 explicitly states 'Search the shared memory fact store', using a specific verb and resource. It clearly distinguishes from sibling tools like memory_add or memory_remove.
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 is provided on when to use this tool vs alternatives, nor any conditions or prerequisites. The description offers no context for selection.
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 provided. The description mentions 'always-on' but does not disclose behavioral traits such as side effects, authentication needs, or whether it is read-only. Minimal disclosure.
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 resource. No wasted words; highly concise.
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 no parameters and an output schema, the description is minimally adequate. However, it does not elaborate on what the summary contains (e.g., counts, types), leaving room for improvement.
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?
No parameters exist, so baseline is 4. The description does not add parameter meaning beyond the schema, but this is acceptable given zero 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?
Description clearly states verb 'Return' and resource 'shared memory summary'. It distinguishes from sibling tools like memory_add, memory_list, etc., which focus on individual memory items, while this provides a summary.
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 like memory_list or memory_search. The description only states what it does without context on usage scenarios.
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 are present, so the description must convey all behavioral traits. It only states 'Update', implying mutation, but offers no details on merging behavior, side effects, or requirements.
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 extremely concise but at the expense of essential information; it is too brief given the tool's complexity (5 parameters, no annotations).
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 no parameter descriptions, no usage guidance, and no behavioral details despite having an output schema, the description fails to provide a complete picture for effective use.
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%, yet the description adds no meaning to any of the 5 parameters, leaving the agent to rely solely on raw schema types.
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 uses the specific verb 'Update' paired with the resource 'fact', clearly distinguishing it from sibling tools like memory_add, memory_list, etc., which have different actions.
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 is provided on when to use this tool versus alternatives, or any prerequisites or context for its use.
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. Dates show when Glama detected each change.
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
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Shared memory and actions for Claude, Kiro, OpenAI, Cursor, and other MCP-compatible AI clients.
1One 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.61Apache 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.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ethos-zero/caduceus-memory-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server