mnemon-mcp
mnemon-mcp
AI 에이전트를 위한 영구 계층형 메모리. 로컬 우선. 클라우드 제로. 단일 SQLite 파일.
AI 에이전트는 세션이 끝나면 모든 것을 잊어버립니다. Mnemon이 이를 해결합니다.
MCP 호환 클라이언트 — OpenClaw, Claude Code, Cursor, Windsurf, 또는 직접 만든 클라이언트 — 에게 단일 SQLite 데이터베이스로 백업된 구조화된 장기 메모리를 제공합니다. API 키도, 클라우드도, 텔레메트리도 없습니다. 그저 npm install만 하면 에이전트가 기억합니다.
계층형 메모리가 필요한 이유는?
평면적인 키-값 저장소는 "어제 일어난 일"과 "테스트 없이 커밋하지 말 것"을 동일하게 취급합니다. 이는 잘못된 것입니다. 서로 다른 종류의 지식은 서로 다른 수명과 접근 패턴을 갖습니다.
Mnemon은 메모리를 네 가지 계층으로 구성합니다:
계층 | 저장 내용 | 접근 방식 | 수명 |
에피소드 | 사건, 세션, 일지 항목 | 날짜 또는 기간별 | 감쇠 (30일 반감기) |
의미론 | 사실, 선호도, 관계 | 주제 또는 개체별 | 안정적 |
절차 | 규칙, 워크플로우, 관례 | 시작 시 로드 | 거의 변경되지 않음 |
리소스 | 참고 자료, 책 노트 | 요청 시 | 느리게 감쇠 (90일) |
지난 화요일의 일지 항목과 절대 변하지 않는 코딩 규칙은 서로 다른 계층에 저장됩니다. 그래야 하기 때문입니다.
Related MCP server: persistent-kb-mcp
검색 품질
검색은 실제 MCP 서버를 통해 797개 메모리로 구성된 실제 이중 언어(RU/EN) 코퍼스에서 50개 사례의 골든 세트로 측정됩니다. 재구현이 아닙니다. 현재 수치 (방법론 및 이력):
지표 | FTS 전용 | 벡터 전용 | 하이브리드 (RRF) |
종합 점수 | 88.9 | 89.2 | 91.7 |
Recall@5 | 0.907 | 0.898 | 0.919 |
MRR | 0.817 | 0.832 | 0.878 |
nDCG@5 | 0.816 | 0.828 | 0.869 |
부정 정밀도 | 1.000 | 1.000 | 1.000 |
하이브리드는 두 개별 다리를 모두 능가합니다. 이것이 융합의 핵심 논거입니다. 어휘 검색은 더 나은 원시 재현율을, 벡터 검색은 더 나은 순위를 제공하며, RRF는 평균화로 잃지 않고 둘 다 유지합니다.
평가 문서는 실패 사례도 추적합니다. 코퍼스 성장에 따른 점수 변동, 평가가 잡아낸 BM25 필드 가중치 버그, 융합이 여전히 순수 어휘 검색에 지는 두 가지 사례, 그리고 골든 세트가 다루지 않는 내용. 감사할 수 없는 숫자는 마케팅일 뿐입니다. 이 숫자가 어떻게 생성되는지 읽어보세요.
아키텍처
flowchart LR
C["MCP client<br/>Claude Code · Cursor · …"] -- "stdio / HTTP" --> T["10 tools · 4 resources · 3 prompts"]
T --> R["retrieval pipeline<br/>FTS5 · vector · RRF fusion"]
T --> M["memories + supersede chains"]
I["KB import pipeline<br/>markdown → memories"] --> M
M -- triggers --> F["FTS5 index (stemmed EN+RU)"]
R --> F
R --> V["sqlite-vec (optional, BYOK)"]단일 SQLite 파일이 메모리, FTS5 인덱스, 선택적 벡터 인덱스를 보유합니다. 쓰기는 대체 체인 불변성을 유지하는 트랜잭션을 통해 이루어지며, 읽기는 검색에서 설명하는 단계적 검색 파이프라인을 실행합니다.
전체 그림 — 모듈 경계, 쓰기/읽기 경로, 불변성, 알려진 제한 사항 — 은 docs/ARCHITECTURE.md에 있습니다. 설계 결정은 ADR로 기록됩니다: SQLite+FTS5 코어, 하이브리드 RRF 검색, 동기 드라이버, 계층형 메모리 모델.
빠른 시작
설치
npm install -g mnemon-mcp또는 소스에서:
git clone https://github.com/nikitacometa/mnemon-memory-mcp.git
cd mnemon-memory-mcp && npm install && npm run buildMCP 클라이언트 구성
openclaw mcp register mnemon-mcp --command="mnemon-mcp"또는 ~/.openclaw/mcp_config.json에 추가:
{
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}~/.claude/mcp.json에 추가:
{
"mcpServers": {
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}
}클라이언트의 MCP 구성에 추가:
{
"mcpServers": {
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}
}컴파일된 진입점의 전체 경로를 사용하세요:
{
"mnemon-mcp": {
"command": "node",
"args": ["/absolute/path/to/mnemon-mcp/dist/index.js"]
}
}확인
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | mnemon-mcp응답에 10개의 도구가 표시되어야 합니다. 데이터베이스(~/.mnemon-mcp/memory.db)는 첫 실행 시 자동으로 생성됩니다.
이제 끝입니다. 에이전트에 영구 메모리가 생겼습니다.
할 수 있는 일
10가지 MCP 도구
도구 | 기능 |
| 계층, 개체, 신뢰도, 중요도, 선택적 TTL과 함께 메모리 저장 |
| 계층, 개체, 날짜, 범위, 신뢰도로 필터링된 전체 텍스트 또는 정확한 검색 |
| 제자리 업데이트 또는 버전이 지정된 대체(대체 체인) 생성 |
| 메모리 삭제; 이전 버전이 있으면 다시 활성화 |
| 계층 통계 가져오기 또는 단일 메모리의 버전 기록 추적 |
| 필터가 있는 JSON, Markdown 또는 Claude-md 형식으로 내보내기 |
| 진단 실행: 만료 항목, 고아 체인, 오래된 메모리; 선택적으로 GC |
| 에이전트 세션 시작 — 메모리 그룹화를 위한 세션 ID 반환 |
| 선택적 요약과 함께 세션 종료; 기간 및 메모리 수 반환 |
| 클라이언트, 프로젝트 또는 활성 상태로 필터링된 세션 목록 |
MCP 리소스 및 프롬프트
리소스 — 에이전트가 읽을 수 있는 실시간 데이터:
URI | 반환 |
| 계층별 집계 통계 |
| 지난 24시간 동안 생성/업데이트된 메모리 |
| 계층의 모든 활성 메모리 |
| 개체에 대한 모든 활성 메모리 |
프롬프트 — 사전 구축된 워크플로우:
프롬프트 | 목적 |
| "X에 대해 아는 모든 것을 말해줘" |
| 작업 시작 전 관련 컨텍스트 로드 |
| 구조화된 일지 항목 생성 |
검색
네 가지 모드, 모두 계층 / 개체 / 범위 / 날짜 / 신뢰도 필터 지원:
FTS 모드 (임베딩 없이 기본) — BM25 순위가 있는 토큰화된 전체 텍스트 검색. 다중 단어 쿼리는 AND를 사용합니다. 결과가 너무 적으면 OR이 점수 패널티로 보완합니다. 점진적 AND 완화는 전체 OR로 폴백하기 전에 가장 구체적인 상위 3개 용어를 시도합니다.
하이브리드 모드 (임베딩 구성 시 기본) — 상호 순위 융합을 통해 FTS5 + 벡터 검색 결합. 쿼리에서 따옴표로 묶인 개체(예: 'Essentialism')를 감지하고 교차 참조 검색을 위해 가중치가 적용된 하위 쿼리를 실행합니다.
벡터 모드 — 임베딩에 대한 순수 코사인 유사도 검색.
정확 모드 — 정확한 구문 조회를 위한 LIKE 부분 문자열 일치.
점수: bm25 × (0.3 + 0.7 × importance) × decay(layer) × recency
최신성 부스트: 1 / (1 + daysSince / 365) — 오래된 메모리를 불이익하지 않고 최근 생성된 메모리를 부드럽게 보상합니다.
형태소 분석
Snowball 형태소 분석기가 인덱스 시간과 쿼리 시간 모두에서 영어와 러시아어에 적용됩니다. 즉, "running"은 "runs"와 일치하고, "книги"는 "книга"와 일치합니다. 정밀도를 높이기 위해 쿼리에서 불용어가 필터링됩니다.
사실 버전 관리
지식은 진화합니다. Mnemon은 오래된 사실을 삭제하지 않고 체인으로 연결합니다:
v1: "Team uses React 17" → superseded_by: v2
v2: "Team uses React 19" → supersedes: v1 (active)검색은 최신 버전만 반환합니다. include_history: true가 있는 memory_inspect는 전체 체인을 보여줍니다. memory_delete는 이전 버전을 다시 활성화합니다. 아무것도 손실되지 않습니다.
벡터 검색 (선택 사항, BYOK)
자체 임베딩 API를 제공하여 의미론적 유사도 검색을 활성화하세요:
# OpenAI
MNEMON_EMBEDDING_PROVIDER=openai MNEMON_EMBEDDING_API_KEY=sk-... mnemon-mcp
# Ollama (local, free)
MNEMON_EMBEDDING_PROVIDER=ollama mnemon-mcp이렇게 하면 두 가지 추가 검색 모드가 열립니다:
mode: "vector"— 순수 코사인 유사도 검색mode: "hybrid"— 상호 순위 융합을 통한 FTS5 + 벡터 결합
sqlite-vec(선택적 종속성으로 설치) 필요. 새 메모리는 추가 시 임베딩되고, 기존 메모리는 백필할 수 있습니다.
변수 | 기본값 | 설명 |
| — |
|
| — | API 키 (OpenAI에 필요) |
|
| 모델 이름 |
|
| 벡터 차원 |
|
| Ollama 엔드포인트 |
지식 베이스 가져오기
Markdown 파일 폴더가 있나요? 일괄 가져오기:
cp config.example.json ~/.mnemon-mcp/config.json # edit this first
npm run import:kb -- --kb-path /path/to/your/kb # incremental (skips unchanged files)구성은 glob 패턴을 메모리 계층에 매핑합니다:
{
"owner_name": "your-name",
"extra_stop_words": [],
"mappings": [
{
"glob": "journal/*.md",
"layer": "episodic",
"entity_type": "user",
"entity_name": "$owner",
"importance": 0.6,
"split": "h2"
},
{
"glob": "people/*.md",
"layer": "semantic",
"entity_type": "person",
"entity_name": "from-heading",
"importance": 0.8,
"split": "h3"
}
]
}구성 필드
필드 | 유형 | 설명 |
| string | 사용자 이름 — |
| string[] | FTS 쿼리에서 필터링할 단어 (예: 이름 형태) |
| string | 일치시킬 파일 패턴 |
| string | 대상 메모리 계층 |
| string |
|
| string | 리터럴 이름, |
| string |
|
| number | 0.0–1.0, 검색 순위에 영향 |
| number | 0.0–1.0, 검색에서 필터링 가능 |
| string | 선택적 네임스페이스 |
HTTP 전송
원격 또는 다중 클라이언트 설정용:
MNEMON_AUTH_TOKEN=your-secret MNEMON_HOST=0.0.0.0 MNEMON_PORT=3000 npm run start:http엔드포인트 | 설명 |
| MCP JSON-RPC (토큰 설정 시 Bearer 인증) |
|
|
기본적으로 127.0.0.1에 바인딩됩니다. 다른 호스트에 바인딩하려면 MNEMON_AUTH_TOKEN이 필요합니다 — 서버는 인증 없이 메모리 저장소를 네트워크에 노출하지 않습니다(신뢰할 수 있는 네트워크에서 MNEMON_ALLOW_INSECURE_HTTP=1로 재정의 가능). 속도 제한(기본 IP당 분당 100 req), 선택적 CORS, 1MB 본문 제한, 타이밍 안전 인증, SIGTERM 시 정상 종료.
구성 참조
변수 | 기본값 | 설명 |
|
| 데이터베이스 경로 |
|
| 가져오기용 지식 베이스 루트 |
|
| 가져오기 구성 경로 |
| — | HTTP 전송용 Bearer 토큰 |
|
| HTTP 전송 바인딩 주소 |
|
| HTTP 전송 포트 |
| — | CORS |
|
| IP당 분당 최대 요청 수 (0 = 끔) |
도구 참조
파라미터 | 유형 | 필수 | 설명 |
| string | 예 | 메모리 텍스트 (최대 100K 문자) |
| string | 예 |
|
| string | 아니요 | 짧은 제목 (최대 500자) |
| string | 아니요 |
|
| string | 아니요 | 필터링용 엔티티 이름 |
| number | 아니요 | 0.0–1.0 (기본 0.8) |
| number | 아니요 | 0.0–1.0 (기본 0.5) |
| string | 아니요 | 네임스페이스 (기본 |
| string | 아니요 | 소스 파일 경로 — 일치하는 항목의 자동 대체(supersede) 트리거 |
| number | 아니요 | N일 후 자동 만료 |
| string | 아니요 | 시간적 사실 창 (ISO 8601) |
파라미터 | 유형 | 필수 | 설명 |
| string | 예 | 검색 텍스트 |
| string | 아니요 |
|
| string[] | 아니요 | 레이어별 필터 |
| string | 아니요 | 엔티티별 필터 (별칭 지원) |
| string | 아니요 | 범위별 필터 |
| string | 아니요 | 날짜 범위 (ISO 8601) |
| string | 아니요 | 시간적 사실 필터 — 이 날짜에 유효한 사실 |
| number | 아니요 | 최소 신뢰도 |
| number | 아니요 | 최소 중요도 |
| number | 아니요 | 최대 결과 수 (기본 10, 최대 100) |
| number | 아니요 | 페이지네이션 오프셋 |
파라미터 | 유형 | 필수 | 설명 |
| string | 예 | 메모리 ID |
| string | 아니요 | 새 내용 |
| string | 아니요 | 새 제목 |
| number | 아니요 | 새 신뢰도 |
| number | 아니요 | 새 중요도 |
| boolean | 아니요 |
|
| string | 아니요 | 대체 항목용 내용 |
파라미터 | 유형 | 필수 | 설명 |
| string | 예 | 메모리 ID. 대체 체인의 일부인 경우 이전 항목을 다시 활성화 |
파라미터 | 유형 | 필수 | 설명 |
| string | 아니요 | 메모리 ID (집계 통계는 생략) |
| string | 아니요 | 레이어별 통계 필터 |
| string | 아니요 | 엔티티별 통계 필터 |
| boolean | 아니요 | 대체 체인 표시 |
파라미터 | 유형 | 필수 | 설명 |
| string | 예 |
|
| string[] | 아니요 | 레이어별 필터 |
| string | 아니요 | 범위 필터 |
| string | 아니요 | 날짜 범위 |
| number | 아니요 | 최대 항목 수 (기본 전체, 최대 10K) |
파라미터 | 유형 | 필수 | 설명 |
| boolean | 아니요 |
|
반환: 상태 (healthy / warning / degraded), 레이어별 통계, 만료 항목, 고아 체인, 오래된/낮은 신뢰도 개수, cleanup=true 시 정리된 개수.
파라미터 | 유형 | 필수 | 설명 |
| string | 예 | 클라이언트 식별자 (예: |
| string | 아니요 | 이 세션의 프로젝트 범위 |
| object | 아니요 | 추가 세션 메타데이터 |
반환: id (세션 UUID), started_at (ISO 8601).
파라미터 | 유형 | 필수 | 설명 |
| string | 예 | 종료할 세션 ID |
| string | 아니요 | 수행한 작업 요약 (최대 10K 문자) |
반환: id, ended_at, duration_minutes, memories_count.
파라미터 | 유형 | 필수 | 설명 |
| number | 아니요 | 최대 세션 수 (기본 20, 최대 100) |
| string | 아니요 | 클라이언트별 필터 |
| string | 아니요 | 프로젝트별 필터 |
| boolean | 아니요 | 종료되지 않은 세션만 반환 (기본 false) |
반환: id, client, project, started_at, ended_at, summary, memories_count를 포함한 세션 배열.
다른 도구와의 비교
mnemon-mcp | mem0 | basic-memory | Engram | Anthropic KG | |
아키텍처 | SQLite FTS5 + vector | Cloud API + Qdrant | Markdown + vector | SQLite FTS5 | JSON file |
메모리 구조 | 4개 유형 레이어 | 플랫 | 플랫 | 플랫 + 세션 | 그래프 |
검색 | FTS5 + hybrid RRF | 시맨틱 | 하이브리드 | FTS5 | 정확 |
사실 버전 관리 | 대체 체인 | 부분 | 없음 | 없음 | 없음 |
어간 추출 | EN + RU (Snowball) | EN만 | EN만 | 없음 | 없음 |
임베딩 | BYOK (OpenAI / Ollama) | 내장 | FastEmbed | 없음 | 없음 |
의존성 | 필수 0개 | Qdrant, Neo4j | Python 3.12 | Go 바이너리 | 없음 |
클라우드 필요 | 아니요 | 예 | 아니요 | 아니요 | 아니요 |
비용 | 무료 | $19–249/월 | 무료 | 무료 | 무료 |
설정 |
| Docker + API 키 | pip + deps | Go 설치 | 내장 |
라이선스 | MIT | Apache 2.0 | AGPL | MIT | MIT |
출처가 포함된 확장 경쟁 분석: docs/COMPETITORS.md.
개발
npm run dev # run via tsx (no build step)
npm run build # TypeScript → dist/
npm run lint # eslint (flat config)
npm test # vitest — unit + integration + MCP dispatch + HTTP transport + hybrid RRF
npm run bench # performance benchmarks
npm run db:backup # backup databaseCI는 Node 20 및 22에서 빌드 + 린트 + 테스트를 실행한 다음, 실제 JSON-RPC를 통해 컴파일된 서버를 스모크 테스트합니다(tools/list는 정확한 도구 세트와 일치해야 함).
스택: TypeScript 5.9 (strict mode), better-sqlite3, @modelcontextprotocol/sdk, Snowball stemmer, Zod, vitest.
코드 지침은 CONTRIBUTING.md를 참조하세요.
설계 원칙
기본적으로 에어갭(air-gapped) — 텔레메트리는 절대 없습니다. 기본 상태에서는 어떤 것도 머신을 떠나지 않습니다. 네트워크와 통신하는 유일한 구성 요소는 선택적 임베더이며, 설정한 제공자(로컬 Ollama 포함)에게만 통신합니다.
단일 파일 — SQLite 데이터베이스 하나, 운영 부담 없음, 파일 복사로 즉시 백업.
결정적 검색 — 기본값은 임베딩이 아닌 FTS5입니다. 해석 가능하고 재현 가능하며 GPU가 필요 없습니다.
평면보다 구조화 — 레이어는 접근 패턴을 인코딩하고, 대체 체인은 시간을 인코딩합니다.
최소 — 프로덕션 의존성 4개. Node가 실행되는 모든 곳에서 작동합니다.
주장이 아닌 측정 — 검색 변경은 골든 세트로 판단되며, 회귀 포함.
라이선스
This server cannot be installed
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 Servers
- AlicenseNot gradedqualityCmaintenanceA local-first MCP memory server providing persistent, searchable memory for AI agents, powered by SQLite.51Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA local-first MCP server providing persistent, searchable knowledge base via SQLite, enabling AI agents to save and recall facts across sessions without cloud dependencies.MIT
- AlicenseNot gradedqualityDmaintenanceA local-first long-term memory system for AI coding agents, exposed as an MCP server.131MIT
- AlicenseAqualityCmaintenancePersistent memory MCP server for AI agents, using SQLite with hybrid keyword and semantic search for long-term memory storage.5Do What The F*ck You Want To Public
Related MCP Connectors
Person-owned, portable AI memory as a remote MCP server, readable and writable by any MCP client.
Cloud-hosted MCP server for durable AI memory
Shared, governed long-term memory for AI agents across tools and sessions via MCP and REST.
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/nikitacometa/mnemon-memory-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server