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)
</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
```

## ๐ ๋ฌธ์
์ ์ฒด ๋ฌธ์ ๋ชฉ๋กยท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/)