Skip to main content
Glama
README.md
# Local Memory MCP Server

A local-first MCP server that gives AI agents shared, durable memory through
hybrid semantic search, SQLite FTS5, and a knowledge graph—without Docker or a
required cloud service.

![Local Memory MCP demo](docs/image.png)

## Why use it?

- **Shared across agents:** one SQLite database can serve Codex, Claude,
  desktop clients, IDE integrations, and custom MCP clients.
- **Hybrid recall:** when `sqlite-vec` is available, local
  `all-MiniLM-L6-v2` embeddings and FTS5 keyword evidence are merged. FTS
  remains available as the explicit fallback.
- **Temporal recall:** search natural-language periods such as `last week` or
  `in 2025`, or pass an explicit ISO `startDate` and `endDate`.
- **Adaptive ranking:** relevance, time-decayed importance, tags, and bounded
  recent familiarity work together without rewriting importance on every
  recall.
- **Auditable lifecycle:** memories can be reinforced, marked outdated or
  incorrect, restored, exported, or forgotten.
- **Structured context:** entities, relations, observations, conversations,
  tasks, and todos live beside free-form memories.
- **Local by default:** memory data stays in your configured SQLite file.
  Optional LLM features send input only to the `OLLAMA_URL` you configure.

For every option and tool, see the
[extended guide](docs/extended-guide.md).

## Requirements

- Node.js 22 or newer on a supported LTS release.
- Python and C++ build tools when `better-sqlite3` has no matching prebuild.
- Windows users can install **Desktop development with C++** through Visual
  Studio Build Tools.

Windows ARM64 semantic search is supported by a bundled, checksum-verified
`sqlite-vec` v0.1.9 DLL. WSL2 remains a supported alternative.

## Quick start

Add the published package to an MCP client:

```json
{
  "mcpServers": {
    "memory": {
      "command": "npx",
      "args": ["-y", "@beledarian/mcp-local-memory@2"],
      "env": {
        "ARCHIVIST_STRATEGY": "nlp"
      }
    }
  }
}
```

The default database is `~/.memory/memory.db`. The first semantic recall may
download the local embedding model.

Global installation provides both `memory` and `mcp-local-memory`:

```bash
npm install -g @beledarian/mcp-local-memory@2
memory --help
```

From source:

```bash
git clone https://github.com/Beledarian/mcp-local-memory.git
cd mcp-local-memory
npm install
npm run build
npm start
```

See the [Codex + WSL2 setup](docs/extended-guide.md#codex--wsl2) when the
database or server runs inside Linux.

## Remote Server & Docker Deployment (SSE)

`mcp-local-memory` supports native **HTTP/SSE transport** for centralized setups across multiple workstations, laptops, Tailnets, or VPS instances:

```bash
# Run standalone SSE server on port 8320 with optional Bearer token auth:
node dist/index.js --transport sse --port 8320 --token "your-secret-token"

# Or run via Docker Compose:
docker compose up -d
```

Configure your remote MCP client (`mcp_config.json`):

```json
{
  "mcpServers": {
    "memory": {
      "url": "https://your-server.ts.net:8320/sse",
      "headers": {
        "Authorization": "Bearer your-secret-token"
      }
    }
  }
}
```

## Essential configuration

| Variable | Default | Purpose |
| :--- | :--- | :--- |
| `MEMORY_DB_PATH` | `~/.memory/memory.db` | SQLite database location. |
| `MCP_TRANSPORT` | `stdio` | `stdio` (default) or `sse` (remote HTTP/SSE server). |
| `PORT` / `MCP_PORT` | `8320` | HTTP port when running in SSE mode. |
| `MCP_AUTH_TOKEN` | unset | Optional Bearer token for remote SSE authentication. |
| `ARCHIVIST_STRATEGY` | `nlp` | `passive`, `nlp`, `llm`, or a comma-separated combination. |
| `OLLAMA_URL` | `http://localhost:11434/api/generate` | Optional LLM generation endpoint. |
| `MEMORY_SEMANTIC_WEIGHT` | `0.9` | Retrieval relevance versus decayed importance. |
| `MEMORY_MIN_RELEVANCE` | `0.55` | Minimum relevance required before a candidate can be returned. |
| `MEMORY_RECALL_FAMILIARITY_MAX_BOOST` | `0.03` | Maximum temporary familiarity contribution; `0` disables future recording and scoring but does not purge existing rows. |
| `MEMORY_RECALL_FAMILIARITY_WINDOW_DAYS` | `30` | Recent exposure window. |
| `USE_WORKER` | `false` | Run archivist processing in a worker while retaining durable acknowledgement. |
| `EXTENSIONS_PATH` | unset | Directory containing opt-in JavaScript extensions. |

All scoring, context, archivist, task, and extension variables are documented
in the [configuration reference](docs/extended-guide.md#configuration).

## How recall works

`recall` supports both topical and temporal questions:

- Semantic vector and FTS5 keyword candidates are retrieved independently and
  merged, so an exact term is not hidden by a semantic result.
- Natural-language dates such as `yesterday`, `last week`, and `in 2025` are
  recognized in the query. ISO `startDate` and `endDate` filters are also
  available.
- Weak matches are omitted, near-duplicates are collapsed, and outdated or
  incorrect memories stay hidden unless explicitly requested.
- Relevant results are ranked using retrieval evidence, query coverage, tags,
  time-decayed importance, and a small recent-familiarity signal.
- Each returned active memory can record one familiarity exposure per
  normalized-query hash and UTC day. The contribution is temporary and bounded
  to `0.03` by default; it does not rewrite importance or refresh decay.

`reinforce_memory` provides the stronger, durable feedback path:

- `used` or `important` record positive evidence.
- `irrelevant` lowers importance.
- `incorrect` or `outdated` suppresses the memory without deleting history.
- `restore` returns a suppressed memory to active recall.

The [extended scoring guide](docs/extended-guide.md#hybrid-recall-scoring)
documents the formula, thresholds, deduplication, privacy limits, decay, and
every familiarity control.

## Entities, relations, and the graph

Free-form memories and structured knowledge complement each other:

- **Entities** represent people, projects, places, topics, or other named
  concepts. Each has a type, importance, and appendable observations.
- **Relations** are directional triples such as
  `Project A --[uses]--> SQLite`. Creating a relation also creates any missing
  endpoint as an `Unknown` entity.
- **Automatic extraction** can identify entities and relations while saving a
  fact. Use `ARCHIVIST_STRATEGY=nlp` for local extraction, `llm` for the
  configured Ollama endpoint, or `passive` for manual graph maintenance.
- **Graph exploration** can return an overview or a centered one- or two-hop
  neighborhood with entity observations, relations, and related memories.
- **Graph maintenance** supports renaming or deleting entities, removing exact
  observations, and deleting individual relations. Entity renames update
  connected relations.
- **Clustering** groups semantically related memories and entities into topic
  overviews when embeddings are available.

Use `recall` for ranked free-form retrieval and `read_graph` when connections
between named concepts matter. They are complementary views of the same local
knowledge base.

## MCP surface

| Area | Tools and resources |
| :--- | :--- |
| Memory | `remember_fact`, `remember_facts`, `recall`, `reinforce_memory`, `list_recent_memories`, `forget`, `export_memories` |
| Graph | `create_entity`, `update_entity`, `delete_entity`, `create_relation`, `delete_relation`, `delete_observation`, `read_graph`, `cluster_memories` |
| Conversations | `init_conversation`, `add_task`, `update_task_status`, `list_tasks`, `delete_task` |
| Todos | `add_todo`, `complete_todo`, `list_todos` |
| Optional extraction | `consolidate_context` when `ENABLE_CONSOLIDATE_TOOL=true` |
| Resources | `memory://current-context`, `memory://turn-context`, task and todo resources |

See the [complete tool reference](docs/extended-guide.md#tools-for-agents) for
arguments and lifecycle behavior.

## Upgrading safely

When upgrading from 1.x:

- move to Node.js 22;
- back up `MEMORY_DB_PATH`;
- expect automatic additive schema migration;
- note that `MEMORY_SEMANTIC_WEIGHT` now means relevance versus importance;
- recall no longer raises importance or refreshes decay;
- run importance normalization only if you want to reset historical passive
  popularity.

The project does not claim crash-proof, zero-loss migration under every
interruption scenario, so a verified backup remains the safety boundary.

Older releases passively increased `importance` and `access_count` during
recall. Preview normalization before changing anything:

```bash
npm run normalize:importance -- --db ~/.memory/memory.db
```

Applying normalization is optional and requires an explicit, non-existing
backup path. See the
[migration and normalization guide](docs/extended-guide.md#one-time-importance-normalization).

## Documentation

- [Extended installation, configuration, and operations](docs/extended-guide.md)
- [Short agent instructions](docs/example_instructions.md)
- [Comprehensive agent prompt](docs/detailed_prompt.md)
- [Changelog](CHANGELOG.md)
- [Test and smoke-probe guide](tests/README.md)
- [Windows ARM64 sqlite-vec provenance](vendor/sqlite-vec/README.md)

## Development

These commands require a source checkout:

```bash
npm install
npm run build
npm test
```

`npm test` covers scoring, schema migration, lifecycle and familiarity,
privacy/provenance, MCP contracts, packaging, and native vector or FTS fallback.

## License

MIT