Memory MCP Server

io.github.j0hanz由 GitHub 帳號 j0hanz 發布v1.7.0更新於 Oct 24, 2026

SQLite-backed MCP server for persistent memory, full-text retrieval, and graph traversal.

發布方自己的服務:Memory.fit

已驗證STDIO僅桌面資料庫知識與記憶

概覽

AI 產生的概覽

以 SQLite 為後端的本機記憶伺服器,讓助理跨工作階段儲存、搜尋、關聯並回想持久記憶。

可以做什麼
  • 以 SHA-256 雜湊為識別,單筆或批次新增、更新、刪除記憶
  • 對記憶內容與標籤做全文搜尋,可依重要度與類型篩選
  • 建立、查詢與刪除記憶之間的有向關係
  • 先搜尋再沿關係圖最多三跳遍歷,回想相關記憶
  • 依呼叫端指定的 token 預算回傳上下文,並讀取儲存統計
適用情境
適合希望助理在多次對話之間記住事實、決策、計畫或經驗教訓,並能把相關筆記自動帶回上下文的場合。較適合單一使用者在本機使用、以檔案保存記憶的需求。
執行需求
透過 npm 套件(需 Node.js 24 以上)或 Docker 映像在本機以 stdio 執行;SQLite 需支援 FTS5,啟動時會檢查。需要支援 stdio 命令伺服器的 MCP 用戶端。可選環境變數用來設定資料庫路徑(MEMORY_DB_PATH)與回想遍歷上限。
安裝前請注意
資料庫保存本機工作階段資料,README 建議不要納入版本控制,也不要分享。寫入類工具會新增、修改與刪除記憶及關係,刪除記憶時會一併刪除其關係紀錄。相對路徑的 MEMORY_DB_PATH 會依行程工作目錄解析,目錄不對可能產生多餘的資料庫檔案。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Memory MCP Server,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Memory MCP

[npm version] [License: MIT] [Node.js] [TypeScript]

[Install in VS Code] [Install in VS Code Insiders]

[Install in Cursor]

A SQLite-backed MCP server for persistent memory storage, full-text retrieval, and relationship graph traversal.

Overview

Memory MCP provides a local, persistent memory layer for MCP-enabled assistants. It stores SHA-256-addressed memory items in SQLite with FTS5-powered full-text search, a directed relationship graph, BFS recall traversal, and token-budget-aware context retrieval — all accessible over stdio transport with no external dependencies.

Key Features

  • 13 MCP tools for CRUD, batch operations, FTS5 search, BFS graph recall, token-budget context retrieval, relationships, and stats.
  • Full-text search over content and tags via SQLite FTS5 with importance and type filters.
  • Graph recall with BFS traversal, bounded frontier, and MCP progress notifications per hop.
  • Token-budget retrieval (retrieve_context) selects memories that fit a caller-specified token budget — no manual pagination needed.
  • Strict Zod input validation with typed output envelopes and SHA-256 hash addressing.
  • Resource support with internal://instructions (Markdown guide) and memory://memories/{hash} URI template with hash auto-completion.
  • stdio transport with clean shutdown handling (SIGINT, SIGTERM) and no HTTP endpoints. |

Requirements

  • Node.js >=24.
  • SQLite with FTS5 support (verified at startup).
  • Any MCP client that supports stdio command servers.

Quick Start

Use the npm package directly with npx — no installation required:

json
{  "mcpServers": {    "memory-mcp": {      "command": "npx",      "args": ["-y", "@j0hanz/memory-mcp@latest"]    }  }}

[!TIP] The server uses stdio transport only; no HTTP endpoint is exposed. Stdout must not be polluted by custom logging.

Or run with Docker:

bash
docker run --rm -i ghcr.io/j0hanz/memory-mcp:latest

Client Configuration

Install in VS Code

[Install in VS Code]

Workspace file .vscode/mcp.json:

json
{  "servers": {    "memory-mcp": {      "command": "npx",      "args": ["-y", "@j0hanz/memory-mcp@latest"]    }  }}

CLI:

bash
code --add-mcp '{"name":"memory-mcp","command":"npx","args":["-y","@j0hanz/memory-mcp@latest"]}'
Install in VS Code Insiders

[Install in VS Code Insiders]

CLI:

bash
code-insiders --add-mcp '{"name":"memory-mcp","command":"npx","args":["-y","@j0hanz/memory-mcp@latest"]}'
Install in Cursor

[Install in Cursor]

~/.cursor/mcp.json:

json
{  "mcpServers": {    "memory-mcp": {      "command": "npx",      "args": ["-y", "@j0hanz/memory-mcp@latest"]    }  }}
Install in Claude Desktop / Claude Code

claude_desktop_config.json:

json
{  "mcpServers": {    "memory-mcp": {      "command": "npx",      "args": ["-y", "@j0hanz/memory-mcp@latest"]    }  }}

CLI:

bash
claude mcp add memory-mcp -- npx -y @j0hanz/memory-mcp@latest
Install in Windsurf

MCP config:

json
{  "mcpServers": {    "memory-mcp": {      "command": "npx",      "args": ["-y", "@j0hanz/memory-mcp@latest"]    }  }}
Run with Docker
bash
# Pull and run (stdio mode)docker run --rm -i \  -e MEMORY_DB_PATH=/data/memory.db \  -v memory-data:/data \  ghcr.io/j0hanz/memory-mcp:latest

MCP client config:

json
{  "mcpServers": {    "memory-mcp": {      "command": "docker",      "args": [        "run",        "--rm",        "-i",        "-e",        "MEMORY_DB_PATH=/data/memory.db",        "-v",        "memory-data:/data",        "ghcr.io/j0hanz/memory-mcp:latest"      ]    }  }}

Documentation Maintenance

  • Owner: maintainers updating MCP behavior in src/ must update README.md and affected mcp/ mirror pages in the same PR.
  • Link/version policy: use pinned https://modelcontextprotocol.io/specification/2025-11-25/... links for protocol references; avoid latest and mixed legacy targets.
  • Drift-check checklist:
    • Re-verify capability declarations in src/server.ts.
    • Reconcile tool/resource/prompt docs with src/tools/index.ts, src/resources/index.ts, and src/prompts/index.ts.
    • Confirm limitations/gotchas in src/instructions.md match runtime behavior.
  • Validation commands: npm run type-check, npm run test:fast, npm run build.

MCP Surface

Tools Summary

ToolCategoryNotes
store_memoryWriteIdempotent by content+sorted tags hash
store_memoriesWriteBatch (1–50), transaction-wrapped
get_memoryReadHash lookup
update_memoryWriteReturns old_hash + new_hash
delete_memoryWriteCascades relationship deletion
delete_memoriesWriteBatch (1–50), transaction-wrapped
search_memoriesReadFTS5 + importance/type filters + cursor
create_relationshipWriteIdempotent directed edge creation
delete_relationshipWriteDeletes exact directed edge
get_relationshipsReadDirection filter + linked memory fields
recallReadFTS5 seed + BFS traversal (depth 0–3)
retrieve_contextReadToken-budget-aware context retrieval
memory_statsReadStore aggregates and type breakdown

store_memory

Store a new memory with content, tags, and optional type/importance. Idempotent — storing the same content+tags returns the existing hash with created: false.

NameTypeRequiredDefaultDescription
contentstringYes—Memory content (1–100000 chars)
tagsstring[]Yes—1–100 tags, each max 50 chars, no whitespace
memory_typeenumNogeneralgeneral, fact, plan, decision, reflection, lesson, error, gradient
importanceintegerNo0Priority 0–10

Returns: { hash, created }


store_memories

Store multiple memories in one transaction (max 50 items).

NameTypeRequiredDescription
itemsArray<StoreMemoryItem>Yes1–50 items, each with content, tags, optional memory_type, optional importance

Returns: { items, succeeded, failed }


get_memory

Retrieve one memory by its SHA-256 hash.

NameTypeRequiredDescription
hashstringYes64-char lowercase SHA-256 hex

Returns: Memory or { ok: false, error } on E_NOT_FOUND.


update_memory

Update content and optionally tags for an existing memory. Returns both hashes.

NameTypeRequiredDefaultDescription
hashstringYes—Existing memory hash
contentstringYes—Replacement content
tagsstring[]NoExisting tagsReplacement tags

Returns: { old_hash, new_hash }


delete_memory

Delete one memory by hash. Cascades to related relationship rows.

NameTypeRequiredDescription
hashstringYesMemory hash

Returns: { hash, deleted }


delete_memories

Delete multiple memories by hash in one transaction.

NameTypeRequiredDescription
hashesstring[]Yes1–50 memory hashes

Returns: { items, succeeded, failed }


search_memories

Full-text search over memory content and tags using FTS5. Supports importance and type filters with cursor pagination.

NameTypeRequiredDefaultDescription
querystringYes—Search text (1–1000 chars)
limitintegerNo20Results per page (1–100)
cursorstringNo—Pagination cursor from previous response
min_importanceintegerNo—Only return memories with importance >= this value (0–10)
max_importanceintegerNo—Only return memories with importance <= this value (0–10)
memory_typeenumNo—Filter by memory type

Returns: { memories, total_returned, nextCursor? }


create_relationship

Create a directed relationship edge between two memories. Idempotent.

Suggested relation_type values: related_to, causes, depends_on, parent_of, child_of, supersedes, contradicts, supports, references.

NameTypeRequiredDescription
from_hashstringYesSource memory hash
to_hashstringYesTarget memory hash
relation_typestringYesEdge label (1–50 chars, no whitespace, free-form)

Returns: { created }


delete_relationship

Delete one directed relationship edge.

NameTypeRequiredDescription
from_hashstringYesSource hash
to_hashstringYesTarget hash
relation_typestringYesRelationship type

Returns: { deleted } or { ok: false, error } on E_NOT_FOUND.


get_relationships

Retrieve relationships for a memory, with optional direction filter.

NameTypeRequiredDefaultDescription
hashstringYes—Memory hash
directionenumNobothoutgoing, incoming, or both

Returns: { relationships, count }

Each relationship includes from_hash, to_hash, relation_type, created_at, linked_hash, linked_content, and linked_tags.


recall

Search memories by full-text query, then traverse the relationship graph up to depth hops via BFS. Emits MCP progress notifications per hop.

NameTypeRequiredDefaultDescription
querystringYes—Seed search query (1–1000 chars)
depthintegerNo1BFS hops (0–3)
limitintegerNo10Seed memory count (1–50)
cursorstringNo—Pagination cursor from previous response
min_importanceintegerNo—Seed filter: only memories with importance >= value (0–10)
max_importanceintegerNo—Seed filter: only memories with importance <= value (0–10)
memory_typeenumNo—Seed filter: only memories of this type

Returns: { memories, graph, depth_reached, aborted?, nextCursor? }

Each item in graph uses the shape:

json
{ "from_hash": "...", "to_hash": "...", "relation_type": "..." }

[!NOTE] aborted: true indicates the traversal hit a safety limit (RECALL_MAX_FRONTIER_SIZE, RECALL_MAX_EDGE_ROWS, or RECALL_MAX_VISITED_NODES). Partial results are still returned.


retrieve_context

Search memories and return relevance-ranked results that fit within a caller-specified token budget. Eliminates manual pagination and token counting for context window management.

NameTypeRequiredDefaultDescription
querystringYes—Search query (1–1000 chars)
token_budgetintegerNo4000Maximum estimated tokens to return (100–200000)
strategyenumNorelevanceSort order: relevance (FTS rank), importance (highest first), recency (newest first)

Returns: { memories, estimated_tokens, truncated }

[!TIP] Token estimation is approximate (content length ÷ 4). truncated: true means the budget was reached before all candidates were included.


memory_stats

Return aggregate memory and relationship stats. Takes no input.

Returns:

json
{  "memories": {    "total": 0,    "oldest": null,    "newest": null,    "avg_importance": null  },  "relationships": { "total": 0 },  "by_type": {}}

Resources

URIMIMEDescription
internal://instructionstext/markdownMarkdown usage guide for all tools and workflows
memory://memories/{hash}application/jsonReturns one memory as JSON; hash completion supported

Prompts

NameArgumentsPurpose
get-helpnoneReturns full usage instructions for all tools

Configuration

Environment Variables

VariableDescriptionDefaultRequired
MEMORY_DB_PATHSQLite database file pathmemory_db/memory.dbNo
RECALL_MAX_FRONTIER_SIZEMax BFS frontier nodes per hop (100–50000)1000No
RECALL_MAX_EDGE_ROWSMax relationship rows fetched per traversal (100–50000)5000No
RECALL_MAX_VISITED_NODESMax visited nodes across entire traversal (100–50000)5000No

[!IMPORTANT] If MEMORY_DB_PATH is relative (including the default memory_db/memory.db), it resolves from the process working directory.

[!TIP] Add memory_db/ to your .gitignore to keep the database out of version control — it contains local session data and should not be shared or committed.

Limits and Constraints

ItemValue
Content length1–100000 chars
Tag count1–100 per memory
Tag length1–50 chars, no whitespace
Hash format64-char lowercase hex SHA-256
Search query length1–1000 chars
search_memories.limit1–100 (default 20)
recall.depth0–3 (default 1)
recall.limit1–50 (default 10)
retrieve_context.token_budget100–200000 (default 4000)
Batch size1–50 items (store_memories, delete_memories)
Recall frontier guardRECALL_MAX_FRONTIER_SIZE (default 1000 per hop)
SQLite busy timeout5000 ms

[!NOTE] Cursor values are opaque base64url-encoded tokens. Treat them as opaque and do not parse them.

Security

  • Transport is stdio-only (StdioServerTransport) — no HTTP endpoints.
  • Fatal process errors are written to stderr; stdout must remain clean for the MCP protocol.
  • All inputs are validated with strict Zod schemas and bounded field constraints before any database access.
  • Hashes are validated against a lowercase 64-char SHA-256 hex regex.
  • Search input is tokenized to alphanumeric terms before FTS MATCH execution (non-alphanumeric characters act as delimiters, preventing FTS injection).
  • SQLite foreign keys are enabled; relationship rows cascade-delete when a memory is removed.

Development

Install dependencies:

bash
npm install

Core scripts:

ScriptCommandPurpose
buildnpm run buildClean, compile, validate instructions, copy assets, chmod executable
devnpm run devTypeScript watch mode
dev:runnpm run dev:runRun built server with .env and file watch
startnpm run startStart built server
testnpm run testFull build + tests via task runner
test:fastnpm run test:fastRun TS tests directly with Node test runner
lintnpm run lintESLint checks
lint:fixnpm run lint:fixESLint auto-fix
type-checknpm run type-checkStrict TypeScript checks
formatnpm run formatPrettier format
inspectornpm run inspectorBuild and open MCP Inspector against stdio server

Inspect with MCP Inspector:

bash
npx @modelcontextprotocol/inspector node dist/index.js

Build & Release

GitHub Actions release workflow (.github/workflows/release.yml) handles versioning, validation, and publishing via a single workflow_dispatch trigger:

workflow_dispatch (patch / minor / major / custom)    │    ▼  release — bump package.json + server.json → lint → type-check → test → build → tag → GitHub Release    │    ├──► publish-npm ──► publish-mcp   (npm Trusted Publishing OIDC → MCP Registry)    │    └──► publish-docker                (GHCR, linux/amd64 + linux/arm64)

Trigger a release:

bash
gh workflow run release.yml -f bump=patch

Or use the GitHub UI: Actions → Release → Run workflow.

[!NOTE] npm publishing uses OIDC Trusted Publishing — no NPM_TOKEN secret required. MCP Registry uses GitHub OIDC. Docker uses the built-in GITHUB_TOKEN.

Troubleshooting

SymptomCauseFix
Startup fails with FTS5 errorNode.js build without FTS5Use Node.js 24+ with SQLite FTS5 support
E_NOT_FOUND on get_memoryHash doesn't existVerify via search_memories first
E_INVALID_CURSORStale or malformed cursorRetry the request without the cursor parameter
MCP client can't connectCustom stdout logging addedEnsure nothing writes to stdout in the server process
aborted: true in recallTraversal hit a safety limitReduce depth, or tune RECALL_MAX_* env vars
Database locked errorsHigh concurrent write loadSQLite busy timeout is 5000 ms; reduce concurrent writes

License

MIT

來源:README.md,提交 952b43c

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v1.7.0最新Sep 16, 2026

評分

已滿足適用檢查項的 40%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。

其他 Memory 整合