Graph-Memory (stevepridemore/graph-memory) is an MCP server listed on the M8ven Trust Index. It scores 41 out of 100, grade D. It declares 23 tools. No publisher has claimed this listing.
Self-hosted personal knowledge graph for Claude that persists across sessions, devices, and tools. Built on Neo4j with local semantic embeddings; OAuth 2.1 lets Claude Code, Claude Desktop, and claude.ai web all hit the same graph.
Caution. Specific findings reduced this grade. They are listed on the page. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.
How we verified
Verified is a snapshot. Live keeps it current, and builds your track record.
⚡ Connect GitHub → continuous verification on every pushwhy connect →Who stands behind it
stevepridemore
Source: Glama
Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →
Install from
The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.
These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.
graph_queryQuery the memory graph by canonical entity name. Use when you know the entity name or close-to-canonical form (e.g. "Steve", "graph-memory"); for natural-language phrasing or synonyms (e.g. "the knowledge graph project") prefer graph_search. Returns up to `limit` matching nodes plus the edges that c…
graph_relateCreate or strengthen a relationship between entities. Creates the endpoint entities if they don't exist. Use single mode (from_name/to_name/relation) for one fact at a time. Use batch mode when extracting from a transcript or document — it's atomic, so a partial failure won't leave dangling nodes. I…
graph_deletePermanently delete an entity node and all its edges by ID. Use for removing duplicate or erroneous nodes. Cannot be undone.
graph_boostIncrease an edge's weight when the user confirms recalled information. Call this when the user says 'yes', 'exactly', or confirms something you retrieved from the graph. Persists immediately; weight clamps at 1.0 so repeated boosts saturate rather than overflow. Returns the previous and new weight.
graph_weakenDecrease an edge's weight when the user corrects a recalled fact. Call this when the user says 'no', 'that's wrong', or corrects something from the graph. Persists immediately; weight clamps at 0.0. Returns an error if the edge doesn't exist — use graph_delete to remove an entity outright. To replac…
graph_entitiesBrowse or search the entity catalog. Use to check if an entity exists before creating one with graph_relate, or to list entities of a given type. For relationship-aware lookups (entity + its neighbors) use graph_query instead. Returns up to `limit` entities ordered by `sort_by`; pagination is single…
graph_contradictionsFind facts that contradict each other in the memory graph — pairs connected by a CONTRADICTS edge. Use during reviews, before a graph_decay run, or when the user asks about conflicting information. Returns `{contradictions: [{node_a, node_b, description, detected_date, resolved}], count}` ordered by…
graph_ingestQueue a document for asynchronous extraction into the memory graph (mode='queue'), or check the ingest backlog (mode='status'). Use this when you have a file the user wants summarized into the graph but doesn't need it reflected in the same conversation — the nightly dream process picks queued docum…
graph_cypherExecute a read-only Cypher query against the memory graph. You generate the Cypher — this tool just runs it. Enforced read-only via Neo4j executeRead(). Use for custom queries not covered by other tools. Admin-only (must be the bootstrap tenant) — non-admin tenants would otherwise be able to bypass …
graph_decayApply time-based decay to every node confidence and edge weight using per-type half-lives (preferences ~693d, events ~99d, etc.). Called by the dream process during maintenance. Always preview with dry_run=true first — decay is irreversible without restoring from a graph_export backup. Returns count…
graph_pruneRemove entities and edges that have decayed below threshold. DESTRUCTIVE — always preview first. Requires user confirmation before execute mode.
graph_unmergeSplit a falsely merged entity back into two separate entities, redistributing specified edges. Use when entity resolution made a mistake (e.g. merged 'Anna' and 'Anne'). The original entity keeps every edge not listed in `edges_to_move`; the new entity gets the listed edges plus a fresh embedding st…
graph_mergeConsolidate two entities into one — moves source's edges onto target, adopts source properties for keys target doesn't have, then deletes source. Inverse of graph_unmerge. Use after graph_merge_suggestions surfaces a duplicate pair, or whenever you've confirmed two nodes refer to the same thing. Sam…
graph_merge_suggestionsSurface candidate pairs of entities likely to be duplicates. Read-only — never auto-merges. Combines embedding similarity, shared-neighbor overlap, and name-token Jaccard. Same-type only. Use to triage entity-explosion before running graph_merge (destructive consolidation) or graph_relate with ALIAS…
graph_statsGraph health dashboard — node/edge counts by type, average weight, orphan count, unresolved contradictions, stale entries, schema version, and pending ingest backlog. Returns aggregate counts only; for individual entities use graph_entities. Call at session start to size up the graph before deeper q…
graph_validategraph_build_contextgraph_reembedgraph_searchgraph_communitiesgraph_exportgraph_read_transcriptgraph_auditBOOTSTRAP_TENANT_IDCF_ACCESS_AUDCF_ACCESS_TEAM_DOMAINGRAPH_MEMORY_HOMELOCAL_TENANT_IDMCP_PORTMCP_TRANSPORTNEO4J_DATABASENEO4J_PASSWORDNEO4J_URINEO4J_USEROAUTH_ALLOWED_EMAILSOAUTH_ISSUEROAUTH_MAX_CLIENTSOAUTH_REDIRECT_URI_HOSTSTENANT_ID_SOURCETLS_CERTTLS_KEYTool annotations
21/23 tools have annotations
Add readOnlyHint or destructiveHint annotations to every tool so hosts can warn users before invoking.
All four hints declared on every tool
23/23 tools missing one or more hints — graph_query (missing: destructiveHint, idempotentHint, openWorldHint); graph_relate (missing: readOnlyHint, destructiveHint, openWorldHint); graph_delete (missing: readOnlyHint, idempotentHint, openWorldHint), +20 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.
For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.
Tool annotations match behaviour
1 read-only tool performs write/delete/exec — graph_stats (line 79: mkdirSync(join(GRAPH_MEMORY_HOME, "logs"), { recursive: true }))
Either remove the readOnlyHint:true annotation, or remove the write/delete call from the tool handler.
Destructive tools are labelled
1 tool perform destructive updates without destructiveHint — graph_export deletes at line 1524 (unlinkSync(join(backupsDir, f.name)))
Add destructiveHint:true to any tool whose handler calls .delete(), .upsert(), .update(), unlink, rm, DELETE, DROP, REPLACE INTO, or any operation that overwrites existing data.
Descriptions match behaviour
1 tool describes read intent but its handler mutates — graph_ingest (line 508: mkdirSync(pendingDir, { recursive: true }))
Rename the tool, rewrite the description, or move the side-effect into a separate clearly-named tool.
Tool test coverage
Only 0/23 tools referenced in tests (0%)
Write tests that reference each tool by name so every tool has at least one test.
Tests pass
npm test failed — tests do not pass
Make sure npm test runs cleanly. Common cause: missing build step or missing env vars.
Secrets not logged
3 secret values sent to error/log
Redact or omit secret values from log output.
Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.
[](https://m8ven.ai/mcp/stevepridemore/graph-memory)?variant=verified from the URL.Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.
https://m8ven.ai/api/mcp/tool-check