Memoria

Memoria

A self-hosted memory backend for MCP clients, providing tools for storing, searching, updating, and deleting memories with per-user scoping and OIDC support.

Category
Visit Server

README

Memoria

CI Bandit OSV-Scanner Trivy SonarCloud License: MIT Python 3.11+

The missing self-hosted memory backend for MCP clients.

Community-maintained MCP server for mem0 OSS.

If you like mem0 but need it in MCP clients today, Memoria closes that gap:

  • 🌐 Streamable HTTP MCP endpoint
  • πŸ‘€ Per-user memory scoping for trusted internal deployments
  • 🐳 Drop-in Docker setup with Qdrant
  • πŸ•ΈοΈ Optional graph memory via Memgraph

Why this project exists: there is no official MCP server in mem0 OSS that you can run as a standalone service in your stack. Memoria gives you that bridge now.

✨ What You Get

  • MCP tools for storing, searching, updating, and deleting memory
  • OIDC bearer token auth (Keycloak-compatible) with per-user scoping from token claims
  • Ownership checks for ID-based read/update/delete operations
  • Health endpoint with Qdrant, Memgraph, LLM, and embedder dependency checks
  • mem0-backed memory with pluggable LLM/embedder providers
  • Optional graph relations support when graph mode is enabled

πŸš€ Quickstart (Docker, Recommended)

# Copy .env.example to .env and put rotated provider keys there first
docker compose up -d --build

# Optional: start bundled Keycloak profile for local OIDC
docker compose --profile oidc up -d keycloak

Available endpoints:

  • MCP: http://localhost:8080/mcp
  • Health: http://localhost:8080/health
  • Memgraph Lab UI: http://localhost:3000

🐍 Quickstart (Local Python)

python -m pip install -e .[dev]
python -m memoria

Defaults:

  • MCP: http://0.0.0.0:8080/mcp
  • Health: http://0.0.0.0:8080/health

πŸ”Œ Connect from an MCP Client

OIDC mode

{
  "mcpServers": {
    "memoria": {
      "type": "streamable-http",
      "url": "http://localhost:8080/mcp",
      "headers": {
        "authorization": "Bearer <access_token>"
      }
    }
  }
}

Without a bearer token, requests are rejected.

For local Keycloak profile, issuer is http://localhost:18081/realms/memoria.

OAuth metadata layout, the fact that /oauth/register does not persist dynamic client registration, loopback redirect constraints, RS256/Keycloak assumptions, and other auth details are documented in docs/auth.md.

local mode

This is the default for local development. In local mode Memoria skips client authentication entirely and scopes all tools to a fixed configured user id (MEMORIA_LOCAL_USER_ID, default local-user).

{
  "mcpServers": {
    "memoria": {
      "type": "streamable-http",
      "url": "http://localhost:8080/mcp"
    }
  }
}

stub_auth mode

Use this only behind a trusted auth proxy or during migration. In this mode the client passes user identity via x-user-id instead of a bearer token.

{
  "mcpServers": {
    "memoria": {
      "type": "streamable-http",
      "url": "http://localhost:8080/mcp",
      "headers": {
        "x-user-id": "alice"
      }
    }
  }
}

πŸ›‘οΈ Security Boundary

In oidc mode, identity is derived from validated JWT claims (sub by default).

In local mode, Memoria does not authenticate the client and always uses MEMORIA_LOCAL_USER_ID. Use it only for local development.

stub_auth mode remains available for migration only. In this mode x-user-id is an identity input, not authentication, and should be used only behind a trusted auth proxy/gateway.

Local Keycloak realm note:

  • deploy/keycloak/realm.json includes a memoria-e2e client with direct access grants enabled for local-test only automation.
  • Production realm imports should remove that client or disable direct access grants.

🧰 MCP Tools

All tools are scoped to the current user identity from the bearer token, the configured local user id, or the x-user-id header depending on auth mode.

Tool Required args What it does Returns
add_memory text Stores a new memory. If messages is omitted, the server wraps text into a single user message. mem0 add response for the created memory item(s)
search_memories query Runs semantic search over the current user's memories. Supports limit, filters, threshold, and rerank. mem0 search response with matching results
get_memory memory_id Returns one memory by ID if it belongs to the current user. single memory object or null
get_memories none Lists memories for the current user. Supports limit and filters. mem0 list response with memory items
update_memory memory_id, data Updates the text payload of an existing memory owned by the current user. mem0 update response
delete_memory memory_id Deletes one memory owned by the current user. mem0 delete response
delete_all_memories none Deletes all memories for the current user scope. mem0 bulk delete response
list_entities none Returns graph relations from mem0 when graph mode is enabled. Supports limit. { user_id, relations, supported, detail }
delete_entities none Deletes entities for the current user. In mem0 OSS this is mapped to delete_all_memories. { user_id, detail, result }

πŸ—οΈ Architecture

Memoria is intentionally simple:

MCP client -> FastMCP server -> mem0 -> Qdrant
                                  |
                                  +-> Memgraph (optional graph memory)

That keeps the deployment easy to reason about and straightforward to self-host.

βš™οΈ Configuration

Start from .env.example. Most local setups only need auth mode, provider keys, and either the default Docker services or a reachable Qdrant/LLM/embedder stack.

Server and auth

Var Default Required Description
MEMORIA_HOST 0.0.0.0 no Bind host for the HTTP server
MEMORIA_PORT 8080 no Bind port for the HTTP server
MEMORIA_MCP_PATH /mcp no MCP endpoint path
MEMORIA_PUBLIC_BASE_URL http://localhost:8080 no Public base URL used in advertised MCP/OAuth metadata
MEMORIA_AUTH_MODE local no Auth mode: local, stub_auth, or oidc
MEMORIA_LOCAL_USER_ID local-user no Fixed user id used in local mode
MEMORIA_USER_HEADER_NAME x-user-id no Identity header used in stub_auth mode
MEMORIA_OIDC_ISSUER_URL none in oidc mode Expected token issuer and default upstream OIDC issuer
MEMORIA_OIDC_PUBLIC_ISSUER_URL none no Browser-facing issuer for advertised OAuth endpoints
MEMORIA_OIDC_JWKS_URL none no Optional internal JWKS URL for server-side verification
MEMORIA_OIDC_AUDIENCE none in oidc mode Expected access token audience
MEMORIA_OIDC_SUBJECT_CLAIM sub no Claim used as the per-user identity
MEMORIA_OIDC_REQUIRED_SCOPES none no Optional space-separated scopes enforced by the verifier
MEMORIA_OIDC_JWKS_CACHE_TTL_SECONDS 300 no JWKS cache TTL in seconds
MEMORIA_LOG_LEVEL INFO no Application log level

Qdrant

Var Default Required Description
MEMORIA_QDRANT_HOST qdrant no Qdrant host when not using a full URL
MEMORIA_QDRANT_PORT 6333 no Qdrant port when not using a full URL
MEMORIA_QDRANT_URL none no Full Qdrant URL; overrides host/port mode
MEMORIA_QDRANT_API_KEY none no API key for managed Qdrant deployments
MEMORIA_QDRANT_COLLECTION_NAME mem0 no Collection name used by mem0
MEMORIA_QDRANT_EMBEDDING_DIMS 1536 no Embedding dimension size for the collection
MEMORIA_QDRANT_ON_DISK false no Enables on-disk Qdrant storage mode

mem0, LLM, and embedder

Var Default Required Description
MEMORIA_MEM0_VERSION v1.1 no mem0 API/config version passed to the SDK
MEMORIA_MEM0_HISTORY_DB_PATH ./data/mem0_history.db no Local history DB path used by mem0
MEMORIA_MEM0_LLM_PROVIDER vllm no LLM provider passed to mem0
MEMORIA_MEM0_LLM_MODEL gpt-4o-mini no LLM model name
MEMORIA_MEM0_LLM_BASE_URL empty no Optional base URL override for the LLM provider
MEMORIA_MEM0_LLM_API_KEY dummy no LLM API key; local OpenAI-compatible stacks can use any non-empty value
MEMORIA_MEM0_EMBEDDER_PROVIDER openai no Embedder provider passed to mem0
MEMORIA_MEM0_EMBEDDER_MODEL text-embedding-3-small no Embedder model name
MEMORIA_MEM0_EMBEDDER_BASE_URL empty no Optional base URL override for the embedder provider
MEMORIA_MEM0_EMBEDDER_API_KEY dummy no Embedder API key; local compatible stacks can use any non-empty value

Optional graph mode

Var Default Required Description
MEMORIA_MEM0_ENABLE_GRAPH false no Enables graph memory support in mem0
MEMORIA_MEM0_GRAPH_PROVIDER memgraph no Graph provider name
MEMORIA_MEM0_GRAPH_URL bolt://memgraph:7687 when graph enabled Memgraph connection URL
MEMORIA_MEM0_GRAPH_USERNAME memgraph when graph enabled Memgraph username
MEMORIA_MEM0_GRAPH_PASSWORD memgraph when graph enabled Memgraph password

βœ… Quality & Tests

Quality checks:

python -m ruff check .
python -m mypy src

Unit tests:

python -m pytest -q tests/unit --cov=src/memoria --cov-report=term-missing

E2E tests (Docker + Testcontainers):

RUN_E2E=1 python -m pytest -q tests/e2e

<details> <summary>PowerShell</summary>

$env:RUN_E2E='1'
python -m pytest -q tests/e2e

</details>

πŸ“ Positioning and Scope

  • This project is community-maintained.
  • It is focused on practical integration and fast self-hosting.
  • It does not claim affiliation with mem0.

🧭 Roadmap

  • Planned role/scope-based authorization for MCP tools with read/write/admin separation
  • Planned production deployment presets, including Docker hardening and Kubernetes Helm charts
  • Planned observability package with structured logs, Prometheus metrics, and tracing
  • Planned integration examples for additional MCP clients and providers

πŸ“„ License

MIT

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured