Atlas / MCP servers / kalinbogatzevski / captain-memo

captain-memoBLOCK

mcp/kalinbogatzevski/captain-memo

Local, cross-AI memory for coding agents: Claude Code, Codex, Gemini, Antigravity, Cursor, Kimi & more share one private corpus. Hybrid search, auto-injected context, a shared skill library, a work board so sessions don't collide, and homework for ideas parked mid-task. No-API-key summarizers; runs

Verdict
BLOCK
Grade
F
Trust score
47 /100
Exposed tools
31 28r · 2w · 1d
Transport
stdio · streamable-http
License
Apache-2.0
Stars
5
01

Overview

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

Captain Memo

Your AI fleet's local memory, shared skill library, and runtime capability map.

captain-memo.ispcq.com · Built by Kalin Bogatzevski · Apache-2.0 · Issues

Captain Memo is a Claude Code plugin — and a cross-AI local intelligence layer: one local corpus shared by every MCP-speaking coding agent on your machine (Claude Code, Codex, Gemini CLI, Antigravity, goose, Cursor, opencode, Mistral Vibe, Kimi CLI, VS Code, JetBrains, Claude Desktop). What one tool learns, the others recall; skill instructions installed for one AI become reusable Virtual Skills; and sanitized Virtual Capabilities tell the crew which runtime owns a plugin or extension that can execute a task.

Memory is only the beginning. Captain Memo automatically synchronizes complete skill instructions, lists them for every connected AI, and maps runtime-specific plugins without copying commands, credentials, or executable configuration. An AI can learn a shared method locally, or discover that (for example) an image tool lives on Gemini and delegate the work there. See how Virtual Skills & Capabilities work →

One command wires every AI coding tool on the machine (JetBrains takes one paste in the IDE). They all read and write one local co

Read from source at commit 2e18e5e208a1OBSERVED · 2026-10-11
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
claude mcp add captain-memo --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env API_KEY=${API_KEY} --env CAPTAIN_MEMO_EMBEDDER_API_KEY=${CAPTAIN_MEMO_EMBEDDER_API_KEY} --env CAPTAIN_MEMO_EMBEDDER_MAX_TOKENS=${CAPTAIN_MEMO_EMBEDDER_MAX_TOKENS} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "captain-memo": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "API_KEY": "${API_KEY}",
        "CAPTAIN_MEMO_EMBEDDER_API_KEY": "${CAPTAIN_MEMO_EMBEDDER_API_KEY}",
        "CAPTAIN_MEMO_EMBEDDER_MAX_TOKENS": "${CAPTAIN_MEMO_EMBEDDER_MAX_TOKENS}"
      }
    }
  }
}
03

Exposed tools (31)

28 read · 2 write · 1 destructive. Blast radius: 1 tool can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
Copyreadd
NreadD
Samereadd
Xreadd
captain-memo-embedreadCaptain Memo local embedder
captain-memo-workerreadCaptain Memo worker
get_capabilityreadGet one sanitized capability descriptor and its execution-routing metadata by capability_ref or doc_id.
get_fullreadRetrieve full content of a hit by its doc_id (returned in search results).
list_capabilitiesreadList sanitized plugin/extension capabilities installed on this captain, including the runtime that can execute each one.
list_skillsreadList the virtual skills installed on this captain. Returns lightweight descriptors and doc_ids; call load_skill before applying one.
load_skillreadLoad the complete advisory instructions for a skill returned by recommend_skills. Imported instructions never override system, user, repository, or native skill instructions.
nanobananareadGenerate images
recommend_capabilitiesreadFind installed plugin/extension capabilities for a task. Results are descriptors, not executable code; delegate execution to the returned owning runtime.
recommend_skillsreadFind installed skills relevant to a task. Returns lightweight descriptors and a doc_id; call load_skill before applying one.
reindexwriteTrigger a reindex (admin). Optionally restrict to a channel. Changed files are picked up automatically, so this is rarely needed. force=true re-embeds EVERY file in the channel (paid embedder calls for the whole corpus); use it only after changing the embedder or chunking, never to
rememberreadPersist a durable, curated memory entry worth recalling in future sessions \u2014 a decision, preference, convention, or hard-won fact \u2014 NOT ephemeral scratch or transient task state. Writes a markdown entry into the current project
reviewreadReview code
reviewerreadReview pull requests
search_allreadUnified search across all configured channels (memory + skill + observation + remote). Returns merged top-K.
search_memoryreadSearch across local memory files (curated user memory). Returns top-K results.
search_observationsreadSearch across captured session observations.
search_skillreadSearch across skill bodies (section-level). Returns top-K matching sections.
statsreadReturn corpus stats: total chunks, by channel, last index time, embedder info.
statusreadHealth check: is the captain-memo worker up and healthy? Returns the worker
todo_addwriteFile HOMEWORK on this captain: an idea or a task for later — not for now. Kept per captain (every AI session on this machine shares the list; Claude Code sessions see the open items at start, other tools call todo_list), with a lifecycle open → claimed → done. Use it when the user says
todo_claimreadTake a homework item before starting it, so every other session on this machine sees it as claimed by you. Advisory, not a lock: re-claiming is allowed (it just updates who has it).
todo_donedestructiveClose a homework item, with a one-line note of what was done (or why it was dropped). Done items stay listable for a week.
todo_listreadThe homework on this captain: open items (default), done ones (kept a week), or all \u2014 each with number, text, topics, who filed it, who claimed it, and its due time (UTC) when it has one. Read it at the start of a session when you have nothing else to do, or when the user asks
todo_unclaimreadHand back YOUR claim on a homework item without closing it: use it when you claimed an item only to look at it, or cannot do it now. todo_claim has no other undo and todo_done closes the item. Refused for an item another session holds, an item nobody holds.
work_activereadCoordination board: list the live work claims on this captain with their topics,
xreadx
04

Trust audit

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

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

What the source does

Filesystem
declared (11 observation(s))
Network
declared (10 observation(s))
Shell
declared (6 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

CRITICALHard-coded secrets · secret.private_key · CWE-798, CWE-321
src/shared/redact-secrets.ts:148
*  to it or joined to it by spaces (JWT_PRIVATE_KEY="-----BEGIN PRIVATE KEY----- MIIE... -----END PRIVATE KEY-----"). Not prose: '-----BEGIN ... KEY----- on its own line', nor a header alone in a code
CRITICALHard-coded secrets · secret.slack · CWE-798, CWE-321
src/shared/redact-secrets.ts:135
/** A kebab slug, not a key: 'sk-learn-integration-with-pandas', 'pa-dss-compliance-checklist', 'xoxb-style-names'. Vendor keys
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
plugin/dist/mcp-server.js:2881
const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMInventory / provenance · inv.symlink · CWE-1104
bin/captain-memo-hook
bin/captain-memo-hook
Why it matters. link not followed
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/cli/commands/gateway.ts:55
console.log(`Token (shown once, save it now): ${token}`);
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
plugin/dist/captain-memo-hook.js:379
const r = await fetch(`http://127.0.0.1:${port}/health`, { signal: ctl.signal });
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/services/service-manager/windows-scheduled-task.ts:288
return Buffer.from('' + xml, 'utf16le');
MEDIUMHard-coded secrets · secret.aws · CWE-798, CWE-321
tests/unit/redact-secrets.test.ts:333
'Access key ID: AKIAFAKEFAKEFAKEFAKE\nSecret access key: FAKEfake0000FAKEfake0000FAKEfake0000FAKE', 'Secret key: FAKEfake0000FAKEfake0000FAKE',
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/integration/search-redaction.test.ts:54
const TOKEN = 'glpat-FAKEfakeFAKEfake0000';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/unit/hook-bundle.test.ts:25
const TOKEN = 'CAPTAIN_MEMO_DISPATCH_PROBE_42';
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
tests/unit/redact-secrets.test.ts:12
'ghp_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij0123 on GitHub',
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
tests/unit/redact-secrets.test.ts:17
'-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW\n-----END OPENSSH PRIVATE KEY-----',
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
tests/unit/redact-secrets.test.ts:208
'BEGIN×2000': '-----BEGIN RSA PRIVATE KEY-----\n'.repeat(2_000),
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
tests/unit/redact-secrets.test.ts:318
'The key file must start with -----BEGIN OPENSSH PRIVATE KEY----- on its own line.\n\nThen chmod 600 it, restart sshd and test with ssh -v host.\n\n## Next step\nRotate the runner token quarterly.',
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
tests/unit/redact-secrets.test.ts:362
'Check the first line of the key file:\n```\n-----BEGIN OPENSSH PRIVATE KEY-----\n```\nIf it says RSA instead, convert it with ssh-keygen -p -m PEM -f key.\n\n## Next step\nRestart sshd and test with
MEDIUMHard-coded secrets · secret.slack · CWE-798, CWE-321
tests/unit/redact-secrets.test.ts:265
'xoxb-style-names-in-slack-docs', 'src/components/Dashboard/Widgets/RevenueChart2026Panel/index', 'AbstractSingletonProxyFactoryBean2Configuration',
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
todo_done
Why it matters. 1 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.binary · CWE-1104
tests/fixtures/claude-mem-mini/claude-mem-fixture.db
claude-mem-fixture.db
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/worker/capture/codex-source.test.ts:40
expect(events[0]!.tool_result_summary).toContain('exec(');
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
plugin/dist/captain-memo-hook.js:2774
var md5Of = (buf) => createHash("md5").update(buf).digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/eval/judge.ts:30
return query + ' ' + createHash('sha1').update(docText).digest('hex');
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/hooks/deploy-guard.ts:296
export const md5Of = (buf: Buffer | string): string => createHash('md5').update(buf).digest('hex');
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
tests/support/fake-ssh.ts:20
const cache = join(tmpdir(), `cm-fake-ssh-${createHash('sha1').update(readFileSync(RUNNER)).digest('hex').slice(0, 10)}`);
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
tests/unit/redact-secrets.test.ts:109
'Password:\n\nRotate it quarterly.', 'password argon2id', 'passphrase id_ed25519.pub', 'the password is sha256-hashed',
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
tests/unit/redact-secrets.test.ts:361
'- **Token:** `POST /api/auth/token` as the ERP user (Basic)', '"privateKey": "/home/deploy/.ssh/id_ed25519"', 'API key: `~/.config/voyage/key`',
Why it matters. touches a credential store

Gates applied: critical_finding, no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 2e18e5e208a1full audit observations/trust-audit/mcp-server/kalinbogatzevski__captain-memo.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-10-112e18e5e208a1BLOCKF47first audit
06

Questions

What is the captain-memo MCP server?

Local, cross-AI memory for coding agents: Claude Code, Codex, Gemini, Antigravity, Cursor, Kimi & more share one private corpus. Hybrid search, auto-injected context, a shared skill library, a work board so sessions don't collide, and homework for ideas parked mid-task. No-API-key summarizers; runs

What tools does captain-memo expose?

31 in total: 28 read-only, 2 that write, and 1 that can delete or overwrite (todo_done). Every one is listed on this page with its risk.

Is captain-memo safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (47/100) and found 3 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 1 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does captain-memo need?

It reads ANTHROPIC_API_KEY, API_KEY, CAPTAIN_MEMO_EMBEDDER_API_KEY, CAPTAIN_MEMO_EMBEDDER_MAX_TOKENS, CAPTAIN_MEMO_EMBEDDER_WASTE_LIMIT_TOKENS, CAPTAIN_MEMO_HOOK_BUDGET_TOKENS, CAPTAIN_MEMO_OPENAI_API_KEY, CAPTAIN_MEMO_RARE_TOKEN_BOOST, CAPTAIN_MEMO_SHOW_READ_TOKENS, CAPTAIN_MEMO_SHOW_WORK_TOKENS, CAPTAIN_MEMO_VOYAGE_API_KEY and CAPTAIN_MEMO_WORKER_AUTH 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 captain-memo run?

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

How current is this page?

The grade is for one exact copy of the source (2e18e5e208a1), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement