memkin
npm
v0.4.7
Source verified
Published by andrelyl — publish provenance cryptographically ties this package to that repository. That is proof of origin, not an official vendor package.
Local-first personal memory system — extracts signals from Feishu/Lark chats and AI-agent sessions into a private knowledge graph, served to any agent via MCP
The grade answers one question — how safe is this server for you to adopt — so it is computed in two auditable stages. Nothing below is an opinion or an LLM's guess; every line is a real term the deterministic engine applied, and the same input always yields the same number.
1. Threat score — 100 − 6.3 = 94. What the published surface and source actually contain:
| Points | What was found | Category |
|---|---|---|
| −6.3 | Untrusted input concatenated into a command sink MTC-SRC-009 | injection |
2. Client adoption risk — 94 − 10 = 84. Three small, subtract-only factors that reflect your risk in adopting it — a clean scan proves less on a powerful, unverified or barely-inspectable package, so the grade says so plainly:
| Points | Adoption-risk factor |
|---|---|
| −10 | capability blast radius (critical) — client exposure if the model is manipulated |
Capability observations and info notes are shown under Findings but never scored.
Open any row's finding below for the file, line and evidence behind a deduction.
In the server's implementation (`web/dist/assets/index-Cru41MzT.js:4562`): Evaluating strings as code is the most direct RCE primitive; if any tool input reaches it, the server executes attacker-chosen code. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: i(e){let n=a(e);return Function(`bodies`,`settings`,`random`,n)}function a(e){let n=r(e);return` var boundingBox = {
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server web/dist/assets/index-Cru41MzT.js
In the server's implementation (`bin/memkin.mjs:2`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: spawnSync } from "node:child_process"; import { existsSync } from "node:fs"; import { dirname, resolve } from "node:pat
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server bin/memkin.mjs
In the server's implementation (`dist/cli.js:1733`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: } = await import("node:child_process"); const result = spawnSync(managedState.pgCtlPath, ["status", "-D", m
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/cli.js
In the server's implementation (`dist/collectors/feishu/lark-cli-client.js:1`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: { execFile } from "node:child_process"; import { existsSync } from "node:fs"; import { dirname, join } from "node:path";
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/collectors/feishu/lark-cli-client.js
In the server's implementation (`dist/daemon/autostart/runner.js:1`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: rt { spawn } from "node:child_process"; export function makeFakeRunner(results) { const queue = [...results]; co
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/daemon/autostart/runner.js
In the server's implementation (`dist/hooks/writeback.js:1`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: rt { spawn } from "node:child_process"; import { existsSync, readFileSync, writeFileSync } from "node:fs"; import { home
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/hooks/writeback.js
In the server's implementation (`dist/install/index.js:1`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: spawnSync } from "node:child_process"; import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/install/index.js
In the server's implementation (`dist/server/open-browser.js:1`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ort { exec } from "node:child_process"; export function resolveOpenCommand(url, platform = process.platform) { if (p
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/server/open-browser.js
In the server's implementation (`dist/setup/assess-hardware.js:6`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: { execSync } from "node:child_process"; import { readdirSync, statSync } from "node:fs"; import { cpus, totalmem } from
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/setup/assess-hardware.js
In the server's implementation (`dist/setup/detect-runtime.js:1`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ecFileSync } from "node:child_process"; function normalizeVersion(raw) { return String(raw).trim().split(/\r?\n/)[0]
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/setup/detect-runtime.js
In the server's implementation (`dist/setup/doctor.js:74`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: }, async exec(sql) { await pool.query(sql); }, }); } catch {
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/setup/doctor.js
In the server's implementation (`dist/setup/init-wizard.js:183`): A shell/process command assembled from concatenated or interpolated values is command injection when any part is attacker-influenced — the OWASP canonical RCE flow. Verify what reaches the interpolated value. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: try { execSync(`ollama pull ${MODEL}`, { stdio: "inherit" }); write(output, ` [ok] ${
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/setup/init-wizard.js
In the server's implementation (`web/dist/assets/index-Cru41MzT.js:12`): Loading a module chosen at runtime (from a variable) can pull in and run attacker-influenced code paths. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ];try{let r=await S(()=>import(e.module),[]);return n[e.id]=r,r}catch(n){return console.error(`Error loading route modul
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server web/dist/assets/index-Cru41MzT.js
Each tool and what it can reach — statically extracted from the published source.
get_pageingests untrusted inputget_page_contextingests untrusted inputadd_linkno sensitive capabilityadd_tagno sensitive capabilityadd_timeline_entryno sensitive capabilitydaily_reportno sensitive capabilityexplore_graphno sensitive capabilityget_backlinksno sensitive capabilityget_chunksno sensitive capabilityget_entity_profileno sensitive capabilityget_healthno sensitive capabilityget_linksno sensitive capabilityget_session_contextno sensitive capabilityget_tagsno sensitive capabilityget_timelineno sensitive capabilityingest_feishu_docno sensitive capabilitylink_person_aliasno sensitive capabilitylist_pagesno sensitive capabilitylist_person_handlesno sensitive capabilitylist_signals_by_entityno sensitive capabilitymanage_linksno sensitive capabilitymanage_tagsno sensitive capabilitymerge_personsno sensitive capabilityprep_for_personno sensitive capabilityput_pageno sensitive capabilityqueryno sensitive capabilityrecallno sensitive capabilityrecanonicalize_personno sensitive capabilityremove_linkno sensitive capabilityremove_person_aliasno sensitive capabilityremove_tagno sensitive capabilitysearchno sensitive capabilitysynthesizeno sensitive capabilitytimeline_feedno sensitive capabilitytraverse_graphno sensitive capabilitytroubleshootno sensitive capabilityScan history per published version. The engine is deterministic — the same version always yields the same score, so a changed score means the package itself changed.
| Version | Score | Findings | Engine | Scanned |
|---|---|---|---|---|
v0.4.7 latest |
B 84/100 | 13 | 1.13.0 | 2026-09-07 |
v0.4.6 |
B 84/100 | 13 | 1.12.1 | 2026-07-28 |
Show this server's live Trust Score in your README, docs or website. The badge is served straight from the registry and updates automatically after every rescan — no API key needed. It links back to this page, so anyone who sees the grade can also read the findings behind it instead of taking a number on faith.
The score above is reproducible: the same package version always yields the same result. Run it locally or over the free API — no account, no LLM, fully deterministic.
npx mcptrustchecker scan memkin --online
FDA device & vehicle recall risk for AI agents: recall history, MAUDE trend, risk score.
Open-source MCP server exposing Agent402.Tools' catalog — 500+ strong: 400+ self-hostable tools + 100 multi-tool skill packs (security-audit, trend-analysis, structured-scrape, decode-blob, forecasting-bake-off) for AI agents — browser, web search & answe
Zero-dependency MCP server that gives AI agents a self-updating project memory in AGENTS.md. Returns merge instructions instead of mutating state, so every change is a reviewable diff.
MCP Apps UI resources and server helpers for n8n
MCP server providing comprehensive access to BookStack knowledge management system
MCP server for tracking achievements with STAR methodology