memory-mcp
Enables reading, writing, and searching a local markdown-based memory store using MCP tools, with safety checks and index consistency.
README
memory-mcp
memory-mcp is a small Model Context Protocol
server over the fleet's markdown-memory store. It turns the read/write
calls on that store — search, get, list, index, and careful write/update —
into typed tools, with name validation, no-clobber / no-traversal write safety,
and index consistency baked into the server.
The persist/recall methodology — when to save a memory, how to dedupe, how
to phrase it — stays a skill (persist). This server is only the read/write
call.
The store format
A memory root directory (configurable via MEMORY_ROOT) contains:
-
One
.mdfile per memory. YAML frontmatter with a top-levelname(kebab-case slug) anddescription(one line, used for recall relevance), then ametadata:block withtype(user|feedback|project|reference) plus any other keys (e.g.node_type), then a markdown body (which may contain[[other-name]]wiki-links):--- name: feedback-prefer-wif description: Prefer Workload Identity Federation over service-account keys metadata: node_type: memory type: feedback --- Use WIF (keyless OIDC) instead of downloaded SA JSON keys. Related: [[some-other-memory]] -
MEMORY.md— a human-readable index, one pointer line per memory:- [name.md](name.md) — hook.
The frontmatter is parsed with the standard library only (no PyYAML), so the
core package has zero runtime dependencies. Unknown metadata keys
(node_type, originSessionId, …) are preserved across an update.
Tools
| Tool | Purpose |
|---|---|
memory_search(query, type?, limit?) |
Ranked search over name + description + body (name match ranks highest; whole-query phrase match is a strong bonus). Optional type filter. |
memory_get(name) |
One memory's full frontmatter + body. |
memory_list(type?) |
Every memory (optionally by type), name-sorted. |
memory_index() |
The MEMORY.md pointer lines (the human-readable index). |
memory_write(name, description, type, body, links?) |
Create a new memory; refuses to overwrite an existing one; adds one index pointer. links are appended as [[name]]. |
memory_update(name, description?, type?, body?, links?) |
Edit an existing memory, preserving unspecified fields and unknown metadata; reconciles the index pointer in place. |
type is one of user / feedback / project / reference. Every search hit
carries name / description / type / path / score.
Write safety
- Validated names. A
namemust be a kebab-case slug and is resolved to a single<name>.mdinside the root. A name with a separator,.., or an absolute path is rejected before any byte is written — a write can never escape the configured store. - No clobber.
memory_writerefuses to overwrite an existing memory; usememory_updateto change one. - Index consistency. Each write adds or replaces exactly one
MEMORY.mdpointer for that memory — never a duplicate. - Idempotent. Rewriting the same content yields the same file and the same single index line.
- No delete. There is intentionally no delete tool in this version, to avoid accidental memory loss.
Configuration (environment, resolved at call time)
| Variable | Effect |
|---|---|
MEMORY_ROOT |
Path to the memory store root (the directory of .md files + MEMORY.md). Defaults to ~/.claude/projects/-home-dev/memory. No path is hardcoded into the package. |
No credentials are read or stored by this server.
Install
Run directly from GitHub with the MCP extra:
uvx --from "git+https://github.com/selamy-labs/memory-mcp@v0.1.0#egg=memory-mcp[mcp]" memory-mcp
Or with pipx:
pipx install "memory-mcp[mcp] @ git+https://github.com/selamy-labs/memory-mcp@v0.1.0"
MCP client config
{
"mcpServers": {
"memory": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/selamy-labs/memory-mcp@v0.1.0#egg=memory-mcp[mcp]",
"memory-mcp"
],
"env": {
"MEMORY_ROOT": "/path/to/your/memory"
}
}
}
}
Architecture
The store logic lives once in memory_mcp.core.MemoryStore; the MCP server in
memory_mcp.mcp_server is a thin wrapper that serialises structured results to
JSON and maps expected failures to ToolError. All file access goes through an
injected storage (memory_mcp.storage) and all timing through an injected
clock, so the full search / get / write / index path is exercised offline in
tests on an in-RAM root. The default LocalStorage and the stdlib document
parser keep the core package dependency-free; the mcp SDK is an optional
extra needed only to run the server.
Development
python -m pip install -e ".[test]"
ruff format --check .
ruff check .
coverage run -m pytest
coverage report --fail-under=95
License
MIT — see LICENSE.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
mcp-server-qdrant
这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器