MemMCP
Provides a persistent storage layer with write-ahead logging and Merkle-root signatures for data integrity.
Formats responses in XML using defensive RAG formatting to mitigate prompt injection attacks.
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., "@MemMCPstore the fact that Paris is the capital of France"
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.
π€ The Problem with Agentic Memory
When dozens of autonomous agents operate in parallel, standard vector memory stores break down:
Race conditions: Simultaneous writes cause index corruption.
Data duplication: Agents save the same observations repeatedly, polluting context windows.
Context hallucination: Lexical keywords are ignored in favor of vague semantic matches.
Related MCP server: agent-memory
π‘ The MemMCP Solution
MemMCP is a lightweight, zero-latency, local memory daemon. It runs silently over STDIO via the Model Context Protocol, offering a robust engine that guarantees:
ACID-Compliant State: Backed by SQLite in Write-Ahead Log (WAL) mode.
Deduplication Gate: Uses Bloom-Filter idempotency tracking to drop duplicate records before vectorization.
Hybrid RRF Retrieval: Blends FAISS vector search with SQLite FTS5 lexical keyword matching under Reciprocal Rank Fusion (RRF).
β‘ Quick Start
Prerequisites
Python 3.11+
uv (recommended for package management) or standard pip
1. Clone & Install
git clone https://github.com/axtontc/MemMCP.git
cd MemMCP
# Sync virtual environment using uv (fastest)
uv sync
# Or using pip
python -m venv .venv
.venv/Scripts/activate # On Windows
source .venv/bin/activate # On Linux/macOS
pip install .2. Verify with the Test Suite
Ensure everything is working correctly:
# Run unit tests
uv run python -m pytest tests/test_memmcp.py -v
# Run E2E STDIO integration tests
uv run python tests/e2e_test.pyπ MCP Integration (Cursor & Claude)
MemMCP integrates seamlessly into MCP-compatible editors and clients like Cursor or Claude Desktop.
1. Claude Desktop Config
Add the following to your claude_desktop_config.json (located at %APPDATA%\Claude\claude_desktop_config.json on Windows or ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"memmcp": {
"command": "uv",
"args": [
"--directory",
"C:/absolute/path/to/MemMCP",
"run",
"python",
"src/server.py"
],
"env": {
"MEMMCP_DB_PATH": "C:/absolute/path/to/memmcp.db",
"MEMMCP_LOG_PATH": "C:/absolute/path/to/memory_wal.log"
}
}
}
}2. Cursor IDE Config
Navigate to Settings β Features β MCP.
Click + Add New MCP Server.
Fill out the dialog:
Name:
memmcpType:
commandCommand:
uv --directory "C:/path/to/MemMCP" run python src/server.py
Click Save.
π Architecture
graph TD
A[MCP Client / Agent] --> B{Bloom-Filter Idempotency}
B -->|Duplicate Request| C[Fast Return / Drop]
B -->|New Request| D[SentenceTransformer Vectorizer]
D --> E[FAISS Vector Matching]
D --> F[SQLite FTS5 Keyword Match]
E & F --> G[Reciprocal Rank Fusion RRF]
G --> H[SQLite WAL Transaction Ledger]
H --> I[XML-Bounded RAG Output]
I --> J[MCP Response]
style A fill:#1a1a2e,stroke:#0969DA,color:#fff
style B fill:#16213e,stroke:#0969DA,color:#fff
style E fill:#0f3460,stroke:#2ea043,color:#fff
style F fill:#0f3460,stroke:#2ea043,color:#fff
style G fill:#1a1a2e,stroke:#F5A800,color:#fff
style H fill:#1a1a2e,stroke:#F5A800,color:#fffKey Subsystems
Module | File | Responsibility |
MCP Server |
| Exposes standard stdio transport, handles incoming JSON-RPC tool calls. |
Database Manager |
| Transaction safe SQLite WAL ledger with thread-safe write loop. |
Hybrid Retriever |
| FAISS CPU vector index synced with SQLite FTS5 full-text indexing. |
Context Pruner |
| Trims redundant tokens from search context to optimize LLM input boundaries. |
π MCP Tool Reference
MemMCP automatically registers the following tools with the connected LLM:
store_memory
Saves a single string memory block.
Arguments:
content(string, required): The memory string to store.idempotency_key(string, optional): A unique key to prevent duplicate writes.
Returns: A confirmation string containing the generated unique memory ID.
store_memories_batch
Stores multiple memories atomically in a single transaction, rebuilding the vector index only once at the end of the batch.
Arguments:
memories(array of strings, required): List of memory strings to insert.
Returns: A JSON array of generated memory IDs.
recall_memories
Retrieves memories matching a search query using Reciprocal Rank Fusion.
Arguments:
query(string, required): The search text.limit(integer, optional): Maximum number of memories to return (default: 5).
Returns: A JSON array of matching records containing ID, content, and scores.
π API & Core Functions Reference
src/database.py
These functions manage SQLite connection states, memory inserts, and migrations:
Function / Routine | Parameters | Description |
|
| Initializes the SQLite database, executes migration scripts, and enables WAL mode. |
|
| Inserts a raw memory record into the table and updates the FTS5 search index. |
|
| Deletes a memory record by its primary key. |
src/retrieval.py
These functions run queries against the semantic and keyword indices:
Function / Routine | Parameters | Description |
|
| Runs semantic and lexical search, blends results via Reciprocal Rank Fusion, and returns top nodes. |
| None | Reads all table records, recomputes vector embeddings, and serializes the FAISS index. |
π Comparison
Metric / Capability | Pinecone / Cloud Vector | FAISS-only | MemMCP |
Offline First (Zero-Network) | β | β | β |
Deduplication Handling | β (Manual) | β (Manual) | β (Bloom Gate) |
ACID Transaction Safety | β οΈ Eventual | β None | β (SQLite WAL) |
Hybrid Keyword Search | β οΈ Partial | β (Vector only) | β (RRF + FTS5) |
MCP Out-of-the-box | β | β | β |
Average Query Latency |
|
|
|
π§° Tech Stack
Language: Python 3.11+
Vector Search: FAISS CPU
Embeddings:
sentence-transformers(all-MiniLM-L6-v2)Database: SQLite 3 (WAL mode + FTS5 full-text extension)
Dev tools: pytest, pytest-asyncio, Ruff, mypy
πΊοΈ Roadmap
SentencesTransformer semantic vector indexing
Full-Text-Search FTS5 keyword matching
Deduplication gate with Bloom filters
Reciprocal Rank Fusion (RRF) blending algorithm
Distributed Replication β Sync memory states across swarm nodes using Raft consensus
Multi-tenant Spaces β Provide isolated user space environments and custom credentials keys
Timeline Visualizer Dashboard β Open-source local dashboard showing memories timeline maps
π€ Contributing & Security
Contributions are welcome! Please read our Contributing Guide and Code of Conduct before submitting pull requests.
For reporting security vulnerabilities, please refer to SECURITY.md.
π Related Projects
MemMCP belongs to a suite of interconnected AI agent utilities:
Project | Description |
Zero-latency cross-process UI automation for Windows and Web | |
Monolithic API gateway and orchestrator for local LLMs | |
MCP-compatible low-latency registry for 6,000+ agent skills | |
Mathematically optimal state-machine agent swarm orchestration | |
Memory daemon and compactor for Antigravity swarms | |
PostgreSQL hybrid memory system for large enterprise swarms |
π License
This project is licensed under the Apache License, Version 2.0. See the LICENSE file for details. Copyright (c) 2026 Axton Carroll.
Available Tools
3 toolsrecall_memoriesA
Recall relevant memories using hybrid search (semantic similarity + keyword search).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | The maximum number of memories to return. | |
| query | Yes | The search query to match against memories. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It adds value by revealing the hybrid search method (semantic + keyword), which is not obvious from the name alone. However, it does not disclose potential behaviors such as result ordering, handling of the limit parameter, or any side effects. For a read-only search tool this is acceptable but not comprehensive.
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 immediately states the core function and search method. It is front-loaded and free of unnecessary words or repetition.
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 search tool with two well-described parameters, the description adequately explains what the tool does and how it works. It does not describe the return format or ordering, but the absence of an output schema and the simplicity of the operation make this a minor gap. The description is sufficient for basic 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 coverage is 100%, with clear descriptions for both 'query' and 'limit'. The tool description does not add any extra meaning beyond the schema, but it does not need to since the schema already documents each parameter effectively. Baseline 3 applies.
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 function: 'Recall relevant memories using hybrid search (semantic similarity + keyword search).' The verb 'recall' and resource 'memories' are specific, and the hybrid search method is explicitly mentioned. This distinguishes it from sibling tools (store_memory and store_memories_batch) which are clearly for writing, not reading.
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 clear context for when to use the tool: it is for retrieving relevant memories. While it does not explicitly exclude alternatives, the sibling tools are all storage operations, making the recall tool's purpose obvious. No conflicts or competing search tools are present, so the implied usage is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
store_memories_batchA
Store multiple memories atomically in a single transaction, then rebuild the index once.
| Name | Required | Description | Default |
|---|---|---|---|
| memories | Yes | A list of memories, each containing 'content', and optional 'idempotency_key' and 'metadata'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and discloses meaningful behaviors: atomic transaction (all-or-nothing) and index rebuild once. It does not cover error handling or permissions, but the atomicity and performance details are valuable beyond the basic store action.
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?
A single sentence conveys the action, the atomic behavior, and the index-rebuild side effect. No wasted words; it is front-loaded and easy 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?
For a simple batch storage tool with one parameter and no output schema, the description covers the core purpose and key behavioral traits. It does not explain return values, but that is not required given the absence of an output schema and the straightforward nature of the operation.
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 the 'memories' parameter fully detailed as an array of objects with content, metadata, and idempotency_key. The description adds no extra parameter semantics, so it relies on the schema, which is adequate.
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 ('Store multiple memories'), the resource ('memories'), and the batch nature ('multiple'). It distinguishes from sibling tools by emphasizing atomicity and the batch scope, unlike store_memory (single) and recall_memories (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?
The description gives clear context: use when storing multiple memories and when atomicity matters. It does not explicitly name alternatives or exclusions, but the batch-focused phrasing implies when it should be used over store_memory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
store_memoryA
Store a single memory, automatically generating unique keys and updating indices.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | The text content of the memory to store. | |
| metadata | No | Optional structured metadata dictionary. | |
| idempotency_key | No | Optional unique key to prevent duplicate storage. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses useful behaviors ('automatically generating unique keys and updating indices') but does not explain idempotency handling, return values, or potential side effects like overwrites. This is partial transparency, not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that conveys the core action, scope, and key behaviors without unnecessary filler. Every phrase contributes value, making it highly concise and well-structured.
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?
There is no output schema, and the description does not mention return values or error conditions. It covers key generation and index updates but omits details about idempotency key usage and batch alternative. For a simple tool this is adequate but has gaps, so a mid-range score is warranted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for all three parameters with descriptions. The description adds minimal extra meaning; it mentions auto key generation but does not directly connect it to the idempotency_key parameter. Baseline 3 is appropriate as the schema handles parameter 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 'Store a single memory' uses a specific verb and resource, clearly indicating a single-item write operation. It also distinguishes this tool from siblings like recall_memories (retrieval) and store_memories_batch (batch storage) by explicitly stating 'single 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?
The description implies usage for a single memory but does not explicitly contrast it with the batch sibling or mention when not to use it. It lacks explicit alternatives or exclusions, so guidance is only implied rather than clearly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
The three tools are clearly distinct: recall_memories retrieves, store_memory stores a single item, and store_memories_batch stores multiple items atomically. The batch variant is clearly differentiated from the single-store tool by its transactional and batched nature.
All tool names follow a consistent verb_noun pattern: recall_memories, store_memory, store_memories_batch. The verbs are clear and the nouns are consistent, with the batch variant appropriately qualified.
With only 3 tools, the set is tightly scoped for a memory server. Each tool serves a distinct core operation (recall, store single, store batch) without unnecessary bloat, making the count appropriate for its stated purpose.
The server covers the essential store and recall operations, including an efficient batch store. However, it lacks explicit delete or update capabilities, which could be considered a minor gap for a complete memory lifecycle, though not critical for basic use.
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
An MCP memory server. One memory your agents share β across models, devices and apps.
Cloud-hosted MCP server for durable AI memory
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Persistent memory for AI agents β log and recall conversation context over MCP.
Related MCP Servers
- AlicenseAqualityCmaintenanceA local, fully-offline MCP memory server that enables persistent storage and retrieval of information using SQLite with both keyword and semantic vector search capabilities.102312MIT
- AlicenseNot gradedqualityDmaintenanceMCP server providing persistent memory management for AI agents using SQLite and FTS5, enabling storage, full-text search, and recall of memories with namespace isolation.1MIT
- AlicenseNot gradedqualityDmaintenanceA SQLite-backed MCP memory server providing persistent memory storage with full-text search and knowledge graph capabilities for AI assistants.60MIT
- AlicenseNot gradedqualityDmaintenanceA local-first MCP server for persistent memory with vector search, metadata filtering, fact tracking, and graceful degradation when dependencies fail.31MIT
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/axtontc/MemMCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server