coolmem
v1.0.2
Published
Cross-Agent Memory Fabric — a privacy-first MCP server for shared AI memory with local vector embeddings.
Readme
🧠 coolmem — Cross-Agent Memory Fabric
A privacy-first MCP server that lets different AI agents (Cursor, Claude Desktop, etc.) share a persistent Knowledge Ledger — powered by local vector embeddings and SQLite.
No API keys. No data leaves your machine.
Architecture at a Glance
Agent A (Cursor) Agent B (Claude)
│ │
│ store_memory(content, cat) │ search_memories(query)
▼ ▼
┌────────────── MCP stdio ─────────────────┐
│ coolmem server │
│ ┌────────────────────────────────────────┐ │
│ │ @xenova/transformers │ │
│ │ all-MiniLM-L6-v2 (384-dim, local CPU) │ │
│ └────────────────┬───────────────────────┘ │
│ │ embed() │
│ ┌────────────────▼───────────────────────┐ │
│ │ SQLite (coolmem.db) │ │
│ │ Memory { id, content, category, │ │
│ │ embedding JSON, createdAt } │ │
│ └────────────────────────────────────────┘ │
└─────────────────────────────────────────────┘Quick Start
# 1. Install dependencies
npm install
# 2. Generate Prisma client + create the SQLite DB
npx prisma generate
npx prisma db push
# 3. Build
npm run build
# 4. Run (for manual testing)
node dist/index.jsThe server communicates over stdio — you don't call it directly. Hook it into Claude Desktop or Cursor via the config below.
Connecting to Claude Desktop
Open (or create) your claude_desktop_config.json:
- macOS / Linux:
~/.config/claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Add the following block (adjust the path to match where you cloned this repo):
{
"mcpServers": {
"coolmem": {
"command": "node",
"args": ["C:/Users/Dell/Desktop/YCU/coolmem/dist/index.js"],
"env": {
"DATABASE_URL": "file:C:/Users/Dell/Desktop/YCU/coolmem/coolmem.db"
}
}
}
}Tip: After editing the config, restart Claude Desktop. You should see
coolmemappear in the Connected Servers list.
Connecting to Cursor
In Cursor → Settings → MCP → Add New MCP Server:
| Field | Value |
|---------|------------------------------------------------------------|
| Name | coolmem |
| Command | node |
| Args | C:/Users/Dell/Desktop/YCU/coolmem/dist/index.js |
| Env | DATABASE_URL=file:C:/Users/Dell/Desktop/YCU/coolmem/coolmem.db |
Available MCP Primitives
🔧 Tool: store_memory
Store a lesson learned, architectural decision, or any project knowledge.
| Parameter | Type | Description |
|------------|--------|------------------------------------------------------|
| content | string | The knowledge text to persist |
| category | string | Label: architecture, bug-fix, decision, etc. |
Example agent prompt:
Use the
store_memorytool. content: "We switched from REST to tRPC because it eliminates manual type duplication between client and server." category: "architecture"
🔧 Tool: search_memories
Semantically search the ledger with a natural-language query.
| Parameter | Type | Description |
|-----------|--------|-------------------------------|
| query | string | What you want to know about |
Returns the top 3 most relevant memories with cosine-similarity scores.
Example agent prompt:
Use
search_memories. query: "Why did we change our API layer?"
📄 Resource: project_timeline
URI: memory://coolmem/timeline
A chronological list of the last 10 things the agents stored — useful for onboarding a fresh agent to the current state of a project.
Project Structure
coolmem/
├── src/
│ ├── index.ts # MCP server — tools & resource definitions
│ ├── embeddings.ts # @xenova/transformers wrapper (lazy singleton)
│ ├── similarity.ts # Cosine similarity function
│ └── db.ts # Prisma client singleton
├── prisma/
│ └── schema.prisma # Memory model → SQLite
├── dist/ # Compiled output (git-ignored)
├── models/ # Cached model weights (auto-downloaded, git-ignored)
├── coolmem.db # SQLite database (git-ignored)
├── .env # DATABASE_URL
├── package.json
└── tsconfig.jsonFirst-Run Note on Model Download
On the very first call to either tool, @xenova/transformers will download
all-MiniLM-L6-v2 (~22 MB) into the ./models/ folder. Subsequent calls use
the cached weights instantly. This is a one-time cost.
Extending This Server
| Want to add… | How |
|-------------------------------|------------------------------------------------------------------|
| Delete a memory | Add a delete_memory(id) tool via server.tool() |
| List memories by category | Add a list_memories(category) tool |
| More search results | Change .slice(0, 3) to .slice(0, N) in index.ts |
| Faster vector search at scale | Swap the JS cosine loop for sqlite-vss or usearch |
| Different model | Change MODEL_NAME in embeddings.ts |
