Featured

Deploy OpenClaw in 60 seconds β€” 20% off logoDeploy OpenClaw in 60 seconds β€” 20% off

Launch OpenClaw on Hostinger in about 60 seconds and keep your agent live 24/7. Our referral link gives you 20% off, no coupon code needed.

Launch on Hostinger β†’
Run your Hermes agent on Hostinger, fully managed logoRun your Hermes agent on Hostinger, fully managed

Launch Hermes on Hostinger in one click, fully managed, no VPS knowledge needed. Use code ZACAARON10 for 10% off.

Launch on Hostinger β†’
Crawl and scrape any site into clean data, 10% off logoCrawl and scrape any site into clean data, 10% off

Firecrawl crawls and scrapes any site into clean markdown for your agent. Get 1,000 free credits, and new users get 10% off their first purchase.

Try Firecrawl free β†’
Your own AI agent, running 24/7 with QwikClaw logoYour own AI agent, running 24/7 with QwikClaw

QwikClaw sets up and runs an always-on OpenClaw agent for you. One click, no config files, no server setup.

Deploy now β†’
One API to scrape, enrich, and extract the internet. logoOne API to scrape, enrich, and extract the internet.

Context.dev gives your agents a single API to scrape, enrich, and extract live web data β€” no proxies, no parsers, no maintenance.

Start building free β†’
SetupClaw: done-for-you OpenClaw for founders & exec teams logoSetupClaw: done-for-you OpenClaw for founders & exec teams

White-glove OpenClaw for founders and exec teams (4–50+ employees): we install, harden, integrate your tools, and maintain it β€” secured from day one.

Get it set up for you β†’
SEO data APIs for your agent, $1 free credit logoSEO data APIs for your agent, $1 free credit

DataForSEO gives your agent live access to SERP results, keyword data, backlinks, and on-page SEO data through one API. New accounts get a $1 credit, good for up to 20,000 keyword or backlink lookups.

Try DataForSEO free β†’
Reach 47,000+ AI builders

A flat monthly placement in front of developers actively installing AI tools. No lock-in, cancel anytime.

Advertise here β†’

Works with

Claude CodeClaude DesktopCursorVS CodeClineCodex CLIOpenClaw+ any MCP client

Install to Claude Code

This server doesn't publish a one-line install command. Follow the setup in the source repository.

Summary

claude-session-continuity-mcp MCP server](https://glama.ai/mcp/servers/leesgit/claude-session-continuity-mcp/badges/score.svg)](https://glama.ai/mcp/servers/leesgit/claude-session-continuity-mcp) πŸ“‡ 🏠 🍎 πŸͺŸ 🐧 - Zero-config session continuity for Claude Code.

README.md

passbaton

Session continuity for AI coding agents. Your agent picks up where it left off — never re-explain your project again. Persistent memory for Claude Code, OpenAI Codex CLI & Google Gemini CLI, sharing one local db: auto context injection, compaction handover, semantic search, and error→solution recall. Zero config, zero API cost, 100% local.

![npm version](https://www.npmjs.com/package/passbaton) ![npm downloads](https://www.npmjs.com/package/passbaton) ![License: MIT](https://opensource.org/licenses/MIT)

⚑ One install β†’ context auto-loads every session Β· 🧩 survives compaction (0 re-explaining) Β· πŸ”’ 100% local, $0 API

!Session continuity demo β€” your coding agent auto-restores project context on session start

Renamed (v2.0.0): this project was previously claude-session-continuity-mcp. The old name suggested it was Claude-only β€” it never was. Claude Code, Codex CLI, and Gemini CLI are all first-class and share one local memory. Existing installs keep working: the old claude-hook-* commands still ship as aliases. See Migrating from v1.

The Problem

Every new session β€” whether you're in Claude Code, Codex CLI, or Gemini CLI:

"This is a Next.js 15 project with App Router..."
"We decided to use Server Actions because..."
"Last time we were working on the auth system..."
"The build command is pnpm build..."

5 minutes of context-setting. Every. Single. Time.

The Solution

Fully automatic. Lifecycle hooks handle everything without manual calls β€” on Claude Code, OpenAI Codex CLI, and Google Gemini CLI, sharing one local memory so context carries across all three:

# Session start β†’ Auto-loads relevant context + recent session history
# When asking β†’ Auto-injects relevant memories/solutions
# During conversation β†’ Tracks active files + auto-injects error solutions
# On compact β†’ Structured handover context for continuity
# On exit β†’ Extracts commits, decisions, error-fix pairs from transcript
← Auto-output on session start:
# my-app - Session Resumed

πŸ“ **State**: Implementing signup form

## Recent Sessions
### 2026-02-28
**Work**: Completed OAuth integration with Google provider
**Commits**: feat: add OAuth callback handler; fix: redirect URI config
**Decisions**: Use Server Actions instead of API routes

### 2026-02-27
**Work**: Set up authentication foundation
**Next**: Implement signup form validation

## Directives
- πŸ”΄ Always use Zod for form validation
- πŸ“Ž Prefer Server Components by default

## Key Memories
- 🎯 Decided on App Router, using Server Actions
- ⚠️ OAuth redirect_uri mismatch β†’ check env file

Zero manual work. Context follows you.

---

Why this over other memory tools?

Most Claude memory tools rely on explicit tool calls ("remember this"), a cloud API, or a background AI worker. This one is deliberately different:

| | passbaton | Typical cloud/AI-memory MCP | |---|---|---| | Setup | npm i -g β†’ hooks auto-install | Manual server + API key | | Trigger | 5 automatic hooks (no commands) | You call a remember tool | | Storage | 100% local SQLite | Cloud / external service | | API cost | $0 β€” local embeddings | Per-token / subscription | | Latency | < 5ms (on-device) | Network round-trip | | Privacy | Never leaves your machine | Sent to a provider | | Search | FTS5 + local semantic, KO/EN/JA cross-lingual | Varies |

If you want zero-config, offline, no-cost memory that just happens while you work β€” this is it.

Auto-injection vs. explicit search

There's also a great class of local search tools (e.g. ctx) that index your agent history so you can query it (search "failed migration"). That's complementary, not the same job:

| | passbaton | Local-search tools (ctx, etc.) | |---|---|---| | How you use it | Automatic β€” context appears on session start, no command | You (or the agent) run a search query | | Compaction | PreCompact hook re-injects a handover β†’ 0 context re-explained after a compact | Not its job (it's a search index) | | Best at | Never losing your thread across sessions & compacts, hands-off | Finding a specific past decision/command on demand | | Coverage | Claude Code + Codex CLI + Gemini CLI (where auto-injection is possible) | Often 30+ agents indexed for search |

Use search when you want to look something up. Use this when you want your context to follow you without asking.

---

Codex CLI support (v1.16.0+)

Beyond Claude Code, this also supports OpenAI Codex CLI. If ~/.codex exists, the installer registers the same hooks in ~/.codex/hooks.json (SessionStart, UserPromptSubmit, PreCompact, Stop), and the hooks auto-detect the host and emit the right output format (Codex's hookSpecificOutput.additionalContext).

The same local sessions.db is shared, so context carries across both agents: what you did in Codex is available in Claude Code and vice versa.

Scope: session save + context injection work on both. Codex file-change tracking (PostToolUse) isn't wired yet β€” session save already covers most of it via transcript parsing. Codex's transcript_path is treated as an unstable interface (it can be null at startup), so host detection uses an installer-injected --codex marker rather than relying on the path.

---

Gemini CLI support (v1.17.0+)

Also supports Google Gemini CLI. If ~/.gemini exists, the installer registers the hooks in ~/.gemini/settings.json (SessionStart, BeforeAgent, PreCompress, SessionEnd β€” Gemini's event names), preserving your other settings. Same shared local sessions.db, so context carries across all three agents.

Gemini's transcript format was verified against real ~/.gemini/tmp/.../chats/*.jsonl files β€” it uses two shapes (a flat {type, content} line and an older {"$set":{"messages":[…]}} diff line); the parser handles both. Like Codex, transcript_path can be null at startup, so host detection uses a --gemini marker.

Honest scope note: session save (SessionEnd) and context output are verified working. Gemini's SessionStart context injection is documented as advisory-only upstream (gemini-cli#15413) β€” if your Gemini build doesn't render the injected context on startup, that's an upstream limit, not this tool. Session continuity still works via the saved history.

---

Migrating from v1

If you installed this as claude-session-continuity-mcp (v1.x), nothing breaks β€” the v1 claude-hook-* commands still ship as aliases in v2.

To move to the new name:

npm install -g passbaton          # installs the new package
npm uninstall -g claude-session-continuity-mcp   # optional: drop the old one

The installer rewrites your hook entries to passbaton-hook- and removes the old claude-hook- lines β€” it matches on both names, so you won't end up with duplicates. Your existing sessions.db is untouched: all past sessions, memories, and solutions carry over.

Nothing else changes β€” same hooks, same database, same behavior.

---

Quick Start

Requires Node.js 22+. The native better-sqlite3 dependency only ships prebuilt binaries for Node 22, 24, and 26 (the currently supported lines β€” Node 18 and 20 are both end-of-life). On older Node it falls back to compiling from source, which fails without build tools. Node 22 and up install cleanly with no compiler needed.

Recommended: Global Installation

npm install -g passbaton

That's it! The postinstall script automatically:

  1. Registers MCP server in ~/.claude.json
  2. Installs Claude Hooks in ~/.claude/settings.json

Why Global (-g)?

This tool is designed to track all your Claude Code projects in a single unified database. Global installation is strongly recommended because:

| Reason | Detail | |---|---| | Single source of truth | One binary serves every project β€” no version drift between projects | | Hooks are user-scoped | ~/.claude/settings.json lives in your home directory, not per-project | | Cross-project context | Sessions from app-a and app-b share the same DB and search index | | One update = everything refreshed | npm install -g <latest> updates all projects at once; no per-project reinstall | | npm exec resolves global first | Hooks call npm exec -- passbaton-hook-* which finds the global package reliably regardless of cwd |

Important: Even with global install, you can still disable the hook for specific projects (see below). Global β‰  forced on every project.

Disabling Hooks for Specific Projects

Global install does not mean "always on everywhere". You have three layers of control:

| Layer | File | Scope | |---|---|---| | 1. Global ON (default) | ~/.claude/settings.json | All projects | | 2. Project-wide OFF | <project>/.claude/settings.json | Whole team (committed) | | 3. Personal-only OFF | <project>/.claude/settings.local.json | Just you (gitignored) |

To disable hooks in a specific project, create the override file with empty hook arrays:

// <project>/.claude/settings.json  (or settings.local.json for personal-only)
{
  "hooks": {
    "SessionStart": [],
    "UserPromptSubmit": [],
    "PostToolUse": [],
    "PreCompact": [],
    "Stop": []
  }
}

Empty arrays override the global setting β†’ that project's sessions are no longer tracked.

Updating to a New Version

npm install -g passbaton@latest

That's the only step β€” all projects pick up the new binary on next Claude Code restart. No need to reinstall in each project.

Alternative: Local Install (Not Recommended)

If you really want per-project install (e.g., locked version for one project): ``bash cd <project> && npm install passbaton ` Drawback: you must install separately in every project, and npm exec may not find the local copy reliably from hook context (cwd-dependent). Stick with -g` unless you have a specific reason.

What Gets Installed

MCP Server (in ~/.claude.json): ``json { "mcpServers": { "project-manager": { "command": "npx", "args": ["passbaton"] } } } ``

Claude Hooks (in ~/.claude/settings.json): ``json { "hooks": { "SessionStart": [{ "hooks": [{ "type": "command", "command": "npm exec -- passbaton-hook-session-start" }] }], "UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "npm exec -- passbaton-hook-user-prompt" }] }], "PostToolUse": [{ "matcher": "Edit", "hooks": [{ "type": "command", "command": "npm exec -- passbaton-hook-post-tool" }] }, { "matcher": "Write", "hooks": [{ "type": "command", "command": "npm exec -- passbaton-hook-post-tool" }] }], "PreCompact": [{ "hooks": [{ "type": "command", "command": "npm exec -- passbaton-hook-pre-compact" }] }], "Stop": [{ "hooks": [{ "type": "command", "command": "npm exec -- passbaton-hook-session-end" }] }] } } ``

Note (v1.5.0+): Full lifecycle coverage with 5 hooks. Uses npm exec -- which finds local node_modules/.bin first.

Installed Hooks (v1.5.0+)

| Hook | Command | Function | |------|---------|----------| | SessionStart | passbaton-hook-session-start | Auto-loads project context on session start | | UserPromptSubmit | passbaton-hook-user-prompt | Auto-injects relevant memories + past reference search | | PostToolUse | passbaton-hook-post-tool | Tracks active files (Edit, Write) + auto-injects error solutions (Bash) | | PreCompact | passbaton-hook-pre-compact | Structured handover context before compression | | Stop | passbaton-hook-session-end | Extracts commits, decisions, error-fix pairs from transcript |

Manual Hook Management

# Check hook status
npx passbaton-hooks status

# Reinstall hooks
npx passbaton-hooks install

# Remove hooks
npx passbaton-hooks uninstall

3. Restart Claude Code

After installation, restart Claude Code to activate the hooks.

---

Features

| Feature | Description | |---------|-------------| | πŸ€– Zero Manual Work | Claude Hooks automate all context capture/load | | 🎯 Quality Memory Only | (v1.10.0) Only decisions, learnings, errors β€” no file-change noise | | 🧠 Semantic Search | multilingual-e5-small embedding (94+ languages, 384d) | | 🌍 Multilingual | Korean/English/Japanese + cross-language search (ENβ†’KR, KRβ†’EN) | | πŸ”— Git Integration | Commit messages auto-extracted from transcripts | | πŸ•ΈοΈ Knowledge Graph | Memory relations (solves, causes, extends...) | | πŸ“Š Memory Classification | 5 types: observation, decision, learning, error, pattern | | βœ… Integrated Verification | One-click build/test/lint execution | | πŸ“‹ Task Management | Priority-based task management | | πŸ”§ Auto Errorβ†’Solution | (v1.12.0) Bash errors auto-detect β†’ inject past solutions; session-end auto-records error-fix pairs | | πŸ’° Token Efficiency | (v1.11.0) Removed loadContext from UserPromptSubmit (saves 24-60K tokens/session) | | πŸ“‘ Progressive Disclosure | (v1.11.0) memory_search returns index first, memory_get for full content | | ⏳ Temporal Decay | (v1.11.0) Memory scoring with type-specific half-lives for relevance | | πŸ“ Structured Handover | (v1.10.0) PreCompact saves work summary, active files, pending actions | | πŸšͺ Smart Session End | (v1.10.0) Extracts commits, decisions, error-fix pairs from transcript | | πŸ—‘οΈ Auto Noise Cleanup | (v1.10.0) Auto-deletes stale observation memories (3d+) | | πŸ” Past Reference Detection | (v1.8.0) "μ €λ²ˆμ— X μ–΄λ–»κ²Œ ν–ˆμ–΄?" auto-searches DB | | πŸ“ User Directive Extraction | (v1.8.0) Auto-extracts "always/never" rules from prompts |

---

Feature toggles β€” everything is opt-in

(v2.1.0+) Five behaviours are individually toggleable; the rest are shown for transparency but are always on (a hook's mere existence is controlled by your settings.json, not by config) or not yet wired. Config lives in a plain, hand-editable JSON file (~/.claude/passbaton.config.json) β€” separate from your data, so it survives a db reset. No file = today's defaults (nothing changes for existing users).

passbaton config                            # grouped table; ●/β—‹ = toggleable, Β· = always on
passbaton config set solutionCapture off    # flip a toggleable feature
passbaton config set strictSolutionGate on  # opt into the strict error→fix filter
passbaton config preset minimal             # minimal | default | everything
passbaton config reset                       # back to defaults
passbaton config path                        # print the active config file path

Trying to set an always-on / not-yet-wired feature is rejected with a clear message. Each toggleable feature also has an env override for one-off/CI use: PASSBATON_<FEATURE>=0 (e.g. PASSBATON_SOLUTIONCAPTURE=0) wins over the config file.

On-by-default rule: a feature ships on only if it's silent, safe, and universally useful. Anything that speaks unprompted, guesses, or writes speculative rows ships off.

Legend: ●/β—‹ = toggleable (on/off) Β· Β· = always on, not a config toggle Β· β‹― = not yet wired.

Core (on by default)

| Feature | Key | Toggle | What it does | |---|---|---|---| | Session start injection | sessionStart | Β· always on | Restore prior context on start | | Compaction handover+ | compactionHandover | ● toggleable | Before a compaction, carry over your working state plus hot files and last build status β€” the one gap platform auto-memory structurally can't cover | | Session persist | sessionEnd | Β· always on | Save session state on exit | | Auto memory surfacing | autoInject | Β· always on | Auto-surface relevant past memories on start | | Task tracking | taskTracking | Β· always on | Read/write the task list via MCP + hooks | | Hot-path pre-warm | hotPathPrewarm | ● toggleable | On start, surface the files you edit most in this project, ranked by real access count | | Verification ledger | verificationLedger | ● toggleable | Warn on start if a recent session left the build red or issues open |

sessionStart/sessionEnd are "always on" because a hook either runs or it doesn't β€” that's controlled by the hook registration in ~/.claude/settings.json, not by config. To disable them, remove the hook there.

Cross-agent (on by default)

| Feature | Key | Toggle | What it does | |---|---|---|---| | Cross-agent share | crossAgentSync | Β· inherent | One local db shared across Claude Code / Codex / Gemini (not a toggle β€” it's how storage works) | | Tool-use capture | postToolCapture | Β· always on | Observe tool use to build hot-paths (low-noise) | | Solution capture | solutionCapture | ● toggleable | Auto-record errorβ†’fix pairs to a solution archive. Set off to skip it entirely (session save is unaffected) |

Experimental (off by default)

| Feature | Key | Toggle | What it does | |---|---|---|---| | Strict solution gate | strictSolutionGate | ○ opt-in | Stricter error→fix capture filter — fewer noise entries, but may drop some real ones | | Trigger matching | triggerMatching | ⋯ not yet wired | (planned) Match prompt keywords to auto-inject solutions | | Pattern mining | patternMining | ⋯ not yet wired | (planned) Mine work patterns and suggest workflows | | Memory auto-store | memoryAutoStore | ⋯ not yet wired | (planned) Auto-write observation memories from prompts | | Status line | statusLineInject | ⋯ not yet wired | (planned) Append a passbaton status line to session-start output |

The only genuinely user-flippable flags today are compactionHandover, hotPathPrewarm, verificationLedger, solutionCapture (on) and strictSolutionGate (opt-in).

---

Claude Hooks - Auto Context System

How It Works

SessionStart Hook (npx passbaton-hook-session-start):

  • Auto-detects project: monorepo (apps/project-name/) or single project (package.json root folder name)
  • Loads context from .claude/sessions.db
  • Injects: Current state, 3 recent sessions with commits/decisions, directives, pending tasks, filtered key memories
  • Auto-cleans stale noise memories (3d+ auto-tracked, 14d+ auto-compact)

UserPromptSubmit Hook (npx passbaton-hook-user-prompt):

  • Runs on every prompt submission
  • (v1.11.0) No longer calls loadContext() β€” saves 24-60K tokens/session
  • Injects relevant context (filtered: decisions, learnings, errors only)

PostToolUse Hook (npx passbaton-hook-post-tool):

  • Tracks hot file paths and updates active_context.recent_files
  • (v1.12.0) Auto-detects Bash errors β†’ searches solutions DB β†’ injects past solutions into context
  • No longer creates observation memories (v1.10.0 β€” eliminates [File Change] noise)

PreCompact Hook (npx passbaton-hook-pre-compact):

  • Builds structured handover context: work summary, active file, pending action, key facts, recent errors
  • No longer stores auto-compact memories (v1.10.0)

Stop Hook (npx passbaton-hook-session-end):

  • Extracts commit messages from JSONL transcript (git commit -m patterns)
  • Extracts error-fix pairs (error β†’ resolution within 3 messages)
  • (v1.12.0) Auto-records errorβ†’fix pairs to solutions table for future reuse
  • Extracts decisions ("because", "instead of", "chose" patterns)
  • (v1.11.0) Single-pass transcript parsing (4 JSONL reads β†’ 1)
  • Stores structured metadata in sessions.issues column as JSON

Example Output (Session Start)

# my-app - Session Resumed

πŸ“ **State**: Implementing signup form
🚧 **Blocker**: OAuth callback URL issue

## Recent Sessions
### 2026-02-28
**Work**: Completed OAuth integration
**Commits**: feat: add OAuth handler; fix: redirect config
**Decisions**: Use Server Actions over API routes
**Next**: Implement form validation

## Directives
- πŸ”΄ Always use Zod for validation

## Pending Tasks
- πŸ”„ [P8] Implement form validation
- ⏳ [P5] Add error handling

## Key Memories
- 🎯 Decided on App Router, using Server Actions
- ⚠️ OAuth redirect_uri mismatch β†’ check env file

Hook Management

# Check status
npx passbaton-hooks status

# Reinstall
npx passbaton-hooks install

# Remove
npx passbaton-hooks uninstall

# Temporarily disable
export MCP_HOOKS_DISABLED=true

Past Reference Detection (v1.8.0)

When you ask about past work, the UserPromptSubmit hook automatically searches the database:

You: "μ €λ²ˆμ— μΈμ•±κ²°μ œ μ–΄λ–»κ²Œ ν–ˆμ–΄?"
β†’ Hook detects "μ €λ²ˆμ—" + extracts keyword "μΈμ•±κ²°μ œ"
β†’ Searches sessions, memories (FTS5), and solutions
β†’ Injects matching results into context automatically

Supported patterns (Korean & English):

| Pattern | Example | |---------|---------| | μ €λ²ˆμ—/전에/이전에 ... μ–΄λ–»κ²Œ | "μ €λ²ˆμ— CORS μ—λŸ¬ μ–΄λ–»κ²Œ ν•΄κ²°ν–ˆμ§€?" | | ~ν–ˆλ˜/λ§Œλ“€μ—ˆλ˜/ν•΄κ²°ν–ˆλ˜ | "μˆ˜μ •ν–ˆλ˜ 둜그인 둜직" | | μ§€λ‚œ μ„Έμ…˜/μž‘μ—…μ—μ„œ | "μ§€λ‚œ μ„Έμ…˜μ—μ„œ 결제 κ΅¬ν˜„" | | last time/before/previously | "How did we handle auth last time?" | | did we/did I ... before | "Did we fix the database migration before?" | | remember when/recall when | "Remember when we set up CI?" |

Output example: ```markdown

Related Past Work (auto-detected from your question)

Sessions

  • [2/14] 카카였 둜그인 μ•±ν‚€ μˆ˜μ •, μΈμ•±κ²°μ œ IAP ν”Œλ‘œμš° μˆ˜μ •

Memories

  • 🎯 [decision] ν…ŒμŠ€νŠΈ: μΈμ•±κ²°μ œ μƒν’ˆ 등둝 μ™„λ£Œ

Solutions

  • IAP_BILLING_ERROR: StoreKit 2 migration으둜 ν•΄κ²°

### Why npm exec? (v1.4.3+)

Previous versions used absolute paths or `npx`:

// v1.3.x - absolute paths (broke on multi-project) "command": "node \"/path/to/project-a/node_modules/.../session-start.js\""

// v1.4.0-1.4.2 - npx (required global install or hit npm registry) "command": "npx passbaton-hook-session-start" ```

Now we use npm exec --: ``json "command": "npm exec -- passbaton-hook-session-start" ``

npm exec -- finds local node_modules/.bin first, then falls back to global. Works with both local and global installation without hitting npm registry.

---

Tools (v5 API) - 25 Focused Tools

1. Session Lifecycle (4) ⭐

// Start of session - auto-loads context
session_start({ project: "my-app", compact: true })

// End of session - auto-saves context
session_end({
  project: "my-app",
  summary: "Completed auth flow",
  modifiedFiles: ["src/auth.ts", "src/login/page.tsx"]
})

// View session history
session_history({ project: "my-app", limit: 5 })

// Semantic search past sessions
search_sessions({ query: "auth work", project: "my-app" })

2. Project Management (4)

// Get project status with task stats
project_status({ project: "my-app" })

// Initialize new project
project_init({ project: "my-app" })

// Analyze project tech stack
project_analyze({ project: "my-app" })

// List all projects
list_projects()

3. Task Management (4)

// Add a task
task_add({ project: "my-app", title: "Implement signup", priority: 8 })

// Update task status
task_update({ taskId: 1, status: "done" })

// List tasks
task_list({ project: "my-app", status: "pending" })

// Suggest tasks from TODO comments
task_suggest({ project: "my-app" })

4. Solution Archive (3)

// Record an error solution
solution_record({
  errorSignature: "TypeError: Cannot read property 'id'",
  solution: "Use optional chaining: user?.id"
})

// Find similar solutions (keyword or semantic)
solution_find({ query: "TypeError property", semantic: true })

// AI-powered solution suggestion
solution_suggest({ errorMessage: "Cannot read property 'email'" })

5. Verification (3)

// Run build
verify_build({ project: "my-app" })

// Run tests
verify_test({ project: "my-app" })

// Run all (build + test + lint)
verify_all({ project: "my-app" })

6. Memory System (5)

// Store a classified memory
memory_store({
  content: "State management with Riverpod makes testing easier",
  type: "learning",  // observation, decision, learning, error, pattern
  project: "my-app",
  tags: ["flutter", "state-management"],
  importance: 8,
  relatedTo: 23  // Connect to existing memory
})

// Search memories β€” returns index (id, type, tags, score) for token efficiency
memory_search({
  query: "state management test",
  type: "learning",
  semantic: true,  // Use embedding similarity
  limit: 10
})

// Get full memory content by ID (v1.11.0)
memory_get({ memoryId: 23 })

// Find related memories (graph + semantic)
memory_related({
  memoryId: 23,
  includeGraph: true,
  includeSemantic: true
})

// Get memory statistics
memory_stats({ project: "my-app" })

7. Knowledge Graph (2)

// Connect two memories with a typed relation
graph_connect({
  sourceId: 23,
  targetId: 25,
  relation: "solves",  // related_to, causes, solves, depends_on, contradicts, extends, example_of
  strength: 0.9
})

// Explore knowledge graph
graph_explore({
  memoryId: 23,
  depth: 2,
  relation: "all",  // or specific relation type
  direction: "both"  // outgoing, incoming, both
})

Memory Types

| Type | Description | Use Case | |------|-------------|----------| | observation | Patterns, structures found in codebase | "All screens are separated in features/ folder" | | decision | Architecture, library choices | "Decided to use SharedPreferences for caching" | | learning | New knowledge, best practices | "Riverpod is better for testing" | | error | Occurred errors and solutions | "Provider.read() doesn't rebuild β†’ use watch()" | | pattern | Recurring code patterns, conventions | "Avoid late keyword abuse" |

Relation Types

| Relation | Description | Example | |----------|-------------|---------| | related_to | General relation | A and B are related | | causes | A causes B | Caching decision β†’ folder structure change | | solves | A solves B | Riverpod learning β†’ Provider bug fix | | depends_on | A depends on B | Folder structure β†’ Caching decision | | contradicts | A conflicts with B | Two design decisions conflict | | extends | A extends B | late pattern β†’ Extended to Riverpod learning | | example_of | A is example of B | Specific code is example of pattern |

---

Data Storage

SQLite database at ~/.claude/sessions.db:

| Table | Purpose | |-------|---------| | memories | Classified memories (observation, decision, learning, error, pattern) | | memories_fts | Full-text search index (FTS5) | | memory_relations | Knowledge graph relations | | embeddings_v4 | Semantic search vectors (multilingual-e5-small, 384d) | | project_context | Fixed project info (tech stack, decisions) | | active_context | Current work state | | tasks | Task backlog | | solutions | Error solution archive | | sessions | Session history |

---

Environment Variables

| Variable | Default | Description | |----------|---------|-------------| | WORKSPACE_ROOT | - | Workspace root path (required) | | MCP_HOOKS_DISABLED | false | Disable Claude Hooks | | LOG_LEVEL | info | Log level (debug/info/warn/error) | | LOG_FILE | - | Optional file logging path |

---

Development

# Clone
git clone https://github.com/leesgit/passbaton.git
cd passbaton

# Install
npm install

# Build
npm run build

# Test
npm test

# Test with coverage
npm run test:coverage

---

Performance

| Metric | Value | |--------|-------| | Context load (cached) | <5ms | | Memory search (FTS) | ~10ms | | Semantic search | ~50ms | | Build verification | Project-dependent |

---

Roadmap

  • [x] v2 API (15 focused tools)
  • [x] v4 API (24 tools - memory + graph)
  • [x] v5 Claude Hooks (auto-capture)
  • [x] Knowledge Graph with typed relations
  • [x] Memory classification (6 types)
  • [x] Semantic search (embeddings)
  • [x] Multilingual pattern detection (KO/EN/JA)
  • [x] Git commit integration
  • [x] 111 tests (6 test suites)
  • [x] GitHub Actions CI/CD
  • [x] Multilingual semantic search (v1.6.0 - multilingual-e5-small)
  • [x] Cross-language search EN↔KR (v1.6.0)
  • [x] Solution semantic search (v1.6.0)
  • [x] Fix hooks settings file path (v1.6.1 - settings.json, not settings.local.json)
  • [x] Auto-migrate legacy hooks (v1.6.1)
  • [x] Fix PostToolUse matcher format to string (v1.6.3)
  • [x] Fix README documentation for new hook format (v1.6.4)
  • [x] Empty session skip and techStack save improvements (v1.7.1)
  • [x] Past reference auto-detection in UserPromptSubmit hook (v1.8.0)
  • [x] User directive extraction ("always/never" rules) (v1.8.0)
  • [x] Memory quality overhaul β€” no more [File Change] noise (v1.10.0)
  • [x] Structured handover context in PreCompact (v1.10.0)
  • [x] Smart session-end: commit/decision/error-fix extraction from transcript (v1.10.0)
  • [x] Auto noise cleanup (3d+ observations, 14d+ auto-compact) (v1.10.0)
  • [x] 3 recent sessions display with structured metadata (v1.10.0)
  • [x] Token efficiency β€” remove loadContext from UserPromptSubmit, saves 24-60K tokens/session (v1.11.0)
  • [x] Single-pass transcript parsing, 4 JSONL reads β†’ 1 (v1.11.0)
  • [x] Temporal decay for memory scoring with type-specific half-lives (v1.11.0)
  • [x] Progressive disclosure β€” memory_search returns index, memory_get for full content (v1.11.0)
  • [x] Memory consolidation via Jaccard similarity (v1.11.0)
  • [x] Auto errorβ†’solution pipeline β€” PostToolUse detects Bash errors, injects past solutions (v1.12.0)
  • [x] SessionEnd auto-records error-fix pairs to solutions table (v1.12.0)
  • [x] Cross-project solution search with current project prioritization (v1.12.0)
  • [ ] sqlite-vec native vector search (v2 - when data > 1000 records)
  • [ ] Web dashboard
  • [ ] Cloud sync option

---

Contributing

PRs welcome! Please:

  1. Fork the repo
  2. Create a feature branch
  3. Add tests for new features
  4. Ensure npm test passes
  5. Submit PR

---

License

MIT Β© Byeongchang Lee

---

Acknowledgments

---

<div align="center">

If this saves you from re-explaining your project, consider giving it a ⭐ β€” it genuinely helps others find it.

</div>

See related servers & alternatives β†’

Related MCP servers

Browse all β†’

Related guides

Hand-picked reading to help you choose and use Vector & Memory servers.