N3MemoryCore MCP — Lite (Ephemeral)
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., "@N3MemoryCore MCP — Lite (Ephemeral)search memory for recent discussions on authentication"
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.
N3MemoryCore MCP — Lite (Ephemeral)
N3MC-MCP-Lite is an "external memory server" used by MCP-compatible editors such as Claude Code, Cursor, and Windsurf. It runs as an MCP Server so AI can save and search conversation and code context across sessions.
A NeuralNexusNote™ product — free Lite build: ephemeral hybrid (vector + BM25) memory exposed as a Model Context Protocol server, backed by Redis Stack with a 7-day TTL per entry.
💬 The MCP protocol can only nudge the LLM to call
save_memory, so which conversations actually get saved is ultimately up to the LLM. But if you ask Claude Code, it can also wire up hook-based auto-saving of every conversation. Just say "after every turn, automatically save the full Claude Code transcript to Lite" and Claude Code will drop a script under~/.claude/hooks/and add aStophook to~/.claude/settings.json. The harness runs the hook deterministically — it does not depend on the LLM remembering to callsave_memory, so Claude can never accidentally skip a save. See the Hook-based full-transcript saving section below for details.
🚀 Quickstart — connect to Claude Code in 3 steps
The fastest path from "nothing installed" to "Claude Code is using N3MC memory". Pick the install path that matches you (PyPI / fork / uvx), then add the server to your client config. Both Claude Code CLI and Claude Desktop are covered.
Step 1 — Start Redis Stack
docker run -d --name redis-stack -p 6379:6379 redis/redis-stack-server:latest
# (Subsequent sessions: `docker start redis-stack`)Step 2 — Install the package (choose one)
Quickest path — Claude Code marketplace. Bundles install + MCP wiring in two commands. Run inside Claude Code:
/plugin marketplace add NeuralNexusNote/n3mcmcp-lite
/plugin install n3mc-workingmemory@neuralnexusnoteThen /reload-plugins and skip Step 3 — the plugin manifest handles MCP wiring.
The manual options below remain available for forks, custom configs, and
Claude Desktop.
(a) From PyPI — most users:
pip install n3memorycore-mcp-lite(b) From a fork (you cloned this repo) — contributors / customizers:
git clone https://github.com/<YOU>/n3mcmcp-lite
cd n3mcmcp-lite
pip install -e ".[dev]"(c) Zero-install via uvx — no global install, isolated env:
# Just verify it runs; the actual launch is handled by your MCP client config:
uvx --from n3memorycore-mcp-lite n3mc-workingmemory --helpAfter step 2, the n3mc-workingmemory command is on your PATH. Run
where n3mc-workingmemory (Windows) or which n3mc-workingmemory
(macOS/Linux) to confirm.
Step 3 — Wire it into your MCP client
Client | What to do |
Claude Code (CLI), this repo's working tree |
|
Claude Code (CLI), a different project directory | Copy .mcp.json into that project, or add the same |
Claude Desktop (incl. its built-in "Code" tab) | Edit |
Claude Code with auto-tool-approval | One extra block in |
uvx-launched (no global install needed) | Use the uvx-form |
That's it. Once Claude Code is connected, the server's behavioral
instructions take over — search_memory runs at the start of every
turn and save_memory runs after each meaningful exchange, all
automatically.
First call may take 30–60 seconds the first time only — the ~400 MB
intfloat/multilingual-e5-baseembedding model downloads to~/.cache/huggingface/. Subsequent starts complete in seconds.
Related MCP server: ContextAtlas
⚠️ Prerequisites (required before install)
This server does not run out of the box — you must prepare two things first:
Redis Stack on
localhost:6379— the Lite build stores memory in Redis + RediSearch. The easiest way is Docker:# First time only (creates the container): docker run -d --name redis-stack -p 6379:6379 redis/redis-stack-server:latest # Every subsequent session (container already exists): docker start redis-stackRe-running the
docker runcommand after the container exists fails withConflict. The container name "/redis-stack" is already in use. Usedocker startfrom the second session onward.Why no persistence flags on the docker line: this build is deliberately volatile. Ephemerality is a design feature, not a missing capability — see the "Use cases" section below. Rather than rely on fragile shell-quoting for
--save ""(which breaks on Windows PowerShell and cmd.exe), the MCP server enforces the ephemeral state at startup by issuingCONFIG SET appendonly noandCONFIG SET save ""on every connect. If you manually re-enable persistence between sessions, it is reverted on the next Lite run. The plaindocker runabove is sufficient — the server is the source of truth for the ephemerality guarantee.uvon yourPATH— required only for the Claude Code plugin /uvxinstall path. Not needed if you install from source.
The server refuses to start if Redis is unreachable, and the Claude Code plugin will fail to launch without uv. Install both before running /plugin install or any client-side config.
Features
💾 Fully local — Your conversations stay in your own Redis instance. Nothing sent to the cloud.
🔍 Semantic search — Finds relevant past conversations even when the exact words differ.
🌐 Multilingual out of the box — CPU-only, no LLM/GPU required. NFKC fold (
アルファ↔アルファ,123↔123, ligatures), bigram coverage for Japanese / Chinese / Korean / Thai / Lao / Myanmar / Khmer, diacritic cross-match for Latin scripts (café↔cafe).🛡️ Encoding safety — stdio UTF-8 reconfigure on Windows (cp932 → UTF-8), lone-surrogate sanitization on every input. Same defenses as the Free build.
🔄 Context across sessions — Working memory that lasts 7 days (auto-expires via Redis TTL; pair with any persistent memory backend if you need longer retention).
⚡ Works automatically — Saving and searching happen automatically. The MCP
initializeresponse ships behavioral instructions, so no user action is required.🤖 Multi-agent ready — Multiple AI agents share one Redis. The
b_localandb_sessionbiases prioritize each project's own memories while still surfacing the team's collective knowledge.🏢 Team & organization support — Deploy Redis on a shared server and point
N3MC_REDIS_URLto it for team-wide memory sharing (⚠️ authentication must be handled at the Redis layer).🧹 Ephemerality is a design feature — 7-day auto-expiry means failed attempts and abandoned designs don't bleed into the next task.
docker restart redis-stackwipes everything instantly.💰 Reduces token waste — No more re-explaining past context. Memory search uses local embeddings (
intfloat/multilingual-e5-base) and costs zero Claude tokens, and accurate context injection means fewer corrections and back-and-forth.
How It Works
User's message
│
▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 1. Auto-save │────▶│ 2. Semantic │────▶│ 3. Context │
│ Save last │ │ search │ │ injection │
│ response to │ │ Find related │ │ Feed to │
│ Redis │ │ memories │ │ Claude │
└──────────────┘ └──────────────┘ └──────────────┘
│
▼
Claude responds
with full contextEverything runs automatically via the behavioral instructions shipped
in the MCP initialize response. No Claude Code hooks are involved — the
only client-side setup is adding the tools to permissions.allow. No user
action required.
Relationship with Claude's built-in auto-memory
Claude Code has a built-in auto-memory system
(~/.claude/projects/.../memory/). N3MemoryCore complements it rather
than competing with it.
Claude auto-memory | N3MemoryCore RAG | |
Strengths | Reliable, loads every session, great for fixed facts | Conversation context, detailed history |
Weaknesses | Cannot capture conversation flow or context | Depends on search quality; not guaranteed to surface |
Best for | User profile, folder paths, stable settings | Conversation threads, past decisions, reasoning |
Recommended usage:
Fixed information needed every session (folder paths, user preferences) → save to auto-memory
Conversation context and history (discussion threads, past decisions) → N3MemoryCore accumulates automatically (7-day window; pair with a persistent memory backend if you need longer retention)
Use cases — when working memory is the right tool
The 7-day TTL and volatile Redis storage are design features, not limitations. They make this server the right fit for:
Agentic code-generation loops — failed attempts and abandoned designs don't bleed into the next task;
docker restart redis-stackwipes the slate clean.Multi-agent collaboration — decisions made during one task don't contaminate unrelated follow-ups.
Experimental / throwaway prototyping — leave it alone and memory evaporates in 7 days, no pruning needed.
Project-scoped working memory — pin a
session_idper task / project to keep contexts cleanly separated.
If you need long-term, persistent knowledge accumulation across months or years, working memory is not the right layer. Pair this server with any persistent memory MCP — the official knowledge-graph server, your own SQLite-backed implementation, or an external service — to cover the long-term side.
What is this?
n3memorycore-mcp-lite is a local-only MCP server that gives Claude (and
any other MCP-compatible client) short-lived memory across conversations.
It stores text entries in a local Redis Stack instance with both a BM25
full-text index and a 768-dimension vector index
(intfloat/multilingual-e5-base), and
returns hybrid-ranked results.
Every operation runs on the user's machine. No API calls, no cloud storage.
Tools exposed
Tool | Purpose |
| Hybrid (vector + BM25) search, ranked & time-decayed, |
| Persist a short entry (7d TTL, dedup: exact + near-duplicate) |
| Most-recent entries, newest first |
| Remove a specific entry by id (cascades to chunks if id is a parent doc) |
| Bulk-delete every memory tied to a |
| Re-create the RediSearch index if missing |
The server also ships behavioral instructions via MCP's initialize
response, asking the client to search_memory at the start of each turn
and save_memory after each meaningful exchange — so "auto-save" is
preserved without any Claude Code hooks.
ID hierarchy
N3MemoryCore identifies the origin and context of every record with
five ID fields. Most users only ever touch session_id (and rarely
agent_name); the rest are filled in automatically.
ID | Stored in | Generated | Granularity | Purpose |
| Redis hash | Per record (UUIDv7, time-ordered) | One record | Unique identifier for each memory — used for |
|
| First startup (UUIDv4) | Owner / installation | Identifies whose data this is. Validated on every |
|
| First startup (UUIDv4) | Agent / install | UUIDv4 identifier for this install. Stored on every row for forward-compatibility with future persistent variants, but does NOT feed Lite's |
| In-memory or supplied by client | Per task / project / conversation (string) | Task / project / conversation | Surfaces memories from the same task / project together. Drives the |
| Redis hash | Per | Agent display label | Human-readable label (e.g. |
owner_id (one N3MC server / data owner)
└── session_id (one task / project / conversation)
└── local_id (the agent speaking inside that session)
├── agent_name (its display name: "claude-code" etc.)
└── id (one memory record)Practical guidance:
You should pin
session_idwhen working on a named project or task. Pass the same string (e.g."proj-alpha","task-refactor-auth") to bothsave_memoryandsearch_memory. This both ranks-up the project's own memories and gives you a one-shotdelete_memories_by_sessionfor project teardown.You can leave
agent_nameempty for single-agent use. Set it ("claude-code","cursor", …) when multiple agents share the same Redis so audit/list output stays readable.You should not pass
owner_idunless you specifically need to prove ownership (the server validates it againstconfig.jsonand rejects mismatches; an empty value means "use my own").
Prerequisites
1. Start Redis Stack
The Lite build requires Redis Stack (Redis + RediSearch module). The easiest way is Docker:
# First time only (creates the container):
docker run -d --name redis-stack -p 6379:6379 redis/redis-stack-server:latest
# Every subsequent session (container already exists):
docker start redis-stackThat's it — the container exposes Redis on localhost:6379 and the
server will find it automatically. Re-running the docker run command
after the first install produces Conflict. The container name "/redis-stack" is already in use; use docker start redis-stack
thereafter.
2. Install the package
From PyPI (recommended):
pip install n3memorycore-mcp-liteOr zero-install via uvx (the Claude Code plugin uses this path):
uvx --from n3memorycore-mcp-lite n3mc-workingmemoryFrom source (if you want to edit the code):
git clone https://github.com/NeuralNexusNote/n3mcmcp-lite
cd n3mcmcp-lite
pip install -e .The first run downloads the ~400 MB embedding model from Hugging Face
into the standard ~/.cache/huggingface/ directory.
First install requires internet access to three resources:
github.com — when
/plugin marketplace add NeuralNexusNote/n3mcmcp-literegisters the plugin (skip this step if you install viauvxor from source instead).pypi.org — when
uvx --from n3memorycore-mcp-lite(orpip install) resolves the package.huggingface.co — when the server first starts and downloads
intfloat/multilingual-e5-base(~400 MB) into~/.cache/huggingface/.All three fail with explicit, time-bounded errors when offline; none hang. Subsequent starts use only the local cache and require no internet.
Configure a client
Claude Desktop (and the "Code" tab inside Claude Desktop)
If you are using the Claude Desktop application — including its
built-in Code tab — configure MCP via the desktop config file, NOT
via .mcp.json (which is only read by the standalone claude CLI).
Add to ~/Library/Application Support/Claude/claude_desktop_config.json
(macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"n3mc-workingmemory": {
"command": "n3mc-workingmemory",
"args": []
}
}
}Windows tip: if Claude Desktop fails to spawn the server with the
bare command name above (the hammer/tool icon never appears), replace
"command" with the absolute path to the installed .exe, for example:
"command": "C:\\Users\\<YOU>\\AppData\\Local\\Programs\\Python\\Python312\\Scripts\\n3mc-workingmemory.exe"Run where n3mc-workingmemory in a terminal to find the exact path on
your machine.
After editing the config, fully quit Claude Desktop — closing the window is not enough. Right-click the Claude icon in the system tray (or use Task Manager) and terminate every Claude process, then relaunch.
Claude Code (standalone CLI)
This section applies ONLY to the claude command-line tool, not to the
Claude Desktop "Code" tab (see above for that).
.mcp.json is already included in this repository. Clone the repo,
install the package, and the Claude Code CLI connects automatically — no
manual configuration needed.
For other projects, add the following to that project's .mcp.json:
{
"mcpServers": {
"n3mc-workingmemory": {
"type": "stdio",
"command": "n3mc-workingmemory",
"args": []
}
}
}Auto-approve tool calls (Claude Code only)
By default, Claude Code prompts the user for each MCP tool call. For a
fully automatic memory loop — so the connected AI never blocks on an
"Allow?" prompt — the n3mc-workingmemory tools must be listed under
permissions.allow in Claude Code settings.
Plugin install auto-configures this — when you install via
/plugin install n3mc-workingmemory@neuralnexusnote, a SessionStart
hook runs hooks/install_permissions.py
which idempotently adds the six mcp__n3mc-workingmemory__* tools to
~/.claude/settings.json. No manual editing needed. The hook only
writes if at least one entry is missing and never touches unrelated
fields. The hooks.json command tries python → py (Windows Python
Launcher) → python3 in a || fallback chain, so the hook works as
long as any one of these is on PATH. It only exits non-zero —
surfacing in Claude Code's /plugins Errors tab — when all three
are missing, avoiding silent failure.
The same hook also performs a uvx pre-flight check — the plugin
manifest launches the MCP server via
uvx --from n3memorycore-mcp-lite n3mc-workingmemory, so a missing
uvx would otherwise surface only as an opaque ENOENT in the MCP
launcher. The hook calls shutil.which("uvx") and, if not found,
writes a bilingual install hint to stderr (pipx install uv,
curl -LsSf https://astral.sh/uv/install.sh | sh, plus the docs URL)
so the user sees an actionable message in the /plugins Errors tab.
The hook still exits 0 because the permission install itself
succeeded.
If you installed without the plugin (e.g. claude mcp add or a
manual .mcp.json), or no Python interpreter is available at all, add
the block below manually to ~/.claude/settings.json (user-global,
recommended) or .claude/settings.json (per-project):
{
"permissions": {
"allow": [
"mcp__n3mc-workingmemory__search_memory",
"mcp__n3mc-workingmemory__save_memory",
"mcp__n3mc-workingmemory__list_memories",
"mcp__n3mc-workingmemory__delete_memory",
"mcp__n3mc-workingmemory__delete_memories_by_session",
"mcp__n3mc-workingmemory__repair_memory"
]
}
}Without this, every save_memory / search_memory call surfaces an
approval prompt and the AI blocks if the user is away. Claude Desktop
has no per-tool permission gate, so this step is not needed there.
Data location
The Lite build does not store a database on disk — memories live in
Redis and expire automatically. Only a small config.json sits in the
platform-standard user data directory:
OS | Path |
Windows |
|
macOS |
|
Linux |
|
Override with the N3MC_DATA_DIR environment variable.
Configuration
On first run, config.json is auto-generated with random UUIDs for
owner_id and local_id. Editable defaults:
{
"owner_id": "<uuid>",
"local_id": "<uuid>",
"redis_url": "redis://localhost:6379/0",
"ttl_seconds": 604800,
"dedup_threshold": 0.95,
"half_life_days": 3,
"bm25_min_threshold": 0.1,
"search_result_limit": 20,
"context_char_limit": 3000,
"min_score": 0.2,
"search_query_max_chars": 2000,
"chunk_threshold": 400,
"chunk_overlap": 100,
"access_count_enabled": true,
"access_count_weight": 0.02,
"access_count_max_boost": 0.5,
"ttl_refresh_on_search": true,
"ttl_refresh_top_k": 5,
"lexical_rerank_enabled": true,
"rerank_weight": 0.3,
"rerank_phrase_weight": 0.2,
"b_session_match": 1.0,
"b_session_mismatch": 0.6,
"skip_code_blocks": false
}redis_url— connection URL;N3MC_REDIS_URLenv var takes precedence.ttl_seconds— TTL on every new memory and sha-guard (default 7 d).chunk_threshold/chunk_overlap— sliding-window size and overlap (chars). Bodies longer than the threshold trigger the parent-document + chunks path for verbatim recall.access_count_*— access-frequency auto-importance; top-K search hits receive a capped boost on future queries.ttl_refresh_on_search/ttl_refresh_top_k— TTL reset for the top-K hits on each search (reset-only; no extension past a fresh save).lexical_rerank_*/rerank_weight/rerank_phrase_weight— lightweight post-fusion lexical reranker (CPU-only).b_session_match/b_session_mismatch— multiplicative ranking boost for rows whose storedsession_idmatches (default1.0) vs. rows from other projects (0.6). Pass the samesession_idtosave_memoryandsearch_memoryto surface a project's memories above unrelated cross-project rows in the same Redis instance. Set both to1.0to disable the bias.skip_code_blocks— whentrue,save_memoryrejects any payload containing a triple-backtick fence (```) and returnsstatus: "skipped_code". Defaultfalse. Set totrueif you want FastAPI-era N3MemoryCore-style code exclusion (keep code out of the memory index entirely — useful when your workflow already has git/IDE history for code and you only want prose decisions/plans in Redis).
See the spec §6 for the complete field-by-field reference.
Multilingual support
Built-in, CPU-only, no LLM and no GPU required. Search and dedup behave the same regardless of how the user types the same word:
Layer | What it does | Real-world example |
NFKC normalization | Folds compatibility forms before SHA / embedding / BM25 |
|
Bigram BM25 side channel | Overlapping bigrams emitted for space-less scripts |
|
Diacritic fold | Latin/Greek/Cyrillic words also indexed without combining marks |
|
multilingual-e5-base embedding | Multilingual semantic space across 100+ languages | Cross-language paraphrase retrieval |
These run automatically on every save_memory and search_memory call.
The raw content field is never rewritten — verbatim recall (spec §3.11)
still returns the original bytes byte-for-byte.
Encoding safety
Two layers of defense run before any tool body executes (spec §3.13). Same guards as the Free build, ported one-to-one:
stdio UTF-8 reconfigure — at module import,
sys.stdin/sys.stdout/sys.stderrare switched toencoding="utf-8". On Windows-Japanese hosts the default console code page is cp932, which would otherwise mangle every non-ASCII byte on the MCP JSON-RPC channel. POSIX systems are already UTF-8, so the call is a safe no-op.Lone-surrogate sanitization — every
save_memory.contentandsearch_memory.queryis passed throughsanitize_surrogates()before any.encode("utf-8")call. Lone UTF-16 surrogate halves (U+D800–U+DFFF) appear when Windows subprocess pipes deliver UTF-8 bytes that Python's decoder maps witherrors="surrogateescape"— they round-trip throughjson.loadsbut raiseUnicodeEncodeErrorat SHA1 / Redis HSET / embedding time. Without the guard the entire write is silently lost. The function is recursive so JSON payloads with surrogates buried inside are cleaned in one pass.
If a save payload consists entirely of surrogates, sanitization collapses
it to the empty string and the regular empty-content rejection path
applies — {"status":"error","saved":false,"reason":"empty content"}.
Ranking formula
final_score = (0.7 * cosine_similarity + 0.3 * keyword_relevance) * time_decay * b_local * b_session
time_decay = 2 ^ (-days_elapsed / half_life_days) (default half-life: 3 days)
b_local = clamp(0.5, 2.0, stored_importance + access_boost)
access_boost = min(0.5, access_count * 0.02)
b_session = b_session_match (default 1.0) if row.session_id == effective_session
= b_session_mismatch (default 0.6) otherwiseWith a default 3-day half-life (shorter than the 7-day TTL), time_decay
is meaningful in the Lite build: a fresh memory scores 1.0, a 3-day-old
one exactly 0.5, and a 7-day-old (near-expiry) entry ≈ 0.20 — pushing
recent context ahead in the ranking.
Auto-importance (access-frequency boost): each time search_memory
returns a memory in its top 5 hits, that memory's access_count is
incremented by 1 and b_local rises by 0.02 on future queries (capped at
+0.5). No LLM judgement required — frequently-useful memories naturally
float to the top through CPU-only self-tuning.
Development
# Start Redis Stack first (see Prerequisites), then:
pip install -e ".[dev]"
pytest tests/ -qTests target Redis DB index 0 (configurable via N3MC_REDIS_TEST_URL)
and FLUSHDB it before/after each test. RediSearch refuses to create
indexes outside DB 0 (Cannot create index on db != 0), so a separate
test DB isn't an option — run the test suite against a dedicated
Redis container, never one that holds data you care about. Tests refuse
to run if Redis isn't reachable.
Extending the Lite build
If you want to modify behavior (change the ranking formula, drop in a cross-encoder reranker, plug in a Japanese morphological tokenizer, etc.), start from the design spec shipped in this repository:
N3MemoryCore_MCP_Spec_EN.md— full design document (English)N3MemoryCore_MCP_Spec_JP.md— 日本語版
Appendix A of the spec lists optional extensions (cross-encoder reranker, save-time chunking, HyDE, Japanese morphological analysis) with drop-in points and library candidates. Use it as reference when you want to edit the code without breaking the TTL, dedup, or RediSearch contracts.
Why N3MemoryCore? (vs. built-in memory)
The auto-save reliability of N3MemoryCore is no better than the memory features built into modern LLM products (e.g. Claude's built-in memory) — both depend on the LLM voluntarily calling a save tool, and both share the non-determinism described in On compliance below. The differentiation sits elsewhere:
Aspect | Built-in memory | N3MemoryCore (Lite) |
Data ownership | Vendor-hosted | Your own Redis Stack on your machine |
Client surface | The vendor's product only | Any MCP-compliant client (Claude Code, Cursor, Cline, Goose, your own app) |
Multi-AI collaboration | One AI's memory |
|
Verbatim recall | Opaque (may be summarized) | Parent-document contract — byte-exact full text returned |
Search internals | Black box | Hybrid BM25 + e5 vectors + CJK bigram + time decay + lightweight reranker, all parameters visible and tunable |
Inspect / control | UI only |
|
Persistence | Tied to the vendor's service lifetime | In-memory Redis with 7-day TTL — short-lived by design, but you own the container; pair with any persistent memory backend for long-term storage |
Tunability | Fixed |
|
So the value of running N3MemoryCore Lite is not "more reliable
auto-save" — it is owning a transparent, multi-client working-memory
layer that several AIs can collaborate on under a shared session_id,
where search behaviour is editable and verbatim recall is contractually
guaranteed. (For long-term, persistent storage of user-invested artifacts,
pair it with any persistent memory backend.)
If those properties matter to your workflow, Lite earns its keep. If you only need "the LLM remembers something across sessions" inside one vendor's product, the built-in memory is simpler.
On compliance — MCP can persuade, not force
This server cannot make the LLM call its tools. The MCP protocol gives a server only three persuasion levers:
Tool descriptions in
tools/list— visible to the LLM on every turn.The
instructionsfield sent at session start — usually surfaced to the LLM as a system-level hint.Tool response text — read by the LLM when it does call a tool.
We use all three: tool descriptions are explicit, instructions lays out a
rule set, and search_memory / save_memory responses end with short
reminders that re-anchor the auto-save discipline mid-turn. Even with all
of that, whether the LLM follows through is non-deterministic.
Compliance depends on the model's tool-calling bias, the MCP client's
prompt construction (some clients summarize or drop the instructions
field), and competing instructions from the user prompt, CLAUDE.md, etc.
In practice: most turns will auto-save correctly, but some won't — especially short answers, fact-correction turns, or turns where the LLM is heavily focused on the user's question. If a fact you wanted saved is missing next session, just say "save this" — the server is still ready to take it.
When you need a guaranteed save
Within the MCP framing, three paths bypass this non-determinism:
Path 1 — ask the LLM explicitly in your prompt (operational workaround, immediate). Write "save this to N3MemoryCore" or "record this in memory" into your prompt. LLMs almost always honour explicit user requests. Pros: zero infrastructure, works today, works with every MCP client. Cons: cognitive load — you must remember to say it; not automatic.
Hook-based full-transcript saving
Path 2 — Claude Code hook that saves the full transcript (Claude Code
only, deterministic). Claude Code exposes harness-level hooks (Stop,
etc.) that the harness runs deterministically — they do not depend on the
LLM remembering anything. Setup is one prompt to Claude Code:
"After every turn, automatically save the full Claude Code transcript to Lite."
Claude Code then provisions:
A script at
~/.claude/hooks/save_transcript.pythat readstranscript_pathfrom hook input, importsn3mc_mcp.database.Databasedirectly, and callssave_memoryon the Lite DB (no MCP round-trip).A
hooks.Stopblock in~/.claude/settings.jsonthat runs the script after every assistant turn withasync: true(so model load never blocks the UI).
Behavioral notes:
Claude can never accidentally skip a save — the harness fires the hook regardless of what the LLM does.
No MCP round-trip overhead; the hook talks to Redis directly.
As a session grows, the per-turn transcripts collide via near-duplicate detection (
dedup_threshold), so the DB stays close to one entry per session instead of one per turn.Transcripts shorter than ~200 chars are skipped as noise.
Pros: deterministic / independent of model behavior / no save anxiety.
Cons: Claude Code only (Cursor / Windsurf need a different approach) / the hook process loads the embedding model each turn (async, so no UI block, but there is CPU/IO cost) / Lite's 7-day TTL still applies, so transcripts saved this way still expire within a week — point the same hook at any persistent memory backend when long-term retention matters.
Path 3 — bypass MCP and call the first-party Anthropic Messages API
yourself (architecture change). Step outside MCP clients (Claude Code,
etc.) and drive messages.create tool_use directly from your own
application code; you can then fire save_memory deterministically every
turn regardless of what the LLM "decided" to do. Pros: deterministic /
works with any model and any client. Cons: you have to write the
orchestration application.
The convenience of "MCP + LLM handles it for me" and the guarantee of "every turn saves" sit at opposite ends of a tradeoff. This server packs its persuasion levers as hard as the protocol allows; any stronger guarantee is your call as the user or client implementer (and if you're on Claude Code, Path 2 is by far the lowest-cost option).
Forking & contributing
This repository is public and Apache-2.0 licensed — fork, modify, and run it freely. The fork-and-run path is:
git clone https://github.com/<YOU>/n3mcmcp-lite
cd n3mcmcp-lite
docker run -d --name redis-stack -p 6379:6379 redis/redis-stack-server:latest
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\Activate.ps1
pip install -e ".[dev]"
pytest tests/ -q # 105 tests, ~30s warmCI runs the same matrix on every push and PR — see
.github/workflows/test.yml. Read
CONTRIBUTING.md for the full developer guide
(EN + JP) including coding conventions, the spec-as-contract policy,
and PR checklist.
To actually use the fork from Claude Code, you do NOT need any
additional setup beyond the pip install -e ".[dev]" above:
The
n3mc-workingmemorycommand is now on yourPATH(runwhich n3mc-workingmemoryto confirm).The repository's
.mcp.jsonalready declares the server, so the moment youcd n3mcmcp-lite && claude, the CLI auto-connects.For other client surfaces (Claude Desktop, a different project's
.mcp.json, auto-tool-approval), the Quickstart Step 3 table lists the exact action.
If you intend to publish your fork under a new package name, also
edit the name, [project.urls], and console-script names in
pyproject.toml before re-uploading to PyPI.
Troubleshooting
Windows: pip install --upgrade fails with WinError 32 (file in use)
Symptom:
ERROR: Could not install packages due to an OSError: [WinError 32]
The process cannot access the file because it is being used by another process:
'...\Scripts\n3mc-workingmemory.exe' -> '...\Scripts\n3mc-workingmemory.exe.deleteme'Cause: an MCP client (Claude Code / Claude Desktop) is currently holding
n3mc-workingmemory.exe open as a child process, so pip cannot replace
the binary.
Fix — pick one:
Fully quit the MCP client first. Closing the window is not enough on Windows. Open Task Manager and end every
claude/n3mc-workingmemory.exe/python.exeprocess whose command line includesn3mc-workingmemory, then re-runpip install --upgrade.Use
uvxinstead of a global install —uvx --from n3memorycore-mcp-lite n3mc-workingmemoryruns in an isolated ephemeral environment per session, so there is no system-level.exeto lock.
This is a Windows file-locking quirk, not a packaging defect — the wheel
itself installs cleanly into a fresh venv (python -m venv .venv && .venv/Scripts/pip install n3memorycore-mcp-lite).
~3memorycore-mcp-lite warnings during pip install
If you see lines like:
WARNING: Ignoring invalid distribution ~3memorycore-mcp-litethat is pip flagging a previous install that was interrupted mid-write
(typically by the file-lock issue above). The leftover directory is
named with a leading ~ and is harmless but noisy. Delete it manually:
# Windows
rmdir /s "%LOCALAPPDATA%\Programs\Python\Python312\Lib\site-packages\~3memorycore_mcp_lite-1.5.0.dist-info"(Adjust the path to match your Python installation.)
License
Apache License 2.0 — see LICENSE.
MCP Registry: mcp-name: io.github.NeuralNexusNote/n3mc-workingmemory
Available Tools
7 toolsdelete_memories_by_sessionA
Delete every memory (singles, parent docs, child chunks, sha guards) whose session_id matches. Scoped to the configured owner. Use this to wrap up a finished project or reset a polluted session before TTL expiry. IRREVERSIBLE — confirm session_id with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | session_id whose memories should be removed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description carries full burden. It discloses deletion scope, irreversibility, and scope to configured owner. Lacks auth notification or rate limits, but irreversibility is well-stressed.
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?
Four sentences with no waste. Each sentence contributes: what is deleted, when to use, warning. Front-loaded with action.
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 single-parameter tool with no output schema, description covers purpose, usage, and behavioral caveats. Could mention return value or error handling, but overall sufficient.
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 parameter description is basic. Description adds meaning by linking session_id to deletion of all associated memories and scoping to owner, enhancing understanding beyond 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 the verb 'delete', the resource 'every memory (singles, parent docs, child chunks, sha guards)', and the scope 'session_id' and 'owner'. Distinguishes from sibling 'delete_memory' by specifying bulk deletion per session.
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?
Provides explicit use cases: 'wrap up a finished project' or 'reset a polluted session'. Includes a strong warning to confirm session_id. Could improve by explicitly contrasting with single memory deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_memoryA
Delete a memory by ID. If the ID is a parent document (doc:), cascades to all child chunks.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Memory ID or parent document ID to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully handles transparency. It discloses the cascading behavior for parent document IDs, which is critical. However, it does not mention permanence or confirmations, though this is acceptable for a simple deletion.
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, no wasted words, front-loaded with the core action.
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?
The description covers the essential behavior for a one-parameter tool with no output schema. It could mention the return value, but this is not critical for an agent to use the tool correctly.
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 100% and the description adds meaning beyond the schema: it explains the ID format (doc:<uuid>) and the cascading effect, which is not in 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 action ('delete') and resource ('memory'), and distinguishes from siblings like 'delete_memories_by_session' by specifying deletion by ID. It also adds unique behavior (cascading for parent documents).
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 explains when to use the tool (delete by ID) and mentions cascading, but does not explicitly state when not to use or provide alternative tools like 'delete_memories_by_session' for session-based deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_memoriesA
List stored memories newest first. Parent documents shown with [doc×N] tag.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description provides moderate transparency by stating the ordering (newest first) and a display behavior (parent document tag). However, it omits details like pagination, default limit behavior beyond schema, 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?
Two concise sentences, front-loaded with the core purpose, and no unnecessary words. Every sentence adds value.
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 simplicity (1 optional parameter, no output schema, no annotations), the description covers key behaviors (order and parent document display). However, it could be more complete by briefly noting the default limit or response structure, but it is sufficient for a basic list 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?
With 100% schema description coverage for the single parameter 'limit', the description adds no additional meaning beyond the schema. The baseline is 3, and the description merely repeats the schema's implication without elaboration.
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), the resource (stored memories), the order (newest first), and a display detail (parent documents with [doc×N] tag), effectively distinguishing it from siblings like search_memory which implies filtered retrieval.
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 given on when to use this tool versus alternatives like search_memory or save_memory. The description only states what it does without any when-to-use or when-not-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recall_threadA
§4.3.1 — Retrieve the memories sharing a turn_id plus N entries before and after in chronological order. Use this when a search_memory hit lacks enough context: pass the hit's turn_id here to surface the surrounding conversation thread. Returns {status:'not_found'} if turn_id is unknown.
| Name | Required | Description | Default |
|---|---|---|---|
| turn_id | Yes | The turn_id from a search_memory result. | |
| before | No | Number of earlier entries to include (default 2). | |
| after | No | Number of later entries to include (default 2). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses the retrieval behavior (chronological order), the error case (returns {status:'not_found'}), and the before/after parameters. It does not mention authentication or rate limits, but for a read-only retrieval tool, this is sufficient.
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?
Three sentences with no wasted words. The first sentence states the core action, the second gives usage context, and the third describes the return behavior. Information is front-loaded and efficiently presented.
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 output schema, the description adequately describes the return format and error case. It covers the behavior of the parameters and provides a clear use case. No hidden behaviors remain unexplained.
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 100%, but the description adds value by explaining the turn_id parameter's origin ('from a search_memory result') and contextualizing the before/after defaults within the narrative. This goes beyond the schema alone.
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 retrieves a thread of memories around a turn_id in chronological order, and explicitly distinguishes its use from search_memory by providing a specific use case ('when a search_memory hit lacks enough context').
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 when-to-use guidance ('Use this when a search_memory hit lacks enough context') and specifies the input (turn_id from a search_memory result). It does not explicitly list when not to use or alternative tools, but the sibling tools help the agent infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repair_memoryB
Re-ensure the RediSearch index (idempotent). Returns {status, message}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description only mentions idempotency and return format. Missing disclosure of potential time consumption, side effects on other operations, or error conditions. For a repair tool, more detail is expected.
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 covering core purpose, idempotency, and return value. Efficient but could benefit from a bit more specificity on what 're-ensure' means operationally.
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?
Description covers basic function and return but lacks context on when/why to invoke this tool. Given no output schema and no annotations, it is minimally adequate for a simple repair operation but not comprehensive.
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 in input schema, so description naturally adds no parameter details. Per guidelines, baseline is 4 for zero-parameter tools. The description is sufficient.
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 re-ensures the RediSearch index and notes idempotency. The verb 're-ensure' is somewhat ambiguous but generally conveys a repair/maintenance action. It distinguishes from siblings which are CRUD operations on memories.
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 delete_memory or search_memory. It lacks context such as prerequisites or typical use cases (e.g., after index corruption).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_memoryA
Save a memory entry (Lite: 7-day TTL). Auto-deduplicates exact and near-duplicate content. Long content (>chunk_threshold chars) is chunked with a parent-document for verbatim recall.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Memory content to save. | |
| agent_name | No | Agent display name (e.g. 'claude-code'). | |
| owner_id | No | Owner UUID override (must match server config). | |
| importance | No | Importance weight 0.5–2.0 (default 1.0). | |
| session_id | No | Optional project/task grouping key. Stored on the row and used as: (a) the ranking key for search_memory's b_session boost (match=1.0 / mismatch=0.6), and (b) the filter for delete_memories_by_session. Pass the same value across all calls for one project. Leave blank to use the server default (N3MC_SESSION_ID env var, or per-process UUIDv4). | |
| turn_id | No | §4.3.1 — Optional turn grouping label. Tag all memories saved within one conversation turn with the same turn_id. Enables recall_thread to surface the surrounding context later. Any non-empty string works; a short UUID, timestamp, or 'turn-N' format is recommended. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses TTL ('Lite: 7-day TTL'), auto-deduplication, and chunking behavior. Lacks information on idempotency, overwrite behavior, or error handling, which would improve transparency.
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?
Description is three sentences with zero waste. First sentence states primary purpose, followed by concise coverage of key behaviors (TTL, dedup, chunking). 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?
No output schema, so description could explain return values. It covers tool behavior (TTL, dedup, chunking) but lacks information on what is returned (e.g., memory ID, success status). Adequate but not fully 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 100% with detailed parameter descriptions. The tool description adds overall context (e.g., chunking, dedup) but does not significantly enhance parameter meaning beyond the schema. Baseline 3 is appropriate.
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 'Save a memory entry' with specific verb and resource. It distinguishes from sibling tools (delete, list, recall, repair, search) by focusing on creation/insertion.
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?
Description does not explicitly state when to use this tool versus alternatives. It implies usage for saving memories but lacks when-not or alternative context. Sibling tool names suggest distinct purposes, but no guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_memoryA
Hybrid (vector + BM25) search over stored memories. Call this at the start of every user turn. NOTE: Lite memories expire 7d after they were saved.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query (natural language or keywords). | |
| limit | No | Max results (default: config search_result_limit). | |
| session_id | No | Optional project/task grouping key. Rows whose stored session_id matches this value are boosted in ranking (b_session_match=1.0); non-matching rows are dampened (b_session_mismatch=0.6). Pass the same session_id used at save time to surface that project's memories above unrelated rows. Leave blank to use the server default (N3MC_SESSION_ID env var, or per-process UUIDv4). | |
| since | No | §4.3.1 — ISO 8601 date or datetime (e.g. '2026-05-01' or '2026-05-01T09:00:00Z'). Only entries saved ON OR AFTER this timestamp are returned. Date-only values are treated as 00:00:00 UTC. | |
| until | No | §4.3.1 — ISO 8601 date or datetime. Only entries saved ON OR BEFORE this timestamp are returned. Date-only values are treated as 23:59:59 UTC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the hybrid search method and the 7-day expiration for lite memories. No annotations exist, so the description carries the burden; it does not explicitly state read-only or non-destructive nature, but 'search' implies it.
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 sentences with no wasted words. The purpose and usage guideline are front-loaded, making it 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?
No output schema is provided, but the description does not explain what the tool returns (e.g., relevance scores, memory content). This leaves a significant information gap for the 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 coverage is 100%, so the schema already describes all 5 parameters in detail. The description adds no additional parameter meaning beyond what is in 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 it performs a 'Hybrid (vector + BM25) search over stored memories', which is specific and distinct from sibling tools like save_memory or delete_memory.
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?
Explicitly instructs to 'Call this at the start of every user turn', providing strong usage guidance. However, it does not mention when not to use it or explicitly compare to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a distinct purpose: bulk delete, single delete, list, context recall, index repair, save, and search. No two tools overlap in functionality.
All tool names follow a verb_noun pattern (e.g., save_memory, delete_memory). Even 'recall_thread' and 'delete_memories_by_session' adhere to this convention with minor additions, maintaining consistency.
With 7 tools covering create, read (list/search), delete (single/bulk), context recall, and maintenance, the count is well-scoped for a Lite ephemeral memory server.
The set covers save, list, search, delete, and context recall, but lacks a direct get-by-ID tool. While search can retrieve memories, the absence of a dedicated fetch tool is a notable gap.
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
Persistent personal memory for AI assistants — save, search, and recall across every MCP client.
Private persistent memory for Claude, ChatGPT & Gemini via MCP - semantic search, zero-code setup.
Persistent memory for AI agents — log and recall conversation context over MCP.
Persistent memory for AI assistants. Save once; recall from Claude, ChatGPT, or any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenancePersistent memory MCP server that captures coding session context and automatically injects relevant memories into prompts using hybrid search for OpenCode and Claude Code.64MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI coding agents to retrieve and manage code context with hybrid search, project memory, and observability via MCP tools.29MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server for managing persistent AI memory using hybrid search (keyword + semantic vector) with SQLite storage and offline-first local embeddings.
- AlicenseAqualityDmaintenanceProvides persistent memory with semantic search for MCP-based AI agents, enabling them to store and recall information across sessions using vector embeddings.41MIT
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/NeuralNexusNote/n3mcmcp-lite'
If you have feedback or need assistance with the MCP directory API, please join our Discord server