Atlas / MCP servers / vshulcz / Deja Vu

Deja VuBLOCK

mcp/vshulcz/deja-vu

The most accurate, cheapest and fastest memory for coding agents: searchable session history from Claude Code, Codex, Cursor and 32 more agents, already on your disk. No LLM, one Go binary.

Verdict
BLOCK
Grade
F
Trust score
38 /100
Exposed tools
8 7r · 1w · 0d
Transport
stdio · streamable-http
License
MIT
Stars
1,081
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

The one memory your coding agents share, built from the history already on your disk.

Your agent is about to re-debug something you fixed in March — in a different agent. deja starts full: it indexes what Claude Code, Codex, Cursor and 32 more agents already wrote to disk, and hands it back in whichever agent asks.

English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Español | Português | Français | Deutsch | Русский | Türkçe | हिन्दी

Nobody searched anything — the agent called deja itself. Two real runs against a synthetic corpus: nobody's history is published.

curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh
deja install --auto

macOS and Linux; ten seconds to install, about ten to index · Windows, Homebrew, npm and the rest

Read from source at commit 6b970f959f81OBSERVED · 2026-09-29
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add deja-vu -- npx -y @vshulcz/[email protected] mcp
03

Exposed tools (8)

7 read · 1 write · 0 destructive.

ToolRiskDescription
dejareadSearch your own past coding sessions
deja-vureadMemory from the coding sessions already on this machine
deja_blamereadThe past sessions that discussed a file, so you know why it is shaped the way it is before editing, refactoring or deleting it. Session history, not git authorship.
deja_fixreadWhat this machine ran after that same error before, in the sessions where the error did not come back. Paste the failing output verbatim rather than a paraphrase — the match is on the error
deja_howwriteThe real invocation this machine uses for a build, test, deploy or script, with the flags it actually ran, ordered by how many sessions ran it. A guessed command is plausible and fails on this setup.
deja_recallreadSearch this machine
deja_rememberreadStore one durable decision once it is settled, as a single self-contained fact that will make sense months later. Not transcripts, not a summary of the conversation, and not anything already obvious from the code.
deja_sessionreadA full digest of the single best-matching past session — what was tried, what was decided, what it cost. Use after deja_recall when the reasoning behind an earlier decision matters, not just that it happened.
04

Trust audit

BLOCKgrade F · trust 38/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (1 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHObfuscation / stealth · obf.rtl_override · CWE-506, CWE-94
internal/redact/display.go:30
case '', '', '', '', '', // embeddings and overrides
HIGHObfuscation / stealth · obf.rtl_override · CWE-506, CWE-94
internal/redact/display.go:31
'', '', '', '', // isolates
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
internal/digest/compaction_carry_rules.go:31
carrySplitRE = regexp.MustCompile(`([.!?]\**)\s+([A-ZА-ЯЁ«"*#\[])`)
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
internal/index/redaction_audit_test.go:21
"grok-title":   "sk-ant-api03-titlesecret0123456789",
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
internal/redact/redact_test.go:155
"sk-ant-api03-abcdefghijklmnopqrstuvwxyz012345",
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
internal/redact/redact_test.go:229
in := `api_key=sk-ant-abcdefghijklmnopqrstuvwxyz0123456789`
MEDIUMHard-coded secrets · secret.aws · CWE-798, CWE-321
cmd/deja/view_test.go:41
`{"type":"user","sessionId":"sec","timestamp":"` + ts + `","message":{"role":"user","content":"the key was AKIAABCDABCDABCDABCD in the config"}}`,
MEDIUMHard-coded secrets · secret.aws · CWE-798, CWE-321
internal/index/redaction_audit_test.go:19
"claude-text":  "AKIAIOSFODNN7EXAMPL1",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
cmd/deja/secrets_scrub_test.go:25
body := `{"type":"user","sessionId":"leaky-1","cwd":"/w/s","timestamp":"2026-07-02T10:00:00Z","message":{"role":"user","content":"staging is down, here is the dsn: postgres://svc:[email protected]
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
cmd/deja/secrets_test.go:98
`{"type":"user","sessionId":"s3","timestamp":"2026-03-06T10:00:00Z","message":{"role":"user","content":"psql postgres://svc:[email protected]:5432/app"}}`,
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
cmd/deja/secrets_test.go:99
`{"type":"user","sessionId":"s3","timestamp":"2026-03-06T10:02:00Z","message":{"role":"user","content":"still failing: postgres://svc:[email protected]:5432/app"}}`,
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
internal/index/index_test.go:874
"postgres://user:pass1234567890@localhost/db",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
internal/redact/fuzz_test.go:30
"postgres://app:[email protected]:5432/prod",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
cmd/deja/view_redaction_test.go:24
const secret = "8f14e45fceea167a5a36dedd4bea2543"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
cmd/deja/view_redaction_test.go:25
const token = "ghp_abcdefghijklmnopqrstuvwxyz0123456789"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
internal/embed/auth_test.go:65
const secret = "credential-that-must-not-appear"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
internal/index/import_secret_absent_test.go:24
const secret = "ghp_abcdefghijklmnop0123456789QRSTUV"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
internal/index/manifest_no_secret_test.go:16
const secret = "ghp_abcdefghijklmnop0123456789QRSTUV"
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
cmd/deja/handoff_exec_sanitised_test.go:18
raw := "continue the work\u202ereversed\u200b here: ghp_0123456789abcdefghijklmnopqrstuvwxyzAB"
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
cmd/deja/handoff_exec_sanitised_test.go:26
if strings.Contains(got, "ghp_0123456789abcdefghijklmnopqrstuvwxyzAB") {
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
cmd/deja/handoff_exec_sanitised_test.go:38
argv, ok := handoffArgv("claude", "work\u202ereversed here ghp_0123456789abcdefghijklmnopqrstuvwxyzAB")
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
cmd/deja/handoff_exec_sanitised_test.go:43
if strings.Contains(joined, "\u202e") || strings.Contains(joined, "ghp_0123456789abcdefghijklmnopqrstuvwxyzAB") {
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
cmd/deja/view_redaction_test.go:25
const token = "ghp_abcdefghijklmnopqrstuvwxyz0123456789"
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
cmd/deja/promote_title_test.go:63
{"a private key", "-----BEGIN PRIVATE KEY-----", "MIIBVgIBADANBgkqhkiG9w0\n-----END PRIVATE KEY-----\nand the rest of the note survives", "MIIBVgIBADANBgkqhkiG9w0"},
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
internal/index/index_test.go:865
"-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAfakefakefakefakefake\n-----END RSA PRIVATE KEY-----",

Gates applied: no_behavioural_pass.

Audited 2026-09-29 · audit v0.4.1 · source sha 6b970f959f81full audit observations/trust-audit/mcp-server/vshulcz__deja-vu.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-09-296b970f959f81BLOCKF38first audit
06

Questions

What is the Deja Vu MCP server?

The most accurate, cheapest and fastest memory for coding agents: searchable session history from Claude Code, Codex, Cursor and 32 more agents, already on your disk. No LLM, one Go binary.

What tools does Deja Vu expose?

8 in total: 7 read-only, 1 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is Deja Vu safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (38/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does Deja Vu need?

It reads KEYWORDS and MY_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Deja Vu run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as dsh-deja at 0.21.3.

How current is this page?

The grade is for one exact copy of the source (6b970f959f81), read on 2026-09-29. The repository is watched and re-audited when it changes.

Advertisement