Back to the catalog

Memento

Agent memory MCP server with 4-type cognitive memory, hybrid search, and TTL-based forgetting.

Open source Open in the app JSON README (API)

About

Agent memory MCP server with 4-type cognitive memory, hybrid search, and TTL-based forgetting.

Details

Kind
MCP servers
Topic
AI, RAG & memory
Publisher
jee1
Origin
official
Category
ferramentas
Transport
local
Version
1.30.0
Open pull requests
1
Last push
2026-09-08T20:58:31Z
Repository state
ativo
Language
TypeScript
License
MIT
Added
2026-09-06 08:00:39
Updated
2026-09-06 08:00:39
Origin id
io.github.jee1/memento-mcp-server

README

# ๐Ÿง  Memento

<div align="center">
  <img src="static/logo.png" alt="Memento Logo" width="200" height="200">

  [๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด](README.md) | [๐Ÿ‡บ๐Ÿ‡ธ English](README.en.md)

  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
</div>

---

LLM์€ ๋Œ€ํ™”๊ฐ€ ๋๋‚˜๋ฉด ๋ชจ๋“  ๊ฒƒ์„ ์žŠ๋Š”๋‹ค. ์ด๋ฆ„๋„, ๊ฒฐ์ •๋„, ์ง€๋‚œ ์ฃผ์— ํ•จ๊ป˜ ๋””๋ฒ„๊น…ํ–ˆ๋˜ ๋งฅ๋ฝ๋„. ์ด๊ฑด ๊ธฐ์ˆ ์  ํ•œ๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ **๊ธฐ์–ต ์ธํ”„๋ผ์˜ ๋ถ€์žฌ**๋‹ค.

Memento๋Š” ๊ทธ ์ธํ”„๋ผ๋‹ค. ๊ธฐ์–ต์„ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ, ๊ธฐ์–ต์ด ์ƒ์„ฑยท๋ถ„๋ฅ˜ยท๊ฐ•ํ™”ยท๋ง๊ฐ๋˜๋Š” **MCP ๊ธฐ๋ฐ˜ ๊ธฐ์–ต ์šด์˜ ์ฒด์ œ**.

## ๊ธฐ์–ต์€ ๋‹จ์ˆœํ•˜์ง€ ์•Š๋‹ค

์‹ฌ๋ฆฌํ•™๊ณผ ์‹ ๊ฒฝ๊ณผํ•™์ด ์ˆ˜์‹ญ ๋…„์— ๊ฑธ์ณ ๋ฐํ˜€๋‚ธ ๊ฒƒ์ด ์žˆ๋‹ค. ์ธ๊ฐ„์˜ ๊ธฐ์–ต์€ ํ•œ ์ข…๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.

**์ž‘์—…๊ธฐ์–ต(Working Memory)** ์€ ์ง€๊ธˆ ์ด ์ˆœ๊ฐ„ ์ฒ˜๋ฆฌ ์ค‘์ธ ์ •๋ณด๋‹ค. ๋ช‡ ์ดˆ ์•ˆ์— ์‚ฌ๋ผ์ง€์ง€๋งŒ, ๊ทธ ์ˆœ๊ฐ„๋งŒํผ์€ ๋ชจ๋“  ํŒ๋‹จ์˜ ๊ธฐ๋ฐ˜์ด ๋œ๋‹ค. **์ผํ™”๊ธฐ์–ต(Episodic Memory)** ์€ ๊ฒฝํ—˜์˜ ํ”์ ์ด๋‹ค. "๊ทธ๋‚  ์˜คํ›„ React Hook์„ ์ฒ˜์Œ ๋ฐฐ์› ์„ ๋•Œ"์ฒ˜๋Ÿผ ์‹œ๊ฐ„๊ณผ ๋งฅ๋ฝ์ด ๋ถ™์–ด ์žˆ๋Š” ๊ธฐ์–ต. **์˜๋ฏธ๊ธฐ์–ต(Semantic Memory)** ์€ ๊ฒฝํ—˜์—์„œ ์ฆ๋ฅ˜๋œ ์ง€์‹์ด๋‹ค. ์ˆ˜๋ฐฑ ๋ฒˆ์˜ ๋””๋ฒ„๊น…์„ ๊ฑฐ์ณ ์Œ“์ธ "TypeScript ์ œ๋„ค๋ฆญ์€ ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•œ๋‹ค"๋Š” ์ดํ•ด. ๊ทธ๋ฆฌ๊ณ  **์ ˆ์ฐจ๊ธฐ์–ต(Procedural Memory)** ์€ ์†์— ๋ฐด ์ ˆ์ฐจ๋‹ค. Docker ๋ฐฐํฌ ์ˆœ์„œ, PR ์ฒดํฌ๋ฆฌ์ŠคํŠธ, ํŒ€์˜ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜.

ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ LLM์€ ์ด ๋„ค ๊ฐ€์ง€๋ฅผ ๋งค ๋Œ€ํ™”๋งˆ๋‹ค ์žƒ๋Š”๋‹ค. Memento๋Š” ์ด ๋„ค ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์˜์†ํ™”ํ•œ๋‹ค โ€” `remember` ํ˜ธ์ถœ ์‹œ `type` ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ `working`, `episodic`, `semantic`, `procedural` ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.

## ์‚ด์•„์žˆ๋Š” ๊ธฐ์–ต

๋‹จ์ˆœํ•œ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋‹ค. Memento์˜ ๊ธฐ์–ต์€ ์‚ด์•„์žˆ๋‹ค.

์ค‘์š”ํ•˜๊ฒŒ ์“ฐ์ธ ๊ธฐ์–ต์€ ๊ฐ•ํ™”๋œ๋‹ค. ์˜ค๋ž˜๋˜๊ณ  ์“ธ๋ชจ์—†์–ด์ง„ ๊ธฐ์–ต์€ ๋ง๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ์ •๋ฆฌ๋œ๋‹ค. ๋น„์Šทํ•œ ๊ธฐ์–ต๋“ค์€ ๋ฒกํ„ฐ ์œ ์‚ฌ๋„๋กœ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ๊ทธ๋ž˜ํ”„๋ฅผ ํ˜•์„ฑํ•œ๋‹ค. ๋ฐ˜๋ณต ์‚ฌ์šฉํ•˜๋Š” ์ ˆ์ฐจ๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ๋˜์–ด `procedural_diff`์™€ `procedural_rollback`์œผ๋กœ ์ง„ํ™”๋ฅผ ์ถ”์ ํ•œ๋‹ค. ํ•ต์‹ฌ ๋งฅ๋ฝ์€ ์•ต์ปค(Anchor)๋กœ ๊ณ ์ •๋˜์–ด ์ƒˆ ๋Œ€ํ™”์—์„œ๋„ ์ฆ‰์‹œ ๋ณต์›๋œ๋‹ค.

AI๊ฐ€ "๊ธฐ์–ตํ•˜๋Š” ์ฒ™"ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ธฐ์–ต์„ ์ƒ์„ฑยท๋ถ„๋ฅ˜ยท๊ฐ•ํ™”ยท๋ง๊ฐํ•˜๋Š” ์ฃผ์ฒด๋กœ ํ–‰๋™ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ โ€” ๊ทธ๊ฒƒ์ด Memento์˜ ๋ชฉํ‘œ๋‹ค.

### ๐Ÿ“ฆ ๋ชจ๋…ธ๋ ˆํฌ ๊ตฌ์กฐ

์ด ์ €์žฅ์†Œ๋Š” **npm workspaces** ๋ชจ๋…ธ๋ ˆํฌ์ž…๋‹ˆ๋‹ค. `@memento/core`๊ฐ€ ๋„๋ฉ”์ธยทDBยทMCP ๋„๊ตฌ๋ฅผ ๋‹ด๊ณ , `memento-server`๊ฐ€ stdio/HTTP๋กœ ์ด๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ์—์„œ REST๋กœ ๋ถ™์„ ๋•Œ๋Š” `@jee1/memento-client`, OpenClaw ๊ฐ™์€ ์™ธ๋ถ€ ๋น„์„œ์—๋Š” `@jee1/memento-assistant`, ์—์ด์ „ํŠธ ์„ธ์…˜ยทํ”„๋กœ๋ฒ„๋„Œ์Šค ๊ณ„์•ฝ์€ `@memento/agent-integration`์ด ๋‹ด๋‹นํ•˜์ง€๋งŒ ์ด๋Š” **๋‚ด๋ถ€ ์ „์šฉ ํŒจํ‚ค์ง€**๋กœ npm์— ๋ฐœํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์„œ๋ฒ„ tarball์— ๋ฒˆ๋“ค). ์‹คํ—˜ ์ฝ”๋“œ๋Š” `apps/` ์•„๋ž˜์— ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

npm์— ๋ฐœํ–‰๋˜๋Š” ํŒจํ‚ค์ง€๋Š” ์…‹์ž…๋‹ˆ๋‹ค: `memento-mcp-server`(์„œ๋ฒ„), `@jee1/memento-client`, `@jee1/memento-assistant`.

```bash
npm i @jee1/memento-client      # REST ํด๋ผ์ด์–ธํŠธ
npm i @jee1/memento-assistant   # ์™ธ๋ถ€ ๋น„์„œ์šฉ auto-recall/save SDK
```

| ๊ฒฝ๋กœ | ์„ค๋ช… |
|------|------|
| **packages/memento-core** (`@memento/core`) | ๋„๋ฉ”์ธยท์ธํ”„๋ผยท๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์ง„์ž…์ : `createMementoCore`, `createToolContext`, `getToolRegistry`, `closeDatabase`. DB ์ดˆ๊ธฐํ™”ยท๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋ฃจํŠธ์—์„œ `npm run db:init` / `npm run db:migrate`๋กœ ์‹คํ–‰. |
| **packages/memento-server** | core๋ฅผ ์‚ฌ์šฉํ•˜๋Š” MCP/HTTP ์„œ๋ฒ„. ๋ฃจํŠธ `npm run dev`, `npm start`, `npm run dev:http` ๋“ฑ์œผ๋กœ ์‹คํ–‰. |
| **packages/memento-client** (`@jee1/memento-client`) | ์„œ๋ฒ„ ์—ฐ๊ฒฐ์šฉ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. |
| **packages/memento-assistant** (`@jee1/memento-assistant`) | ์™ธ๋ถ€ AI ๋น„์„œ์šฉ recall/remember SDK. |
| **packages/memento-agent-integration** (`@memento/agent-integration`) | ์—์ด์ „ํŠธ ํ†ตํ•ฉ ๊ณ„์•ฝยท์–ด๋Œ‘ํ„ฐ. ๋‚ด๋ถ€ ์ „์šฉ(`private`), npm ๋ฏธ๋ฐœํ–‰. |
| **apps/** | ์‹คํ—˜์šฉ ์•ฑ (์˜ˆ: `experimental-example`์€ `@memento/core`๋ฅผ in-process๋กœ ์‚ฌ์šฉ). |

์ƒ์„ธ ๊ตฌ์กฐยท๋นŒ๋“œยทํ…Œ์ŠคํŠธ ๋ช…๋ น์€ [AGENTS.md](AGENTS.md)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

## ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

> **๐Ÿ“ฆ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €**: ์ด ํ”„๋กœ์ ํŠธ๋Š” **npm**์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. `pnpm`์ด๋‚˜ `yarn`์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

### ์›ํด๋ฆญ ์„ค์น˜ (๊ถŒ์žฅ)
```bash
curl -sSL https://raw.githubusercontent.com/jee1/memento/main/install.sh | bash
```

### npx ๋ฐฉ์‹ (๊ฐœ๋ฐœ์ž์šฉ)

#### Windows (PowerShell/CMD)
```powershell
npx memento-mcp-server@latest dev
npx memento-mcp-server@latest
npx memento-mcp-server@latest setup
```

#### Linux/macOS
```bash
npx memento-mcp-server@latest dev
npx memento-mcp-server@latest
npx memento-mcp-server@latest setup
```

> **์ฐธ๊ณ **: `npm exec` ์‚ฌ์šฉ ์‹œ ๋ช…๋ น์–ด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
> ```bash
> npm exec -- memento-mcp-server@latest dev
> ```

**๋ฐ˜๋ณต ์‚ฌ์šฉ ์‹œ ์ฃผ์˜**: ๋งค๋ฒˆ npx๋กœ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ˜๋ณต ์‚ฌ์šฉ์—๋Š” **๊ธ€๋กœ๋ฒŒ ์„ค์น˜**(`npm i -g memento-mcp-server`) ๋˜๋Š” ๋กœ์ปฌ ์„ค์น˜ ํ›„ `./node_modules/.bin/memento` ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“œ ๊ตฌ๋ถ„: MCP ์„œ๋ฒ„(`memento-mcp-server` / stdio), HTTP ์„œ๋ฒ„(`memento-dev`), CLI(`memento` โ€” recall, remember, forget, memory_injection). CLI ๊ฐ€์ด๋“œ: [docs/guides/ko/memento-cli-for-ai.md](docs/guides/ko/memento-cli-for-ai.md).

### Claude Code ํ”Œ๋Ÿฌ๊ทธ์ธ (๊ถŒ์žฅ โ€” ์„ค์ • ์—†์ด ํ•œ ๋ฒˆ์—)

์ด ์ €์žฅ์†Œ ์ž์ฒด๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์ž…๋‹ˆ๋‹ค. MCP ์„œ๋ฒ„ ๋“ฑ๋ก๊ณผ `recall`โ†’`remember` ์‚ฌ์šฉ ์Šต๊ด€ skill์ด ํ•จ๊ป˜ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

```
/plugin marketplace add jee1/memento
/plugin install memento@memento
```

๊ธฐ์–ต DB๋Š” `${CLAUDE_PLUGIN_DATA}/memory.db`์— ์ €์žฅ๋˜์–ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—…๋ฐ์ดํŠธํ•ด๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ํ›„ `/plugin` ํŒจ๋„์—์„œ `memento` MCP ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ๋๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

### MCP ๊ณต์‹ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ

Memento๋Š” MCP ๊ณต์‹ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— `io.github.jee1/memento-mcp-server` ์ด๋ฆ„์œผ๋กœ ๋“ฑ์žฌ๋ฉ๋‹ˆ๋‹ค. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์ฝ๋Š” ํด๋ผ์ด์–ธํŠธยท๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์—์„œ ์ด ์ด๋ฆ„์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```bash
curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.jee1/memento-mcp-server"
```

๋“ฑ์žฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋ฃจํŠธ [`server.json`](server.json)์— ์žˆ๊ณ , ์ •์‹ ๋ฆด๋ฆฌ์Šค๋งˆ๋‹ค `release.yml`์ด npm ๋ฐฐํฌ ํ›„ ๋ฒ„์ „์„ ๋งž์ถฐ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค (pre-release๋Š” ๋“ฑ์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

### Docker ๋ฐฉ์‹ (ํ”„๋กœ๋•์…˜์šฉ)
```bash
docker compose -p "${COMPOSE_PROJECT_NAME:-memento}" -f docker/docker-compose.dev.yml up -d   # ๊ฐœ๋ฐœ
docker compose -p "${COMPOSE_PROJECT_NAME:-memento}" -f docker/docker-compose.prod.yml up -d  # ํ”„๋กœ๋•์…˜
```

์ด๋™๋œ ํ™˜๊ฒฝ ์˜ค๋ฒ„๋ ˆ์ด๋ฅผ ์ฒซ ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋„ Compose ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์€ ๊ธฐ๋ณธ `memento`๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ด๋ฆ„์ด ํ•„์š”ํ•˜๋ฉด `COMPOSE_PROJECT_NAME`์„ ์„ค์ •ํ•˜์„ธ์š”.

**Log Issue Monitor**: ์šด์˜ ๋กœ๊ทธ์™€ Docker diagnostics๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฒ€์‚ฌํ•ด ๋ฐ˜๋ณต ์˜ค๋ฅ˜๋ฅผ GitHub Issue๋กœ ๋ฌถ์–ด ๊ด€๋ฆฌํ•˜๋ ค๋ฉด `docker/docker-compose.issue-monitor.yml` ์˜ค๋ฒ„๋ ˆ์ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์ ˆ์ฐจ: [Log Issue Monitor ์šด์˜ ๊ฐ€์ด๋“œ](docs/operations/ko/log-issue-monitor.md).

### ์†Œ์Šค์ฝ”๋“œ ๋ฐฉ์‹ (๊ฐœ๋ฐœ์ž์šฉ)

```bash
git clone https://github.com/jee1/memento.git
cd memento
npm install
npm run build
npm run db:init
npm run db:migrate
npm run quick-start
```

### ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์šด์˜์„ ์œ„ํ•œ HTTP MCP ์„œ๋ฒ„

SQLite๋Š” WAL ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋™์‹œ์— ํ•˜๋‚˜์˜ writer๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ AI Agent๊ฐ€ ๊ฐ๊ฐ ํ”„๋กœ์„ธ์Šค๋กœ `remember`/`forget`์„ ํ˜ธ์ถœํ•˜๋ฉด `SQLITE_BUSY`๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, **๋ฐ˜๋“œ์‹œ MCP ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ•˜๋‚˜๋งŒ ๋„์›Œ DB๋ฅผ ์ „๋‹ด**ํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

```bash
npm run dev:http                          # ๊ฐœ๋ฐœ ๋ชจ๋“œ (Hot Reload)
npm run build && npm run start:http       # ํ”„๋กœ๋•์…˜
```

์ด ๋ฐฉ์‹์œผ๋กœ `packages/memento-server`์˜ HTTP MCP ์„œ๋น„์Šค๋ฅผ ๋„์›Œ ๋‘๋ฉด, ๋ชจ๋“  ์—์ด์ „ํŠธ๋Š” HTTP/WebSocket ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ด ์„œ๋ฒ„์—๋งŒ ์ ‘์†ํ•˜๊ณ  SQLite writer๋Š” ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

#### MCP ํด๋ผ์ด์–ธํŠธ ์„ค์ • ์˜ˆ์‹œ (`mcp.json`)

๋ฃจํŠธ์—์„œ `npm run build` ํ›„ ์„œ๋ฒ„ ์‹คํ–‰ ํŒŒ์ผ์€ `packages/memento-server/dist/server/http-server.js`์— ์žˆ์Šต๋‹ˆ๋‹ค.

```json
{
  "clients": {
    "memento": {
      "command": "node",
      "args": ["/path/to/memento/packages/memento-server/dist/server/http-server.js"],
      "env": {
        "DB_PATH": "/absolute/path/to/data/memory.db",
        "MCP_SERVER_PORT": "9001"
      },
      "transport": {
        "type": "http",
        "url": "http://127.0.0.1:9001/mcp"
      }
    }
  }
}
```

### ์ƒ์„ธ ์„ค์น˜ ๊ฐ€์ด๋“œ
- [INSTALL.md](INSTALL.md) โ€” ์ „์ฒด ์„ค์น˜ ๊ฐ€์ด๋“œ
- [Cursor MCP ์„ค์ • ๊ฐ€์ด๋“œ](docs/guides/ko/cursor-mcp-setup.md)
- [npx ์‚ฌ์šฉ์ž ๋ฌธ์ œ ํ•ด๊ฒฐ](docs/operations/ko/npx-troubleshooting.md)

## ๐Ÿ”— ์™ธ๋ถ€ AI ๋น„์„œ์™€ ํ•จ๊ป˜ ์“ฐ๊ธฐ

OpenClaw / NanoClaw / ZeroClaw ๊ฐ™์€ ๊ฐœ์ธ AI ๋น„์„œ๊ฐ€ Memento๋ฅผ ๊ณต์œ  ์žฅ๊ธฐ ๊ธฐ์–ต ๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ด๋“œ: [docs/integrations/](./docs/integrations/README.md)

`@jee1/memento-assistant` SDK๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™ recall/remember๋ฅผ ์ฝ”๋“œ ๋‘ ์ค„๋กœ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” [SDK quickstart](./docs/integrations/_shared/sdk-quickstart.md)

## ๐Ÿ’ก ์‚ฌ์šฉ ์˜ˆ์‹œ

### AI Agent์™€์˜ ์—ฐ๋™
```typescript
// ์ผํ™”๊ธฐ์–ต์œผ๋กœ ํ•™์Šต ๋‚ด์šฉ ์ €์žฅ
await client.callTool({
  name: "remember",
  arguments: {
    content: "์‚ฌ์šฉ์ž๋Š” React Hook์„ ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค. useState๋Š” ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , useEffect๋Š” ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.",
    type: "episodic",
    tags: ["react", "hooks", "javascript"],
    importance: 0.8
  }
});

// ๋‚˜์ค‘์— ๊ด€๋ จ ๊ธฐ์–ต ๊ฒ€์ƒ‰
const results = await client.callTool({
  name: "recall",
  arguments: {
    query: "React Hook์€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š”?",
    limit: 5
  }
});
```

### ์˜๋ฏธ๊ธฐ์–ต์œผ๋กœ ์ง€์‹ ๊ด€๋ฆฌ
```typescript
// ๊ฒฝํ—˜์—์„œ ์ฆ๋ฅ˜๋œ ์ง€์‹์„ ์˜๋ฏธ๊ธฐ์–ต์œผ๋กœ ์ €์žฅ
await client.callTool({
  name: "remember",
  arguments: {
    content: "TypeScript์˜ ์ œ๋„ค๋ฆญ์€ ํƒ€์ž…์„ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•˜์—ฌ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.",
    type: "semantic",
    tags: ["typescript", "generics", "programming"],
    importance: 0.9
  }
});
```

### ์ ˆ์ฐจ๊ธฐ์–ต์œผ๋กœ ์›Œํฌํ”Œ๋กœ ๋ณด์กด
```typescript
// ๋ฐ˜๋ณต ์ž‘์—… ์ ˆ์ฐจ๋ฅผ ์ ˆ์ฐจ๊ธฐ์–ต์œผ๋กœ ์ €์žฅ (๋ฒ„์ „ ๊ด€๋ฆฌ๋จ)
await client.callTool({
  name: "remember",
  arguments: {
    content: "Docker ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ ์ ˆ์ฐจ: 1) Dockerfile ์ž‘์„ฑ 2) docker build ์‹คํ–‰ 3) docker run์œผ๋กœ ํ…Œ์ŠคํŠธ 4) ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ํ‘ธ์‹œ",
    type: "procedural",
    tags: ["docker", "deployment", "devops"],
    importance: 0.7
  }
});
```

## ๐Ÿ› ๏ธ ์‚ฌ์šฉ๋ฒ•

์„ธ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ Memento์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- **mcp.json ์„ค์ •**: Claude Desktop, Cursor, Claude Code ๋“ฑ MCP ํ˜ธ์ŠคํŠธ์— Memento๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ์‹ (์ฝ”๋“œ ๋ถˆํ•„์š”)
- **MCP ํ”„๋กœํ† ์ฝœ** (`@modelcontextprotocol/sdk`): ์ปค์Šคํ…€ ์—์ด์ „ํŠธ ์ฝ”๋“œ์—์„œ MCP ํ”„๋กœํ† ์ฝœ๋กœ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹
- **HTTP API ํด๋ผ์ด์–ธํŠธ** (`@jee1/memento-client`): TypeScript/JavaScript ์ฝ”๋“œ์—์„œ Memento ์„œ๋ฒ„์˜ REST API๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

### 0. mcp.json ์„ค์ • (Claude Desktop ยท Cursor ยท Claude Code)

MCP ํ˜ธ์ŠคํŠธ ์•ฑ์—์„œ Memento๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„ค์ • ํŒŒ์ผ์— ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

#### stdio ๋ชจ๋“œ (๋‹จ์ผ ์—์ด์ „ํŠธ / ์†Œ์Šค ์‹คํ–‰)

`npm run build` ํ›„ ์•„๋ž˜์ฒ˜๋Ÿผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

```json
{
  "mcpServers": {
    "memento": {
      "command": "node",
      "args": ["/path/to/memento/packages/memento-server/dist/server/index.js"],
      "env": {
        "DB_PATH": "/absolute/path/to/data/memory.db"
      }
    }
  }
}
```

> **ํŒŒ์ผ ์œ„์น˜**:
> - Claude Desktop: `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) / `%APPDATA%\Claude\claude_desktop_config.json` (Windows)
> - Cursor: `.cursor/mcp.json` (ํ”„๋กœ์ ํŠธ) ๋˜๋Š” `~/.cursor/mcp.json` (์ „์—ญ)
> - Claude Code: `.claude/mcp.json` (ํ”„๋กœ์ ํŠธ) ๋˜๋Š” `~/.claude/mcp.json` (์ „์—ญ)

#### HTTP MCP ๋ชจ๋“œ (๋‹ค์ค‘ ์—์ด์ „ํŠธ ๊ณต์œ  ์„œ๋ฒ„)

```bash
npm run build && npm run start:http   # ๊ธฐ๋ณธ ํฌํŠธ: 9001 (env.exampleยทDocker์™€ ๋™์ผ)
```

```json
{
  "mcpServers": {
    "memento": {
      "type": "http",
      "url": "http://127.0.0.1:9001/mcp"
    }
  }
}
```

> **npx๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ** (์†Œ์Šค ๋นŒ๋“œ ์—†์ด):
> ```json
> {
>   "mcpServers": {
>     "memento": {
>       "command": "npx",
>       "args": ["memento-mcp-server@latest"],
>       "env": {
>         "DB_PATH": "/absolute/path/to/data/memory.db"
>       }
>     }
>   }
> }
> ```

### 1. MCP ํ”„๋กœํ† ์ฝœ ์—ฐ๊ฒฐ (`@modelcontextprotocol/sdk`)

```typescript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";

const client = new Client({
  name: "my-agent",
  version: "0.1.0"
}, {
  capabilities: { tools: {}, resources: {}, prompts: {} }
});

// stdio ์—ฐ๊ฒฐ (๋‹จ์ผ ํ”„๋กœ์„ธ์Šค)
await client.connect({
  command: "node",
  args: ["packages/memento-server/dist/server/index.js"]
});

// HTTP MCP ์—ฐ๊ฒฐ (๋‹ค์ค‘ ์—์ด์ „ํŠธ ๊ณต์œ  ์„œ๋ฒ„)
await client.connect({
  transport: {
    type: "http",
    url: "http://127.0.0.1:9001/mcp"
  }
});
```

```typescript
const result = await client.callTool({
  name: "remember",
  arguments: {
    content: "React Hook์— ๋Œ€ํ•ด ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค.",
    type: "episodic",
    tags: ["react", "hooks"],
    importance: 0.8
  }
});

const results = await client.callTool({
  name: "recall",
  arguments: {
    query: "React Hook์„ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ ์•Œ์•„์•ผ ํ•  ๊ฒƒ๋“ค์€?",
    filters: { type: ["episodic", "semantic"], tags: ["react"] },
    limit: 10
  }
});
```

### 2. HTTP API ํด๋ผ์ด์–ธํŠธ (`@jee1/memento-client`)

`@jee1/memento-client`๋Š” MCP ํ”„๋กœํ† ์ฝœ์ด ์•„๋‹Œ **HTTP REST API ๋ž˜ํผ**์ž…๋‹ˆ๋‹ค. TypeScript/JavaScript ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ `/tools/*` ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

```typescript
import { MementoClient } from "@jee1/memento-client";

const client = new MementoClient({
  serverUrl: "http://localhost:9001",
  apiKey: "your-api-key"
});

await client.connect();

const result = await client.remember({
  content: "React Hook์— ๋Œ€ํ•ด ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค.",
  type: "episodic",
  tags: ["react", "hooks"],
  importance: 0.8
});

const results = await client.recall(
  "React Hook์„ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ ์•Œ์•„์•ผ ํ•  ๊ฒƒ๋“ค์€?",
  { type: ["episodic", "semantic"], tags: ["react"] },
  10
);

await client.pin(result.memory_id);
await client.forget(result.memory_id);
```

## ๐Ÿง  ๊ธฐ๋Šฅ

### ๐Ÿง  ํ•ต์‹ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ (MCP ํด๋ผ์ด์–ธํŠธ)

- **๊ธฐ์–ต ์ €์žฅ**: `working`, `episodic`, `semantic`, `procedural` 4๊ฐ€์ง€ ํƒ€์ž…
- **๊ธฐ์–ต ๊ฒ€์ƒ‰**: ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰ (ํ…์ŠคํŠธ FTS5 + ๋ฒกํ„ฐ)
- **์ด์›ƒ ๊ธฐ์–ต ํƒ์ƒ‰**: ๋ฒกํ„ฐ ์œ ์‚ฌ๋„ ๊ธฐ๋ฐ˜ ์ž๋™ ์ถ”์ฒœ
- **๊ธฐ์–ต ๊ณ ์ •**: ์ค‘์š” ๊ธฐ์–ต pin/unpin
- **๊ธฐ์–ต ์‚ญ์ œ**: ์†Œํ”„ํŠธ/ํ•˜๋“œ ์‚ญ์ œ
- **์•ต์ปค ์‹œ์Šคํ…œ**: ํ•ต์‹ฌ ๊ธฐ์–ต์„ ์•ต์ปค๋กœ ๊ณ ์ •ํ•ด ๋‹ค์Œ ๋Œ€ํ™”์—์„œ ์ฆ‰์‹œ ์ปจํ…์ŠคํŠธ ๋ณต์›
> **์ฐธ๊ณ **: ์•ต์ปค ๋ณต์›, ์ž„๋ฒ ๋”ฉ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, Episodic โ†’ Semantic ๋ณ€ํ™˜, ๋ฉ”ํƒ€ ๋ฉ”๋ชจ๋ฆฌ ํ†ต๊ณ„๋Š” MCP ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ผ HTTP ๊ด€๋ฆฌ API๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

### ๐Ÿ” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰

ํ…์ŠคํŠธ์™€ ์˜๋ฏธ(๋ฒกํ„ฐ)๋ฅผ ํ•จ๊ป˜ ๊ฒ€์ƒ‰ํ•œ๋‹ค. ํ‚ค์›Œ๋“œ๊ฐ€ ์ •ํ™•ํžˆ ๊ธฐ์–ต๋‚˜์ง€ ์•Š์•„๋„, ๊ฐœ๋…์ด ๋น„์Šทํ•˜๋ฉด ์ฐพ์•„๋‚ธ๋‹ค.

- **FTS5 ํ…์ŠคํŠธ ๊ฒ€์ƒ‰**: SQLite Full-Text Search
- **๋ฒกํ„ฐ ๊ฒ€์ƒ‰**: sqlite-vec ๊ธฐ๋ฐ˜ ์˜๋ฏธ์  ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰
- **ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰**: ๋‘ ๊ฒ€์ƒ‰์˜ ๊ฒฐํ•ฉ (Consolidation Score๋กœ ๊ฐ€์ค‘์น˜ ์กฐ์ •)
- **๋‹ค์ค‘ ์ž„๋ฒ ๋”ฉ ์ œ๊ณต์ž**: TF-IDF, MiniLM, OpenAI, Gemini ์ง€์›
- **์ž๋™ ์ œ๊ณต์ž ์„ ํƒ**: ์„ค์ • ๊ธฐ๋ฐ˜ ์ตœ์  ์ œ๊ณต์ž ์ž๋™ ์„ ํƒ, ์‹คํŒจ ์‹œ ์ž๋™ ํด๋ฐฑ
- **ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ๋ง**: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰

### ๐Ÿงน ๋ง๊ฐ ์ •์ฑ…

๊ธฐ์–ต ์‹œ์Šคํ…œ์ด ์ง„์งœ ์œ ์šฉํ•˜๋ ค๋ฉด, ๋ง๊ฐ๋„ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค. ์Œ“์ด๊ธฐ๋งŒ ํ•˜๋Š” ๊ธฐ์–ต์€ ์žก์Œ์ด ๋œ๋‹ค.

- **๋ง๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜**: ์ตœ๊ทผ์„ฑยท์‚ฌ์šฉ์„ฑยท์ค‘๋ณต ๋น„์œจ ๊ธฐ๋ฐ˜ ๋ง๊ฐ ์ ์ˆ˜ ๊ณ„์‚ฐ
- **๊ฐ„๊ฒฉ ๋ฐ˜๋ณต**: ์ค‘์š”๋„์™€ ์‚ฌ์šฉ์„ฑ ๊ธฐ๋ฐ˜ ๋ฆฌ๋ทฐ ์Šค์ผ€์ค„๋ง
- **TTL ๊ด€๋ฆฌ**: ํƒ€์ž…๋ณ„ ์ˆ˜๋ช… ๊ด€๋ฆฌ (working 48์‹œ๊ฐ„, episodic 90์ผ, semanticยทprocedural ๋ฌด๊ธฐํ•œ)
- **์ž๋™ ์ •๋ฆฌ**: ์†Œํ”„ํŠธ/ํ•˜๋“œ ์‚ญ์ œ ์ž๋™ํ™”

### ๐Ÿ“Š ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง (HTTP ๊ด€๋ฆฌ API)

> **๋ณด์•ˆ**: HTTP ์„œ๋ฒ„๋Š” ๋ธŒ๋ผ์šฐ์ € ์„ธ์…˜๊ณผ ํ—ค๋” ๊ธฐ๋ฐ˜ ์‹ ๋ขฐ ๊ฒฝ๊ณ„๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. `/auth/session`์€ ์ฟ ํ‚ค ๊ธฐ๋ฐ˜ ๋ธŒ๋ผ์šฐ์ € ์„ธ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ , `/admin`๊ณผ `/api`๋Š” ๋ธŒ๋ผ์šฐ์ € ์„ธ์…˜์ด ํ•„์š”ํ•˜๋ฉฐ, `/api/v1/quality`, `/api/v1/maintenance`, `/tools`, `/mcp`๋Š” `Authorization: Bearer` ๋˜๋Š” `X-API-Key`๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ: [docs/reference/ko/security.md](docs/reference/ko/security.md)

- **์‹ค์‹œ๊ฐ„ ๋ฉ”ํŠธ๋ฆญ**: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๊ฒ€์ƒ‰, ๋ฉ”๋ชจ๋ฆฌ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง
- **์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ**: 30์ดˆ๋งˆ๋‹ค ์ž๋™ ์„ฑ๋Šฅ ์ฒดํฌ ๋ฐ ์ž„๊ณ„๊ฐ’ ๊ธฐ๋ฐ˜ ์•Œ๋ฆผ
- **์—๋Ÿฌ ๋กœ๊น…**: ๊ตฌ์กฐํ™”๋œ ์—๋Ÿฌ ๋กœ๊น… ๋ฐ ํ†ต๊ณ„ ์ˆ˜์ง‘
- **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ตœ์ ํ™”**: ์ž๋™ ์ธ๋ฑ์Šค ์ถ”์ฒœ ๋ฐ ์ƒ์„ฑ
- **์บ์‹œ ์‹œ์Šคํ…œ**: LRU + TTL ๊ธฐ๋ฐ˜ ์บ์‹ฑ
- **๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ**: ์›Œ์ปค ํ’€ ๊ธฐ๋ฐ˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

### ๐Ÿ”— ๋ฉ”๋ชจ๋ฆฌ ๊ทธ๋ž˜ํ”„ ๋ทฐ (๋ธŒ๋ผ์šฐ์ €)

HTTP ์„œ๋ฒ„ ์‹คํ–‰ ํ›„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ธฐ์–ต๋“ค์˜ ์˜๋ฏธ์  ๊ด€๊ณ„๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๊ด€๋ฆฌ ํ๋ฆ„์€ `/dashboard`์—์„œ ์—ฌ๋Š” ํŽธ์ด ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๋ฉฐ, `/graph`๋ฅผ ์ง์ ‘ ์—ด์–ด๋„ ๋™์ผํ•œ `/auth/session` ๊ธฐ๋ฐ˜ ์žฌ์ธ์ฆ ํŒจ๋„๋กœ ์„ธ์…˜์„ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```
http://localhost:9001/dashboard
http://localhost:9001/graph
```

![Memento Memory Graph View](docs/graph-screenshot.png)

## ๐Ÿ“š ๋ฌธ์„œ

์ „์ฒด ๋ฌธ์„œ ๋ชฉ๋กยทKO/EN ๋งคํ•‘: [docs/README.md](docs/README.md)

- [์ž„๋ฒ ๋”ฉ ์„œ๋น„์Šค ๊ฐ€์ด๋“œ](docs/guides/ko/embedding-service-guide.md)
- [์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ](docs/reference/ko/embedding-performance-benchmark.md)
- [API ๋ ˆํผ๋Ÿฐ์Šค](docs/api/ko/api-reference.md)
- [์„ค์ • ๊ฐ€์ด๋“œ](docs/guides/ko/embedding-configuration.md)
- [Consolidation Score ํ…Œ์ŠคํŠธ ๊ฐ€์ด๋“œ](docs/guides/ko/consolidation-quality-testing.md)

## ๐Ÿ“‹ API ๋ฌธ์„œ

### MCP Tools (๋“ฑ๋ก 22๊ฐœ, ๊ธฐ๋ณธ ๋…ธ์ถœ 4๊ฐœ)

> **์ค‘์š”**: ์„œ๋ฒ„์—๋Š” ๋„๊ตฌ 22๊ฐœ๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€๋งŒ, `tools/list`์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ **`recall`ยท`remember`ยท`memory_injection`ยท`feedback` 4๊ฐœ๋งŒ** ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค(v1.18+). ๋„๊ตฌ ์ •์˜๋Š” ์„ธ์…˜ ๋‚ด๋‚ด ํด๋ผ์ด์–ธํŠธ ์ปจํ…์ŠคํŠธ๋ฅผ ์ ์œ ํ•˜๋ฏ€๋กœ, ๋Š˜ ์ผœ๋‘๋Š” ์„œ๋ฒ„์ผ์ˆ˜๋ก ๊ธฐ๋ณธ ํ‘œ๋ฉด์„ ์ค„์ด๋Š” ํŽธ์ด ๋‚ซ์Šต๋‹ˆ๋‹ค(์ธก์ •: 5,860 โ†’ 2,954 ์ถ”์ • ํ† ํฐ, 49.6% ๊ฐ์†Œ).
>
> ๋‚˜๋จธ์ง€ 18๊ฐœ๋Š” **๋“ฑ๋ก๋œ ์ฑ„๋กœ ๋‚จ์•„ ํ˜ธ์ถœ์€ ๊ทธ๋Œ€๋กœ ๋ฉ๋‹ˆ๋‹ค** โ€” ๋ชฉ๋ก์—์„œ๋งŒ ๋น ์ง‘๋‹ˆ๋‹ค. ์ „๋ถ€ ๋‚˜์—ดํ•˜๋ ค๋ฉด `MEMENTO_TOOLSET=full`์„ ์„ค์ •ํ•˜์„ธ์š”. ๊ด€๋ฆฌ/์šด์˜์„ฑ ๊ธฐ๋Šฅ(์•ต์ปค ๋ณต์›, ์ž„๋ฒ ๋”ฉ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, Episodicโ†’Semantic ๋ณ€ํ™˜, ๋ฉ”ํƒ€ ๋ฉ”๋ชจ๋ฆฌ ํ†ต๊ณ„)์€ ์—ฌ์ „ํžˆ HTTP API๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

#### ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ (8๊ฐœ)
| Tool | ์„ค๋ช… | ํŒŒ๋ผ๋ฏธํ„ฐ |
|------|------|----------|
| `remember` | ๊ธฐ์–ต ์ €์žฅ | content, type, tags, importance, source, privacy_scope |
| `recall` | ๊ธฐ์–ต ๊ฒ€์ƒ‰ | query, filters, limit |
| `feedback` | recall ๊ฒฐ๊ณผ helpful/not_helpful ํ”ผ๋“œ๋ฐฑ | memory_id, helpful |
| `pin` | ๊ธฐ์–ต ๊ณ ์ • | memory_id |
| `unpin` | ๊ธฐ์–ต ๊ณ ์ • ํ•ด์ œ | memory_id |
| `forget` | ๊ธฐ์–ต ์‚ญ์ œ | memory_id, hard |
| `get_memory_neighbors` | ์ด์›ƒ ๊ธฐ์–ต ํƒ์ƒ‰ | memory_id, limit |
| `memory_injection` | ์ปจํ…์ŠคํŠธ ์ฃผ์ž… ํ”„๋กฌํ”„ํŠธ ์ƒ์„ฑ | query, token_budget |

#### ์•ต์ปค ์‹œ์Šคํ…œ (4๊ฐœ)
| Tool | ์„ค๋ช… | ํŒŒ๋ผ๋ฏธํ„ฐ |
|------|------|----------|
| `set_anchor` | ์•ต์ปค ์„ค์ • | memory_id, slot |
| `get_anchor` | ์•ต์ปค ์กฐํšŒ | slot |
| `search_local` | ์•ต์ปค ์ฃผ๋ณ€ ๊ฒ€์ƒ‰ | slot, query, limit |
| `clear_anchor` | ์•ต์ปค ์ œ๊ฑฐ | slot |

#### ์ ˆ์ฐจ ๊ธฐ์–ต (3๊ฐœ)
| Tool | ์„ค๋ช… | ํŒŒ๋ผ๋ฏธํ„ฐ |
|------|------|----------|
| `remember_procedure` | ์ ˆ์ฐจ ๊ธฐ์–ต ์ €์žฅ | content, workflow_name, skill_name, steps ๋“ฑ |
| `procedural_diff` | ์ ˆ์ฐจ ๊ธฐ์–ต ๋ฒ„์ „ ๊ฐ„ ์ฐจ์ด ๋น„๊ต | left_id, right_id |
| `procedural_rollback` | ์ ˆ์ฐจ ๊ธฐ์–ต ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋ณต์› | current_id, target_version_id |

#### ๊ด€๊ณ„ยท์ง€์‹ ๊ทธ๋ž˜ํ”„ (4๊ฐœ)
| Tool | ์„ค๋ช… | ํŒŒ๋ผ๋ฏธํ„ฐ |
|------|------|----------|
| `extract_triples` | ๋ณธ๋ฌธ์—์„œ SPO ํŠธ๋ฆฌํ”Œ ์ถ”์ถœ | content ๋˜๋Š” messages |
| `add_relation` | ๊ธฐ์–ต ๊ฐ„ ๊ด€๊ณ„ ์ถ”๊ฐ€ | source_id, target_id, relation_type |
| `get_relations` | ๊ด€๊ณ„ ์กฐํšŒ | memory_id ๋“ฑ |
| `remove_relation` | ๊ด€๊ณ„ ์‚ญ์ œ | relation_id |

#### ํ’ˆ์งˆยท๋‚ด๋ณด๋‚ด๊ธฐ (3๊ฐœ)
| Tool | ์„ค๋ช… | ํŒŒ๋ผ๋ฏธํ„ฐ |
|------|------|----------|
| `get_introspection_summary` | ์ €์‹ ๋ขฐยท๊ณ ์‹คํŒจ ๊ธฐ์–ต ์š”์•ฝ | โ€” |
| `get_telemetry_summary` | ๊ฒ€์ƒ‰ยท๋ฉ”๋ชจ๋ฆฌ ํ’ˆ์งˆ ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ | period |
| `export_memories` | ๊ธฐ์–ต ๋‚ด๋ณด๋‚ด๊ธฐ | filters ๋“ฑ |

**HTTP ์ „์šฉ (MCP์— ์—†์Œ)**: `restore_anchors`, `migrate_embeddings`, `convert_episodic_to_semantic`, `get_meta_memory_stats` โ€” ์•„๋ž˜ HTTP ๊ด€๋ฆฌ API ์ฐธ์กฐ.

### HTTP ๊ด€๋ฆฌ API

> **์ค‘์š”**: ๋‹ค์Œ ๊ธฐ๋Šฅ๋“ค์€ MCP ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉฐ, HTTP API๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

#### ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ
| ์—”๋“œํฌ์ธํŠธ | ์„ค๋ช… | ๋ฉ”์„œ๋“œ |
|-----------|------|--------|
| `/admin/memory/cleanup` | ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ | POST |
| `/admin/memory/convert-episodic-to-semantic` | Episodic โ†’ Semantic ๋ณ€ํ™˜ | POST |
| `/admin/memory/meta-stats` | ๋ฉ”ํƒ€ ๋ฉ”๋ชจ๋ฆฌ ํ†ต๊ณ„ ์กฐํšŒ | GET |
| `/admin/memory/review-candidates` | ๊ธฐ์–ต ๋ฆฌ๋ทฐ ํ›„๋ณด ๋ชฉ๋ก | GET |
| `/admin/memory/items/:memory_id` | ๋‹จ์ผ ๊ธฐ์–ต ํ”„๋ฆฌ๋ทฐ(JSON, ๋Œ€์‹œ๋ณด๋“œ ๋“ฑ) | GET |
| `/admin/memory/review-candidates/:id/review` | ๊ธฐ์–ต ๋ฆฌ๋ทฐ ํ›„๋ณด ์ฒ˜๋ฆฌ | POST |
| `/admin/memory/review-candidates/:id/dismiss` | ๊ธฐ์–ต ๋ฆฌ๋ทฐ ํ›„๋ณด ๊ธฐ๊ฐ | POST |
| `/admin/stats/forgetting` | ๋ง๊ฐ ํ†ต๊ณ„ ์กฐํšŒ | GET |

#### ๊ฐœ์ธ ์ง€์‹ Agent
| ์—”๋“œํฌ์ธํŠธ | ์„ค๋ช… | ๋ฉ”์„œ๋“œ |
|-----------|------|--------|
| `/api/v1/agent/personal:run` | ํ•œ ํ„ด ์‹คํ–‰, ์ง€์‹ ํ›„๋ณด ๋ฐ˜ํ™˜(์ €์žฅ ์—†์Œ) | POST |
| `/api/v1/agent/personal:persist-approved` | ์Šน์ธ๋œ ํ›„๋ณด๋งŒ `remember`๋กœ ์ €์žฅ | POST |

์‚ฌ์šฉ ์ ˆ์ฐจ: [๊ฐœ์ธ ์ง€์‹ ์—์ด์ „ํŠธ HTTP ์„œ๋ฒ„ ๋Ÿฐํƒ€์ž„ ์‚ฌ์šฉ๋ฒ•](docs/guides/ko/personal-knowledge-agent-mvp.md#http-์„œ๋ฒ„-๋Ÿฐํƒ€์ž„-์‚ฌ์šฉ๋ฒ•)

#### ์•ต์ปค ๊ด€๋ฆฌ
| ์—”๋“œํฌ์ธํŠธ | ์„ค๋ช… | ๋ฉ”์„œ๋“œ |
|-----------|------|--------|
| `/admin/anchors/restore` | ์•ต์ปค ๋ณต์› | POST |

#### ์ž„๋ฒ ๋”ฉ ๊ด€๋ฆฌ
| ์—”๋“œํฌ์ธํŠธ | ์„ค๋ช… | ๋ฉ”์„œ๋“œ |
|-----------|------|--------|
| `/admin/embeddings/migrate` | ์ž„๋ฒ ๋”ฉ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ | POST |

#### ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง
| ์—”๋“œํฌ์ธํŠธ | ์„ค๋ช… | ๋ฉ”์„œ๋“œ |
|-----------|------|--------|
| `/admin/stats/performance` | ์„ฑ๋Šฅ ํ†ต๊ณ„ ์กฐํšŒ | GET |
| `/admin/alerts/performance` | ์„ฑ๋Šฅ ์•Œ๋ฆผ ์กฐํšŒ | GET |

#### ์—๋Ÿฌ ๊ด€๋ฆฌ
| ์—”๋“œํฌ์ธํŠธ | ์„ค๋ช… | ๋ฉ”์„œ๋“œ |
|-----------|------|--------|
| `/admin/stats/errors` | ์—๋Ÿฌ ํ†ต๊ณ„ ์กฐํšŒ | GET |
| `/admin/errors/resolve` | ์—๋Ÿฌ ํ•ด๊ฒฐ | POST |

#### ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ
| ์—”๋“œํฌ์ธํŠธ | ์„ค๋ช… | ๋ฉ”์„œ๋“œ |
|-----------|------|--------|
| `/admin/database/optimize` | ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ตœ์ ํ™” | POST |

**๊ธฐํƒ€ HTTP admin**: ๋ฐฐ์น˜ ์ƒํƒœ/์‹คํ–‰(`/admin/batch/*`, `jobType`์— `memory_review_candidates` ํฌํ•จ), ์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญยท์•Œ๋ฆผ(`/admin/performance/*`), ๊ด€๊ณ„ ์ถ”์ถœยท์กฐํšŒยท์‹œ๊ฐํ™”(`/admin/relations/*`) ๋“ฑ์€ [docs/api/ko/api-reference.md](docs/api/ko/api-reference.md)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

### Resources

| Resource | ์„ค๋ช… |
|----------|------|
| `memory/{id}` | ๋‹จ์ผ ๊ธฐ์–ต ์ƒ์„ธ ์ •๋ณด |
| `memory/search?query=...` | ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์บ์‹œ |

## ๐Ÿ”ง ์„ค์ •

### ํ™˜๊ฒฝ ๋ณ€์ˆ˜

| ๋ณ€์ˆ˜ | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… |
|------|--------|------|
| `NODE_ENV` | development | ์‹คํ–‰ ํ™˜๊ฒฝ |
| `PORT` / `MCP_SERVER_PORT` | 9001 (http-server fallback) | HTTP/MCP ์„œ๋ฒ„ ํฌํŠธ (`env.example`ยทDocker ๊ถŒ์žฅ: 9001) |
| `DB_PATH` | ./data/memory.db | ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฒฝ๋กœ |
| `LOG_LEVEL` | info | ๋กœ๊ทธ ๋ ˆ๋ฒจ |
| `OPENAI_API_KEY` | - | OpenAI API ํ‚ค (์„ ํƒ์‚ฌํ•ญ) |
| `GEMINI_API_KEY` | - | Gemini API ํ‚ค (์„ ํƒ์‚ฌํ•ญ) |
| `EMBEDDING_PROVIDER` | minilm | ์ž„๋ฒ ๋”ฉ ์ œ๊ณต์ž (tfidf, lightweight, minilm, openai, gemini) |
| `CONSOLIDATION_SCORE_ENABLED` | false | Consolidation Score System ํ™œ์„ฑํ™” ์—ฌ๋ถ€ |
| `CONSOLIDATION_TEST_SEED_PATH` | ./data/consolidation-seed.json | ํ…Œ์ŠคํŠธ Seed ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๊ฒฝ๋กœ |
| `CONSOLIDATION_BASELINE_PATH` | ./data/consolidation-baseline.json | Baseline ์Šค๋ƒ…์ƒท ์ €์žฅ ๊ฒฝ๋กœ |
| `CONSOLIDATION_TEST_ITEM_COUNT` | 100 | ๋ฒค์น˜๋งˆํฌ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ |
| `CORS_ALLOWED_ORIGINS` | (๋น„์–ด ์žˆ์Œ) | CORS ํ—ˆ์šฉ ์˜ค๋ฆฌ์ง„ (์‰ผํ‘œ ๊ตฌ๋ถ„, ๋น„์–ด ์žˆ์œผ๋ฉด ํฌ๋กœ์Šค ์˜ค๋ฆฌ์ง„ ๋ฏธํ—ˆ์šฉ) |
| `ENABLE_PII_MASKING` | true | PII ๋งˆ์Šคํ‚น ํ™œ์„ฑํ™” ([docs/reference/ko/security.md](docs/reference/ko/security.md) ์ฐธ๊ณ ) |
| `MEMORY_REVIEW_IMPORTANCE_THRESHOLD` | `0.7` | ๊ธฐ์–ต ๋ฆฌ๋ทฐ ํ›„๋ณด ์ตœ์†Œ importance (0~1) |
| `MEMORY_REVIEW_STALE_DAYS` | `14` | ๊ธฐ์–ต ๋ฆฌ๋ทฐ ํ›„๋ณด ์ตœ์†Œ stale ์ผ์ˆ˜ (์ •์ˆ˜ โ‰ฅ 1) |
| `MEMORY_REVIEW_MAX_CANDIDATES` | `50` | ๊ธฐ์–ต ๋ฆฌ๋ทฐ ํ›„๋ณด ์ตœ๋Œ€ ๊ฐœ์ˆ˜ (์ •์ˆ˜ โ‰ฅ 1) |
| `MEMORY_REVIEW_MAX_BACKLOG` | `500` | pending ํ›„๋ณด๊ฐ€ ์ด ์ˆ˜ ์ด์ƒ์ด๋ฉด ์‹ ๊ทœ ์„ ์ •์„ ๊ฑด๋„ˆ๋œ€ (`0`: ๋น„ํ™œ์„ฑํ™”) |
| `MEMORY_REVIEW_CANDIDATE_TTL_DAYS` | `30` | ์ด ์ผ์ˆ˜๋ณด๋‹ค ์˜ค๋ž˜๋œ pending ํ›„๋ณด๋ฅผ ๋ฐฐ์น˜ ์‹คํ–‰ ์ „์— ๋งŒ๋ฃŒ (`0`: ๋น„ํ™œ์„ฑํ™”) |
| `MEMORY_REVIEW_CANDIDATES_INTERVAL_MS` | `86400000` | ๋ฐฐ์น˜ ์Šค์ผ€์ค„ ๊ฐ„๊ฒฉ(ms), ์ตœ์†Œ `60000` |
| `MEMORY_REVIEW_CANDIDATE_DUE_DAYS` | `14` | ๋ฐฐ์น˜๊ฐ€ `due_at`์— ๋”ํ•˜๋Š” ์ผ ์ˆ˜ (1~366) |

> **์ฐธ๊ณ **: ๋ง๊ฐ TTL, LLM/Ollama, ๊ฒ€์ƒ‰ ํ•œ๋„ ๋“ฑ ์ถ”๊ฐ€ ๋ณ€์ˆ˜๋Š” `env.example`์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

### ๋ง๊ฐ ์ •์ฑ… ์„ค์ •

```bash
FORGET_THRESHOLD=0.6
SOFT_DELETE_THRESHOLD=0.6
HARD_DELETE_THRESHOLD=0.8

TTL_SOFT_WORKING=2
TTL_SOFT_EPISODIC=30
TTL_SOFT_SEMANTIC=180
TTL_SOFT_PROCEDURAL=90
```

## ๐Ÿงช ํ…Œ์ŠคํŠธ

```bash
npm run test

npm run test:ci:core
npm run test:ci:server
npm test -w @jee1/memento-client
npm run benchmark:consolidation-quality

npm run test -- --watch
npm run test -- --coverage
```

๊ณต๊ฐœ ๋ฐ์ดํ„ฐ์…‹(LongMemEval-SยทLoCoMo)์œผ๋กœ ๊ฒ€์ƒ‰ ํ’ˆ์งˆ์„ ์žฌ๋Š” ํ•˜๋„ค์Šค๋Š” `npm run quality -- longmemeval acquire`ยท`npm run quality -- locomo acquire`๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์€ ๋’ค `npm run quality -- locomo benchmark`๋กœ ๋Œ๋ฆฝ๋‹ˆ๋‹ค. ์›๋ณธ ๋ฐ์ดํ„ฐ๋Š” ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์œผ๋ฉฐ, LoCoMo๋Š” **CC BY-NC 4.0(๋น„์ƒ์—…)** ์ด๋ผ ์ƒ์—…์  ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ ˆ์ฐจ์™€ ํ˜„์žฌ ์ˆ˜์น˜๋Š” [benchmark-datasets.md](docs/guides/ko/benchmark-datasets.md)์— ์žˆ๊ณ , ํ”„๋กœ๋•์…˜ ๊ฒ€์ƒ‰์ด ๋‹จ์ˆœ FTS ๋ฒ ์ด์Šค๋ผ์ธ์„ ๋„˜์ง€ ๋ชปํ•œ ์ƒํƒœ๋ผ ๋Œ€์™ธ ์ˆ˜์น˜๋กœ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

## ๐Ÿ“š ๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ๋ผ์ธ

- **ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ**: npm workspaces ๋ชจ๋…ธ๋ ˆํฌ โ€” `packages/memento-core`, `packages/memento-server`, `packages/memento-client`, `apps/*`. ์ƒ์„ธ: [AGENTS.md](AGENTS.md)
- **๋นŒ๋“œ/ํ…Œ์ŠคํŠธ**: `npm run build`(coreโ†’serverโ†’client), `npm run dev`ยท`npm start`(์„œ๋ฒ„), `npm run db:init`ยท`npm run db:migrate`(DB), `npm test`
- **์ฝ”๋”ฉ ์Šคํƒ€์ผ**: Node.js โ‰ฅ 24, TypeScript ES ๋ชจ๋“ˆ, 2์นธ ๋“ค์—ฌ์“ฐ๊ธฐ
- **ํ…Œ์ŠคํŠธ**: Vitest ๊ธฐ๋ฐ˜. ๋‹จ์œ„ยท์ŠคํŽ™์€ `packages/*/src/**/*.spec.ts`, ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ˆ˜์ค€ ํ†ตํ•ฉ ์ŠคํŽ™์€ ๋ฃจํŠธ `tests/`
- **์ปค๋ฐ‹/PR**: Conventional Commits, ํ•œ๊ตญ์–ด ์ปจํ…์ŠคํŠธ ํฌํ•จ

## ๐Ÿ“Š ์„ฑ๋Šฅ ์ง€ํ‘œ

### ๊ธฐ๋ณธ ์„ฑ๋Šฅ
- **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค**: ํ‰๊ท  ์ฟผ๋ฆฌ ์‹œ๊ฐ„ 0.16-0.22ms
- **๊ฒ€์ƒ‰**: 0.78-4.24ms (์บ์‹œ ํšจ๊ณผ๋กœ ๊ฐœ์„ )
- **๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰**: 11-15MB ํž™
- **๋™์‹œ ์—ฐ๊ฒฐ**: ์ตœ๋Œ€ 1000๊ฐœ

### ์ž„๋ฒ ๋”ฉ ์ œ๊ณต์ž ๋น„๊ต

#### ๋ฌด๋ฃŒ ์ œ๊ณต์ž (๋กœ์ปฌ ์ฒ˜๋ฆฌ)
- **TF-IDF**: 512์ฐจ์›, ๊ทน๋„๋กœ ๋น ๋ฆ„ (0.82ms), ๋‚ฎ์€ ๋ฉ”๋ชจ๋ฆฌ (4.48MB)
- **MiniLM**: 384์ฐจ์›, ๊ท ํ˜•์žกํžŒ ์„ฑ๋Šฅ, ๋‹ค๊ตญ์–ด ์ง€์›

#### ์œ ๋ฃŒ ์ œ๊ณต์ž (ํด๋ผ์šฐ๋“œ API)
- **OpenAI**: 1536์ฐจ์›, ์ตœ๊ณ  ์„ฑ๋Šฅ, ๋†’์€ ์ •ํ™•๋„
- **Gemini**: 768์ฐจ์›, ๊ณ ์„ฑ๋Šฅ, ๋‹ค๊ตญ์–ด ์ง€์›

**์ž๋™ ์„ ํƒ ์ˆœ์„œ**: ๋ช…์‹œ์  ์š”์ฒญ โ†’ `.env`์˜ `EMBEDDING_PROVIDER` โ†’ OpenAI(1) โ†’ Gemini(2) โ†’ MiniLM(3) โ†’ TF-IDF(4). ์ƒ์œ„ ์ œ๊ณต์ž ์‹คํŒจ ์‹œ ์ž๋™ ํด๋ฐฑ.

## ๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜ ์—ฌ์ •

Memento๋Š” ๊ฐœ์ธ์šฉ ๋กœ์ปฌ ์„œ๋ฒ„๋กœ ์‹œ์ž‘ํ•ด, ํŒ€ ํ˜‘์—…์„ ๊ฑฐ์ณ, ์กฐ์ง ๊ทœ๋ชจ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ”Œ๋žซํผ์œผ๋กœ ์„ฑ์žฅํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค.

**M1: ๊ฐœ์ธ์šฉ (ํ˜„์žฌ)** โ€” ์ง€๊ธˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋‹ค. SQLite ์ž„๋ฒ ๋””๋“œ, FTS5 + sqlite-vec ์ธ๋ฑ์Šค, ๋กœ์ปฌ ์‹คํ–‰. **์ธ์ฆ**: ๋ธŒ๋ผ์šฐ์ € ์„ธ์…˜ + ํ—ค๋” ๊ธฐ๋ฐ˜ ๋ถ„๋ฆฌ ์‹ ๋ขฐ ๋ชจ๋ธ(`/auth/session` ์ฟ ํ‚ค ์„ธ์…˜, `/admin`ยท`/api` ๋ธŒ๋ผ์šฐ์ € ์„ธ์…˜ ์š”๊ตฌ, `/tools`ยท`/mcp`๋Š” Bearer/API-Key ์š”๊ตฌ). MCP ๋„๊ตฌ 22๊ฐœ ๋“ฑ๋กยท๊ธฐ๋ณธ ๋…ธ์ถœ 4๊ฐœ(`MEMENTO_TOOLSET=full`๋กœ ์ „์ฒด), ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์€ HTTP API๋กœ ๋ถ„๋ฆฌ.

**M2: ํŒ€ ํ˜‘์—… (๊ณ„ํš)** โ€” SQLite ์„œ๋ฒ„ ๋ชจ๋“œ, API Key ์ธ์ฆ, Docker ๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ. ์—ฌ๋Ÿฌ ํŒ€์›์ด ํ•˜๋‚˜์˜ ๊ธฐ์–ต ๋ฐฑ์—”๋“œ๋ฅผ ๊ณต์œ ํ•œ๋‹ค.

**M3: ์กฐ์ง (๊ณ„ํš)** โ€” PostgreSQL + pgvector, JWT ์ธ์ฆ, Docker Compose. ์ˆ˜๋ฐฑ ๋ช…์˜ ์—์ด์ „ํŠธ๊ฐ€ ์กฐ์ง์˜ ๊ธฐ์–ต์„ ๊ณต์œ ํ•œ๋‹ค.

## โ“ ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

### Q: Memento๋Š” ์–ด๋–ค AI Agent์™€ ํ˜ธํ™˜๋˜๋‚˜์š”?
A: MCP(Model Context Protocol)๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  AI Agent์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. Claude, GPT-4, Gemini ๋“ฑ๊ณผ ์—ฐ๋™ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

### Q: ๊ธฐ์–ต ๋ฐ์ดํ„ฐ๋Š” ์–ด๋””์— ์ €์žฅ๋˜๋‚˜์š”?
A: ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ์ปฌ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(`./data/memory.db`)์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

### Q: OpenAI API ํ‚ค๊ฐ€ ํ•„์š”ํ•œ๊ฐ€์š”?
A: ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. API ํ‚ค ์—†์ด๋„ **TF-IDF** ๋˜๋Š” **MiniLM** ๊ธฐ๋ฐ˜ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ •ํ™•ํ•œ ๊ฒ€์ƒ‰์„ ์›ํ•œ๋‹ค๋ฉด OpenAI ๋˜๋Š” Gemini API ํ‚ค๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.

### Q: ๊ธฐ์–ต ์šฉ๋Ÿ‰์— ์ œํ•œ์ด ์žˆ๋‚˜์š”?
A: SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ œํ•œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ๊ธฐ์–ต์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

### Q: ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์™€ ๊ธฐ์–ต์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?
A: ํ˜„์žฌ M1์€ ๊ฐœ์ธ์šฉ์ž…๋‹ˆ๋‹ค. M2๋ถ€ํ„ฐ ํŒ€ ํ˜‘์—… ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

### Q: ๊ธฐ์–ต์ด ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜๋‚˜์š”?
A: ๋ง๊ฐ ์ •์ฑ…์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ธฐ์–ต์€ `pin` ๊ธฐ๋Šฅ์œผ๋กœ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

## ๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ

Memento ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? ์ž์„ธํ•œ ๊ฐ€์ด๋“œ: [CONTRIBUTING.md](CONTRIBUTING.md)

### ๋น ๋ฅธ ๊ธฐ์—ฌ ์‹œ์ž‘
1. **Fork** the Project
2. **Create** your Feature Branch (`git checkout -b feature/AmazingFeature`)
3. **Commit** your Changes (`git commit -m 'feat: add some AmazingFeature'`)
4. **Push** to the Branch (`git push origin feature/AmazingFeature`)
5. **Open** a Pull Request

### ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •
```bash
git clone https://github.com/your-username/memento.git
cd memento
npm install
npm run dev
npm run test
```

### ๊ธฐ์—ฌ ๋ฐฉ๋ฒ•
- ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ: [GitHub Issues](https://github.com/jee1/memento/issues)
- ๊ธฐ๋Šฅ ์ œ์•ˆ: ์ƒˆ๋กœ์šด ์•„์ด๋””์–ด๋ฅผ ์ œ์•ˆํ•ด์ฃผ์„ธ์š”
- ๋ฌธ์„œ ๊ฐœ์„ : ๋ฌธ์„œ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”
- ์ฝ”๋“œ ๊ธฐ์—ฌ: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ๋„์™€์ฃผ์„ธ์š”

## ๐Ÿ“„ ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” [MIT License](LICENSE) ํ•˜์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. `package.json`์˜ `"license": "MIT"` ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

## ๐Ÿ“ž ์ง€์›

- ์ด์Šˆ ๋ฆฌํฌํŠธ: [GitHub Issues](https://github.com/jee1/memento/issues)
- ๋ฌธ์„œ: [Wiki](https://github.com/jee1/memento/wiki)
- ๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ: [docs/guides/ko/developer-guide.md](docs/guides/ko/developer-guide.md)
- API ์ฐธ์กฐ: [docs/api/ko/api-reference.md](docs/api/ko/api-reference.md)

## ๐Ÿ™ ๊ฐ์‚ฌ์˜ ๋ง

- [Model Context Protocol](https://modelcontextprotocol.io/)
- [OpenAI](https://openai.com/)
- [better-sqlite3](https://github.com/WiseLibs/better-sqlite3)
- [Express](https://expressjs.com/)
- [Vitest](https://vitest.dev/)
- [TypeScript](https://www.typescriptlang.org/)

More