If mcp-recall --version still shows the old version after upgrading, the hook script is pointing at a stale binary path. Re-run the install step to fix it:
# npm / bun global install
bun update -g mcp-recall && mcp-recall install
# from source
git pull && bun install && bun run build && mcp-recall installmcp-recall install is idempotent — it rewrites the hook and MCP server paths without touching stored data or config. Restart Claude Code afterward so the MCP server picks up the new binary.
claude --debug
# Look for plugin loading errorsConfirm Bun is installed and on your PATH:
bun --versionThe most common cause is the hook script not being executable:
ls -la $(claude plugin path mcp-recall)/bin/recall
# Should show -rwxr-xr-xIf not executable, reinstall the plugin:
claude plugin uninstall mcp-recall@mcp-recall
claude plugin install mcp-recall@mcp-recallIf the issue persists, open an issue.
The SessionStart hook records the first day. Stats accumulate from the second session onward. Run recall__stats() after any MCP tool call to confirm data is flowing.
Restart Claude Code after installing the plugin. The MCP server registers at startup.
recall__list_stored()
recall__stats()
recall__forget(all: true, confirmed: true)
Or delete the database directly:
rm -rf ~/.local/share/mcp-recall/mcp-recall import --keep-project-key (removed in #226) could write rows into the current project's database stamped with a foreign project key. Such rows are invisible to recall__search, stats, and suggest, and by default recall__list_stored and recall__forget only see the current project's key. As of #237 you can enumerate and delete them through the tool layer with a project_key override — no raw sqlite3 needed:
- Discover the foreign key. Run
recall__list_storedwith no arguments. If any rows carry a foreign key, a footer names each key and its row count. - Inspect the stranded rows (optional):
recall__list_storedwithproject_key="<foreign-key>". - Delete them:
recall__forgetwithproject_key="<foreign-key>"andall: true, confirmed: true(or scope the delete further withtool/session_id/older_than_days/id). Theall+confirmedguard still applies, and the override always names exactly one key — there is no all-projects wildcard.
Then re-import the dump without --keep-project-key so the items land under the current project's key and behave normally.
If you prefer to edit the database directly, the equivalent sqlite3 commands still work (the AFTER DELETE triggers cascade to the FTS index and content chunks automatically):
# The database is ~/.local/share/mcp-recall/<project-key>.db
# (or your RECALL_DB_PATH override). List distinct keys to spot the foreign one:
sqlite3 "$db" 'SELECT project_key, count(*) FROM stored_outputs GROUP BY project_key;'
# Delete the rows carrying the foreign key:
sqlite3 "$db" "DELETE FROM stored_outputs WHERE project_key = '<foreign-key>';"If a tool output is falling through to the generic handler instead of your profile, check that the pattern matches:
mcp-recall profiles list
# Verify your profile appears and the Pattern column matches the tool nameShort names:
profiles list,profiles install,profiles remove,profiles info, andprofiles testall accept short names (e.g.grafanainstead ofmcp__grafana). If a short name matches multiple profiles, an interactive picker appears on TTY. On non-TTY (CI, scripts), it prints the full list and exits — use the fullidto disambiguate.
Common causes:
- Pattern uses
mcp__myserver__*but the tool is actually namedmcp__my-server__*(hyphens vs underscores) - Profile file is in the wrong location — user profiles go in
~/.config/mcp-recall/profiles/<id>/default.toml - TOML parse error at load time — run with
RECALL_DEBUG=1to see the reason.mcp-recall profiles checkcannot help here: it only compares patterns between profiles that loaded, and an unparseable file is already gone by then
To confirm a profile is loaded and which tier it came from:
mcp-recall profiles list
# Columns: Name (short name), Tier (user / community / bundled), Pattern, Descriptionretrain requires at least 3 stored outputs for a tool before suggesting anything. If it reports no samples:
- Run a few sessions where the MCP is active — mcp-recall needs stored data to analyse
- Confirm the tool is being intercepted:
recall__list_stored()should show items from it - Check the tool isn't on the denylist:
mcp-recall profiles list— denylist blocks don't produce stored items
If a tool is running but nothing appears in recall__list_stored():
1. Check the denylist:
RECALL_DEBUG=1 claude
# Look for: [recall:debug] SKIP denylist · mcp__myservice__get_itemCommon causes — the tool name matches a built-in keyword pattern (*token*, *secret*, *api_key*, etc.) or an explicit entry (mcp__1password__*, etc.). If the tool is legitimate, add it to the allowlist in ~/.config/mcp-recall/config.toml:
[denylist]
allowlist = ["mcp__myservice__get_item"]2. Check for secret detection:
If a secret pattern (PEM header, AWS key, etc.) is found in the output, the item is skipped with a warning written to stderr — no debug flag needed:
[recall] skipped mcp__myservice__get_item: detected aws_access_key, pem_header
3. Check the tool is actually going through the hook:
HTTP transport MCPs are not intercepted — only stdio MCPs and the Bash tool go through PostToolUse. Verify the MCP is registered as a stdio server in ~/.claude.json.
If you installed from source and mcp-recall is not on PATH:
# Option 1 — alias
echo 'alias mcp-recall="bun /path/to/mcp-recall/plugins/mcp-recall/dist/cli.js"' >> ~/.zshrc
source ~/.zshrc
# Option 2 — symlink
ln -sf /path/to/mcp-recall/plugins/mcp-recall/dist/cli.js ~/.local/bin/mcp-recall
# Ensure ~/.local/bin is in your PATHIf the dist files don't exist yet, run bun run build first.
→ See profiles quickstart — from source for the full setup.
Profile load errors are silent by default (bad profiles are skipped, not fatal). Enable debug logging to see them:
RECALL_DEBUG=1 claude
# Look for: [recall:debug] profile load error: ...Two profiles in the same tier have overlapping patterns. The resolver picks the more specific one (exact beats wildcard, longer prefix beats shorter), but the conflict is worth resolving to avoid ambiguity:
- If both are community profiles, one may be redundant — remove with
mcp-recall profiles remove <id>(only community-tier profiles can be removed this way; user profiles must be deleted manually from~/.config/mcp-recall/profiles/) - If one is yours (user tier), it takes precedence over community by design — no action needed unless you want to suppress the warning