⚠️ This snapshot is over 30 days old — treat the grade as stale until the next refresh. Re-scan locally to verify.
Trust Card · Static snapshot
mcp-memory U
Ungraded — insufficient static coverage · 11 findings (0 critical) · scope excessive · Not ranked: insufficient static coverage.
Scanned 2026-10-19 · engine v0.1.3 (8 regex rules, OWASP-mapped) · upstream modelcontextprotocol/servers @ 51b6382 (2026-10-19)
Score breakdown
No numeric score or breakdown: insufficient static coverage. Findings remain actionable; absence of findings is not evidence of safety.
Insufficient static coverage: Unsupported source present. Findings remain actionable; absence of findings is not evidence of safety.
Coverage: limited
Static-heuristic scope: 19 analyzed / 22 discovered files; 1 unsupported source files; 3 excluded; 0 read errors; 0 truncations. This is not a semantic coverage percentage or proof of safety.
- Unsupported source present
- Coverage describes the files read and regex rules applied, not semantic, runtime, or dependency coverage.
- Supported code is JavaScript, TypeScript, and Python; JSON/YAML receive only the credential rule.
- Skill instructions and other prose are not code-analyzed; declared controls are not verified enforcement.
- Ignored directories, declarations, and non-implementation assets are outside rule scope.
File coverage, applied rules and scan limits
{
"mode": "static-heuristic",
"status": "limited",
"reasons": [
"Unsupported source present"
],
"limitations": [
"Coverage describes the files read and regex rules applied, not semantic, runtime, or dependency coverage.",
"Supported code is JavaScript, TypeScript, and Python; JSON/YAML receive only the credential rule.",
"Skill instructions and other prose are not code-analyzed; declared controls are not verified enforcement.",
"Ignored directories, declarations, and non-implementation assets are outside rule scope."
],
"discoveredFiles": 22,
"analyzedFiles": [
{
"path": "__tests__/atomic-save.test.ts",
"scope": "code",
"bytes": 5358,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "__tests__/create-reporting.test.ts",
"scope": "code",
"bytes": 2990,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "__tests__/entry-point.test.ts",
"scope": "code",
"bytes": 3834,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "__tests__/eras.test.ts",
"scope": "code",
"bytes": 7235,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "__tests__/file-lock.test.ts",
"scope": "code",
"bytes": 11924,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "__tests__/file-path.test.ts",
"scope": "code",
"bytes": 7296,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "__tests__/helpers.ts",
"scope": "code",
"bytes": 2721,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "__tests__/knowledge-graph.test.ts",
"scope": "code",
"bytes": 32291,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "__tests__/persistence.test.ts",
"scope": "code",
"bytes": 15216,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "__tests__/resource.test.ts",
"scope": "code",
"bytes": 7922,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "__tests__/server-version.test.ts",
"scope": "code",
"bytes": 2207,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "__tests__/stdio-smoke.test.ts",
"scope": "code",
"bytes": 2411,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "__tests__/tools.test.ts",
"scope": "code",
"bytes": 30331,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "index.ts",
"scope": "code",
"bytes": 42089,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "package.json",
"scope": "data",
"bytes": 1602,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-002"
]
},
{
"path": "tsconfig.json",
"scope": "data",
"bytes": 232,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-002"
]
},
{
"path": "tsconfig.test.json",
"scope": "data",
"bytes": 546,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-002"
]
},
{
"path": "version.ts",
"scope": "code",
"bytes": 970,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
},
{
"path": "vitest.config.ts",
"scope": "code",
"bytes": 697,
"nonEmpty": true,
"ruleIds": [
"AT-SEC-001",
"AT-SEC-002",
"AT-SEC-003",
"AT-SEC-004",
"AT-SEC-005",
"AT-SEC-006",
"AT-SEC-007",
"AT-COMP-001"
]
}
],
"unsupportedSourceFiles": [
"Dockerfile"
],
"excludedFiles": [
{
"path": "CHANGELOG.md",
"reason": "outside-rule-scope"
},
{
"path": "Dockerfile",
"reason": "unsupported-implementation"
},
{
"path": "README.md",
"reason": "outside-rule-scope"
}
],
"readErrors": [],
"truncation": [],
"limits": {
"maxFiles": 4000,
"maxDepth": 12,
"maxFileBytes": 1048576
}
}Fix first (11 critical/high)
| Severity | Rule | Finding | Remediation |
|---|---|---|---|
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modification__tests__/create-reporting.test.ts:38Evidence: await fs.unlink(testFilePath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modification__tests__/file-lock.test.ts:168Evidence: await fs.unlink(lockPath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modification__tests__/file-lock.test.ts:222Evidence: onceOnOpen(lockPath, "r", () => fs.unlink(lockPath)); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modification__tests__/file-lock.test.ts:285Evidence: await fs.unlink(lockPath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modification__tests__/knowledge-graph.test.ts:23Evidence: await fs.unlink(testFilePath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationindex.ts:215Evidence: await fs.unlink(breakerPath).catch(ignoreError); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationindex.ts:225Evidence: await fs.unlink(lockPath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationindex.ts:228Evidence: await fs.unlink(breakerPath).catch(ignoreError); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationindex.ts:268Evidence: await fs.unlink(lockPath).catch(ignoreError); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationindex.ts:320Evidence: await fs.unlink(lockPath).catch(ignoreError); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationindex.ts:513Evidence: await fs.unlink(tempFilePath).catch(() => {}); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
Permissions
Scope: excessive · Shell: enabled · Network egress: no · File deletion: enabled · Human approval: none
Provenance
License: SEE LICENSE IN LICENSE · Lockfile: no · Security policy: no · Signals: unverified origin
Independently scanned by the OpenTrustBench registry (not self-reported by the project). Static analysis only — no code executed, findings need human triage, counts may include test/example code. Static snapshot; re-scan before relying on it: npx @opentrustbench/cli scan https://github.com/modelcontextprotocol/servers/tree/main/src/memory. Scores move with every upstream commit; pages refresh weekly. How scoring works.