Skip to main content
Glama
jee1
by jee1

๐Ÿง  Memento

๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด | ๐Ÿ‡บ๐Ÿ‡ธ English

License: MIT


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

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

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

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

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

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

Related MCP server: mcp-memory

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

๋‹จ์ˆœํ•œ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋‹ค. 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.

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๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

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

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

์›ํด๋ฆญ ์„ค์น˜ (๊ถŒ์žฅ)

curl -sSL https://raw.githubusercontent.com/jee1/memento/main/install.sh | bash

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

Windows (PowerShell/CMD)

npx memento-mcp-server@latest dev
npx memento-mcp-server@latest
npx memento-mcp-server@latest setup

Linux/macOS

npx memento-mcp-server@latest dev
npx memento-mcp-server@latest
npx memento-mcp-server@latest setup

์ฐธ๊ณ : npm exec ์‚ฌ์šฉ ์‹œ ๋ช…๋ น์–ด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

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.

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 ์ด๋ฆ„์œผ๋กœ ๋“ฑ์žฌ๋ฉ๋‹ˆ๋‹ค. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์ฝ๋Š” ํด๋ผ์ด์–ธํŠธยท๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์—์„œ ์ด ์ด๋ฆ„์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

Docker ๋ฐฉ์‹ (ํ”„๋กœ๋•์…˜์šฉ)

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 ์šด์˜ ๊ฐ€์ด๋“œ.

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

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๋ฅผ ์ „๋‹ดํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

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์— ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "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"
      }
    }
  }
}

์ƒ์„ธ ์„ค์น˜ ๊ฐ€์ด๋“œ

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

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

@jee1/memento-assistant SDK๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™ recall/remember๋ฅผ ์ฝ”๋“œ ๋‘ ์ค„๋กœ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” SDK quickstart

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

AI Agent์™€์˜ ์—ฐ๋™

// ์ผํ™”๊ธฐ์–ต์œผ๋กœ ํ•™์Šต ๋‚ด์šฉ ์ €์žฅ
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
  }
});

์˜๋ฏธ๊ธฐ์–ต์œผ๋กœ ์ง€์‹ ๊ด€๋ฆฌ

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

์ ˆ์ฐจ๊ธฐ์–ต์œผ๋กœ ์›Œํฌํ”Œ๋กœ ๋ณด์กด

// ๋ฐ˜๋ณต ์ž‘์—… ์ ˆ์ฐจ๋ฅผ ์ ˆ์ฐจ๊ธฐ์–ต์œผ๋กœ ์ €์žฅ (๋ฒ„์ „ ๊ด€๋ฆฌ๋จ)
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 ํ›„ ์•„๋ž˜์ฒ˜๋Ÿผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

{
  "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 ๋ชจ๋“œ (๋‹ค์ค‘ ์—์ด์ „ํŠธ ๊ณต์œ  ์„œ๋ฒ„)

npm run build && npm run start:http   # ๊ธฐ๋ณธ ํฌํŠธ: 9001 (env.exampleยทDocker์™€ ๋™์ผ)
{
  "mcpServers": {
    "memento": {
      "type": "http",
      "url": "http://127.0.0.1:9001/mcp"
    }
  }
}

npx๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ (์†Œ์Šค ๋นŒ๋“œ ์—†์ด):

{
  "mcpServers": {
    "memento": {
      "command": "npx",
      "args": ["memento-mcp-server@latest"],
      "env": {
        "DB_PATH": "/absolute/path/to/data/memory.db"
      }
    }
  }
}

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

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"
  }
});
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/* ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

  • ์‹ค์‹œ๊ฐ„ ๋ฉ”ํŠธ๋ฆญ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๊ฒ€์ƒ‰, ๋ฉ”๋ชจ๋ฆฌ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง

  • ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ: 30์ดˆ๋งˆ๋‹ค ์ž๋™ ์„ฑ๋Šฅ ์ฒดํฌ ๋ฐ ์ž„๊ณ„๊ฐ’ ๊ธฐ๋ฐ˜ ์•Œ๋ฆผ

  • ์—๋Ÿฌ ๋กœ๊น…: ๊ตฌ์กฐํ™”๋œ ์—๋Ÿฌ ๋กœ๊น… ๋ฐ ํ†ต๊ณ„ ์ˆ˜์ง‘

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ตœ์ ํ™”: ์ž๋™ ์ธ๋ฑ์Šค ์ถ”์ฒœ ๋ฐ ์ƒ์„ฑ

  • ์บ์‹œ ์‹œ์Šคํ…œ: LRU + TTL ๊ธฐ๋ฐ˜ ์บ์‹ฑ

  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ: ์›Œ์ปค ํ’€ ๊ธฐ๋ฐ˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

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

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

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

Memento Memory Graph View

๐Ÿ“š ๋ฌธ์„œ

์ „์ฒด ๋ฌธ์„œ ๋ชฉ๋กยทKO/EN ๋งคํ•‘: docs/README.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 ์„œ๋ฒ„ ๋Ÿฐํƒ€์ž„ ์‚ฌ์šฉ๋ฒ•

์•ต์ปค ๊ด€๋ฆฌ

์—”๋“œํฌ์ธํŠธ

์„ค๋ช…

๋ฉ”์„œ๋“œ

/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๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

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 ์ฐธ๊ณ )

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์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

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

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

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

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์— ์žˆ๊ณ , ํ”„๋กœ๋•์…˜ ๊ฒ€์ƒ‰์ด ๋‹จ์ˆœ FTS ๋ฒ ์ด์Šค๋ผ์ธ์„ ๋„˜์ง€ ๋ชปํ•œ ์ƒํƒœ๋ผ ๋Œ€์™ธ ์ˆ˜์น˜๋กœ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

  • ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ: npm workspaces ๋ชจ๋…ธ๋ ˆํฌ โ€” packages/memento-core, packages/memento-server, packages/memento-client, apps/*. ์ƒ์„ธ: 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

๋น ๋ฅธ ๊ธฐ์—ฌ ์‹œ์ž‘

  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

๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •

git clone https://github.com/your-username/memento.git
cd memento
npm install
npm run dev
npm run test

๊ธฐ์—ฌ ๋ฐฉ๋ฒ•

  • ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ: GitHub Issues

  • ๊ธฐ๋Šฅ ์ œ์•ˆ: ์ƒˆ๋กœ์šด ์•„์ด๋””์–ด๋ฅผ ์ œ์•ˆํ•ด์ฃผ์„ธ์š”

  • ๋ฌธ์„œ ๊ฐœ์„ : ๋ฌธ์„œ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”

  • ์ฝ”๋“œ ๊ธฐ์—ฌ: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ๋„์™€์ฃผ์„ธ์š”

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

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

๐Ÿ“ž ์ง€์›

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityActive
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

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/jee1/memento'

If you have feedback or need assistance with the MCP directory API, please join our Discord server