Atlas / MCP servers / mthines / Lorekit

LorekitBLOCK

mcp/mthines/lorekit

Free, open source, local & remote, persistent memory for your AI coding agents.

Verdict
BLOCK
Grade
F
Trust score
56 /100
Exposed tools
23 11r · 7w · 5d
Transport
streamable-http
License
MIT
Stars
18
01

Overview

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

Shared, persistent memory for your AI coding agents.

Your agent solves something once — a migration gotcha, a flaky-test fix, why the build breaks only on CI — and remembers it in every session after, on every machine, across every tool. One npx command to connect; works with Claude Code, Cursor, Codex, or any MCP client.

[](https://github.com/mthines/lorekit/actions/workflows/deploy.yml) [](https://www.npmjs.com/package/@lorekit/cli) [](./LICENSE)

npx @lorekit/cli install     # connect your agent — full setup below
┌─ your agent, any tool, any machine ─┐
learns something │  memory.write { scope, key, value } │
in a session ───→│                                     │──→ one store, your call:
recalls it next  │  memory.list  { scope }             │←── remote (shared) or local
time it needs it └─────────────────────────────────────┘

The problem: your agents forget everything

Every coding agent starts each session with total amnesia. If you use them daily, that costs you:

  • Every session starts from zero. The agent that just untangled a tricky bug

has no memory of it an hour later. You re-explain the same context, over and over.

  • Lessons are trapped on one machine. What your agent learned on your laptop

never reaches your teammate's agent — or the same agent running in CI.

  • Every tool is its own island. What Claude Code figured out, Cursor doesn't

know. What you learned locally, GitHub Actions can't see.

  • Good context dies quietly. The .claude/ notes your agent writ
Read from source at commit c338acc7c9adOBSERVED · 2026-10-12
Advertisement
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 web --env AUTH_AUTHED_NAME=${AUTH_AUTHED_NAME} --env AUTH_AUTHED_ROLE=${AUTH_AUTHED_ROLE} --env AUTH_LOGIN_URL=${AUTH_LOGIN_URL} --env AUTH_POST_LOGIN_URL_PATTERN=${AUTH_POST_LOGIN_URL_PATTERN} -- npx -y @lorekit/[email protected]
claude-desktop
{
  "mcpServers": {
    "web": {
      "command": "npx",
      "args": [
        "-y",
        "@lorekit/[email protected]"
      ],
      "env": {
        "AUTH_AUTHED_NAME": "${AUTH_AUTHED_NAME}",
        "AUTH_AUTHED_ROLE": "${AUTH_AUTHED_ROLE}",
        "AUTH_LOGIN_URL": "${AUTH_LOGIN_URL}",
        "AUTH_POST_LOGIN_URL_PATTERN": "${AUTH_POST_LOGIN_URL_PATTERN}"
      }
    }
  }
}
03

Exposed tools (23)

11 read · 7 write · 5 destructive. Blast radius: 5 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
groom.previewwritePreview the lessons a saved policy or an inline condition set would archive, without changing anything
groom.runwriteArchive every lesson a saved policy or an inline condition set matches. Soft-archive only — never hard-deletes
lorekit.cli.invocationsreadCount of LoreKit CLI command invocations
memory.archivereadSoft-archive a lesson. Archived lessons are hidden from reads but can be restored via memory.restore.
memory.deletedestructiveSoft-archive a lesson (default) or hard-delete it (force: true). Archived lessons are hidden from reads but can be restored.
memory.listreadList lessons, for one scope or across every scope you can see
memory.list_archivedreadList archived (soft-deleted) lessons, for one scope or across every scope you can see
memory.protectreadMark or unmark a lesson as protected — excluded from every grooming candidate set regardless of policy
memory.purgedestructivePermanently delete archived lessons older than retention_days (default ${PURGE_RETENTION_DAYS_DEFAULT}). Unrecoverable.
memory.purge_expireddestructivePermanently delete all TTL-expired memories for the current user. Unrecoverable.
memory.readreadRead one lesson by
memory.restorereadRestore an archived lesson back to active
memory.scopesreadList every scope in the store with how many active memories it holds and when it was last
memory.searchreadFull-text search across lessons
memory.writewriteStore or update a lesson
org.createwriteCreate a new organization. You become its owner automatically. The slug must be globally unique and lowercase.
org.deletedestructiveDelete an organization. Requires owner role. Soft-deletes the org — all org lore is immediately hidden from reads. Unrecoverable via MCP.
org.listreadList all organizations you are a member of, with your role in each.
org.renamewriteRename an organization
policy.createwriteCreate a scoped retention policy that auto-archives (never hard-deletes) matching lessons
policy.deletedestructiveDelete a retention policy. Deletes the rule only — never touches the lessons it matched
policy.listreadList every retention policy you own
policy.updatewriteUpdate a retention policy. Every field but id is optional
04

Trust audit

BLOCKgrade F · trust 56/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 (9 observation(s))
Network
declared (5 observation(s))
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
scripts/seed/seed-preview.mjs:33
*   node scripts/seed/seed-preview.mjs --psql postgresql://postgres:[email protected]:54322/postgres \
MEDIUMInventory / provenance · inv.binary · CWE-1104
packages/web/src/lib/explorer-instruments.ts
explorer-instruments.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:905
[ -n "$DB_URL" ] || DB_URL="postgresql://postgres:[email protected]:54322/postgres"
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
docs/deployment.md:996
--psql postgresql://postgres:[email protected]:54322/postgres
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/cli/test/migrate.test.mjs:649
{ token: 'custom_token_from_a_self_host' },
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
packages/mcp-core/src/webhook/github-app-jwt.spec.ts:67
const der = pemToDer('-----BEGIN PRIVATE KEY-----\nTWFu\n-----END PRIVATE KEY-----\n');
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
memory.delete, memory.purge, memory.purge_expired, org.delete, policy.delete
Why it matters. 5 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.mcp.example.json
.mcp.example.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.release-please-manifest.json
.release-please-manifest.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/evals/test/harness/task.test.mjs:101
test("taskById refuses a stub instead of running an empty eval (AC-3.4)", () => {
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/cli/src/commands/bootstrap.mjs:22
new URL('../../../../supabase/byod/bootstrap.sql', import.meta.url),
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/cli/src/commands/doctor.mjs:623
return JSON.parse(fs.readFileSync(new URL('../../package.json', import.meta.url), 'utf8')).version;
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/cli/src/shared/config.mjs:9
export const PKG_ROOT = fileURLToPath(new URL('../../', import.meta.url));
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/cli/test/deeplink.test.mjs:453
const WEB_PACKAGE_DIR = fileURLToPath(new URL('../../web', import.meta.url));
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/cli/test/deeplink.test.mjs:456
'../../web/src/components/lore/LoreExplorer.tsx',
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/workflows/ci.yml:820
-X POST http://127.0.0.1:54321/functions/v1/mcp \
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/workflows/ci.yml:857
SUPABASE_URL: http://127.0.0.1:54321
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/workflows/ci.yml:875
LOREKIT_REST_BASE_URL: http://127.0.0.1:54321/functions/v1
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/workflows/ci.yml:884
LOREKIT_REST_BASE_URL: http://127.0.0.1:54321/functions/v1
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/deployment.md:829
LOREKIT_REST_BASE_URL: http://127.0.0.1:54321/functions/v1
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
packages/mcp-core/src/rest/count-cursor.ts:54
const parsed: unknown = JSON.parse(atob(b64 + '='.repeat(pad)));
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
supabase/functions/_shared/api/count-cursor.ts:54
const parsed: unknown = JSON.parse(atob(b64 + '='.repeat(pad)));
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
supabase/functions/_shared/api/paginate.ts:35
const d = JSON.parse(atob(p + '='.repeat(pad)));
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
supabase/functions/mcp/cursor.ts:40
const d = JSON.parse(atob(p + '='.repeat(pad)));
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
supabase/functions/memories/handlers/usage-runs.ts:48
const json = atob(padded + '='.repeat((4 - (padded.length % 4)) % 4));

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha c338acc7c9adfull audit observations/trust-audit/mcp-server/mthines__lorekit.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-12c338acc7c9adBLOCKF56first audit
06

Questions

What is the @lorekit/cli MCP server?

Free, open source, local & remote, persistent memory for your AI coding agents.

What tools does @lorekit/cli expose?

23 in total: 11 read-only, 7 that write, and 5 that can delete or overwrite (memory.delete, memory.purge, memory.purge_expired, org.delete, policy.delete). Every one is listed on this page with its risk.

Is @lorekit/cli safe to connect to an agent?

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

What credentials does @lorekit/cli need?

It reads AUTH_AUTHED_NAME, AUTH_AUTHED_ROLE, AUTH_LOGIN_URL, AUTH_POST_LOGIN_URL_PATTERN, AUTH_PROXY_SERVER, AUTH_STORAGE_STATE, AUTH_TIMEOUT_MS, LOREKIT_SMOKE_PASSWORD, LOREKIT_SMOKE_TOKEN, LOREKIT_SWEEP_SERVICE_ROLE_KEY, LOREKIT_TELEMETRY_TOKEN and LOREKIT_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 @lorekit/cli run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as @lorekit/web at 0.0.2.

How current is this page?

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

Advertisement