Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

FactMem

NPM · @FACTMEM/MCP · SCANNED SEP 20

A local memory engine. You own the SQLite file. Not Mem0's hosted OpenMemory MCP.

Available components

+3 this week 85 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 35 of 109 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency74
  • Repository check failed: the declared repository URL redirects; it must resolve directly. See how to fix → View diagnostics → Fail
  • Cryptographically verified build provenance (signed, bound to gordonkjlee/factmem). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 17 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability79
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 2599 tokens (~216/item across 12 items; 10 tools + 2 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management63
  • Stability observed for 19 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 10 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 12 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the FactMem MCP server?

FactMem runs locally as an npm package, launched with npx -y @factmem/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @factmem/mcp

# add to Claude Code
claude mcp add gordonkjlee-factmem -- npx -y @factmem/mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "gordonkjlee-factmem": {
      "command": "npx",
      "args": [
        "-y",
        "@factmem/mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "gordonkjlee-factmem": {
      "command": "npx",
      "args": [
        "-y",
        "@factmem/mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add gordonkjlee-factmem -- npx -y @factmem/mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "gordonkjlee-factmem": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@factmem/mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add gordonkjlee-factmem --command npx --arg -y --arg @factmem/mcp
# ~/.hermes/config.yaml
mcp_servers:
  gordonkjlee-factmem:
    command: "npx"
    args: ["-y", "@factmem/mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "gordonkjlee-factmem": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@factmem/mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add gordonkjlee-factmem -t stdio -c npx -a -y @factmem/mcp
// mcp.json
{
  "mcpServers": {
    "gordonkjlee-factmem": {
      "command": "npx",
      "args": [
        "-y",
        "@factmem/mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 19 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

  • 17 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

  • 15 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

  • 12 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

  • 10 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

  • 8 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

  • 7 Sept 26 +1
    • Security disclosure: unverified → pass functional
  • 6 Sept 26 0
    • Security disclosure: pass → unverified functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Analysed npm/@factmem/mcp@0.26.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo gordonkjlee/factmem
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/gordonkjlee/factmem/.github/workflows/publish.yml@refs/heads/main
Rekor log index 2685485821
Predicate type https://slsa.dev/provenance/v1
Subject digest sha512:33b21355e0831460713d3fdfdc60782ef5d46c46e1b3a90e6ad117d701301cae0d9a093905361d1631b89c2eb57281148df1a9f51fc75a14a6f1dc581

Background: How many MCP packages publish verified provenance →

Dependencies 109 packages
Packages resolved 109
Stale 35
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 10 exposed · ~2,464 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
capture_fact ~289

Store a durable fact worth remembering across sessions. A durable fact is a stable piece of knowledge about whatever this store is used for: its subjects, their attributes, their relationships, decisions, and context. Ignore ephemeral statements (current tasks, transient mood). Call this proactively whenever you learn something this store should keep. Capture is fast — the server stores the fact immediately. Entity extraction, domain classification, and cross-session reconciliation run in batch when you call consolidate. Capture frequently without slowing the conversation. Exact same-session duplicates are dropped immediately. Cross-session exact duplicates are also rejected during the next consolidation run — safe to capture the same fact from multiple conversations without polluting the knowledge graph.

NameTypeReqDescription
capture_contextstringWhat the conversation is about right now
confidencenumberHow confident (0.0–1.0)
contentstringyesThe fact to capture
domain_hintstringSuggested domain. Domains are whatever this store uses, not a fixed list — call get_schemas to see them, reuse an existing one where it fits, and propose a new short lowercase noun when none does. Om…
importancenumberHow important (0.0–1.0). High for medical/safety, low for casual preferences
source_event_idstringID of the event that prompted this capture

No output schema declared.

No examples provided.

consolidate ~164

Turn what has been captured into long-term knowledge. Copies new lines from named sources, extracts candidate facts from them, and integrates the pending facts: domains, entities, duplicates, contradictions, the knowledge graph. Call this to integrate pending facts into long-term knowledge. Good checkpoints: after capturing several facts, at a topic change, or before the conversation ends. Extract is capped at 50 of the oldest unexamined events per call; events_remaining in the result says how many wait. Pass all: true to take the whole backlog in one call, or limit: N for the oldest N.

NameTypeReqDescription
allbooleanExtract the whole backlog this call instead of the capped oldest batch
limitintegerExtract at most this many of the oldest unexamined events

No output schema declared.

No examples provided.

get_context ~143

Get everything known about a topic, combining search with entity relationship traversal. More comprehensive than search_knowledge — it follows entity connections outward: from a named subject to the things it relates to, and the facts about those in turn. Call this when you need the COMPLETE picture of a topic, subject, or domain rather than a specific fact — planning something involving a person, project or system, catching up on a subject, or answering an open-ended question about any of them. Prefer search_knowledge when you want one fact fast; prefer this when missing a connection would make your answer wrong.

NameTypeReqDescription
topicstringyesTopic, person, project, or domain to explore

No output schema declared.

No examples provided.

get_entity ~451

Get everything known about a named thing — who or what it is, the facts about it, and how it connects to other things. A "thing" is any subject this store holds knowledge about: a person, an organisation, a project, a place, a product, a system — whatever the store is used for. This is the "tell me about X" tool. Call this WHENEVER a named thing is mentioned or alluded to and knowing it would improve your answer — including indirect references like "my manager", "the Helsinki office", "the payments service". Call it before advising on anything involving that thing, and before asking who or what something is — you may already know. Facts come back most relevant first, each flagged with is_subject. True means the fact is ABOUT this thing; false means it only mentions it. Treat the difference as real when you answer: "Alex's transfer was approved by Robin" is worth knowing when asked about Robin, but it is a fact about Alex, and reporting it as something you know about Robin would be wrong. Other relationship values are the same kind of role — this entity's part in this fact, free text, not a directed graph edge. Do not infer who did what to whom from the wording. If several entity rows share that name under different types (the extractor labelled one thing two ways), facts from all of them come back. Hyphens, underscores, and stray punctuation count as the same letters only when that does not join two names already stored as separate rows. If this store has no entity by that name, facts that mention the wording still come back (is_subject false) rather than an empty miss. found is whether an entity row exists, not whether anything is known.

NameTypeReqDescription
namestringyesThe thing's name. Resolve an indirect reference to a name first if you can (e.g. via get_context or a prior fact).
typestringOptional type filter, only for disambiguation when one name refers to two different things (a person and a project both called 'Mercury'). Types are whatever this store uses — omit it to match any ty…

No output schema declared.

No examples provided.

get_events ~121

Retrieve events from the current or a previous session. Returns the raw episodic record — messages, tool calls, tool results, and artifacts in sequence order. Use this to recall what happened earlier in a conversation (especially after context compaction), or to review a previous session.

NameTypeReqDescription
after_sequencenumberOnly return events after this sequence number (for pagination).
limitnumberMaximum events to return (default 50).
session_idstringSession to query (matches MCP or client session ID). Omit for the current session.

No output schema declared.

No examples provided.

get_schemas ~98

List the knowledge domains this user's memory actually uses, and their subdomains. The set is not fixed — beyond the core domains it grows to fit the user, so it is worth asking rather than assuming. Call this before filtering a search by domain, before choosing a domain_hint for capture_fact, or when you want to know how this user's knowledge is organised. Rarely needed mid-conversation — search_knowledge and get_context work without it.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_session_context ~103

At the start of every conversation, before answering, call get_session_context unless you already loaded the memory://briefing resource. That call returns the same working briefing the resource would have injected. Tools-only clients never fetch resources. Also returns facts captured in this session that have not been consolidated yet. Call it before re-capturing a fact you may have already stored this session.

NameTypeReqDescription
session_idstringSession to query. Omit for the current session.

No output schema declared.

No examples provided.

get_stats ~340

Get knowledge base statistics — how many facts are currently true, how many are held in total including superseded history, entity and domain counts, how facts are distributed across domains, and how much raw log can be reclaimed. Call this when the user asks what you know or remember about them, how much you have stored, or whether their memory is working. This answers "how much do you know", not "what do you know" — use search_knowledge, get_entity or get_context for actual recall. `embeddings` reports semantic-search coverage per model. An empty list means this store searches by keyword only, which is the default. A count well below the current fact count means some facts are findable by wording but not by meaning — worth mentioning if the user asks why something was not recalled. `extract.unextracted_events` is how many transcript lines extract has not examined. `pending_facts` is I not yet integrated. A large unextracted count with a healthy fact count means capture is writing D that extract has not examined. `intelligence` is billed consolidation spend (calls, tokens, elapsed), broken down by stage and provider for the last 24 hours, all time, and the last few runs. Embeddings are not this number — they are a separate API. Token fields are omitted when the provider did not report them, not shown as zero. `token_budget` is remaining room under optional intelligence.token_budget caps (per billed provider, rolling hour / day / week / month). Unset means unlimited. Over the cap, consolidate skips extract, holds the watermark, and does not fall back to the heuristic.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

log_event ~337

Record a raw exchange — a user message, your response, a tool call, a tool result, an artifact — as the episodic record consolidation later extracts facts from. Logging both sides gives that extraction the context to know what a reply refers to. Where the client has hooks configured, every event is logged for you automatically and you do not need to call this at all. Call it when there are no hooks, or when an exchange matters enough to preserve verbatim — a decision, a correction, a specification — and you want it recorded whether or not hooks are running. Duplicates are reconciled at consolidation, so logging something twice is safe. To store a fact you already know, use capture_fact instead: this tool records what was said, not what it means.

NameTypeReqDescription
contentstring|nullyesText content of the event
content_refstring|nullURI or path for non-text content
content_typestringHow to interpret the content. Defaults to 'text' for messages. Use 'json' for structured data, 'image' for screenshots or generated images, 'audio' for voice or audio clips, 'binary' for anything els…
event_typestringyesType of event
metadataArbitrary metadata
rolestringyesChannel that produced this event (user, assistant, system, tool). For a named person on a group transcript, keep role as user and pass speaker.
speakerstring|nullNamed participant when the transcript has one (e.g. Alex). Role stays the channel — do not invent a person role.

No output schema declared.

No examples provided.

search_knowledge ~418

Search the knowledge base. Call this BEFORE answering questions that might benefit from what this store knows. If you have not called get_session_context (or loaded memory://briefing) this conversation, do that first — otherwise you start without this store's context. Returns facts ranked by relevance with source attribution and confidence scores. Three fields come back. `results` is integrated knowledge: deduplicated, reconciled against everything else known, entities resolved. Each result carries speaker_role when the primary event is known (user, assistant, system, or tool) and speaker when the transcript named the person — who uttered it, not who it is about. `pending` is what was captured recently and not yet consolidated — real, and usually the most recent thing you were told, but not yet checked against existing knowledge, so it may duplicate or contradict a fact in results. Trust results first; use pending to avoid forgetting something you were told minutes ago. `episodes` is filled only when results are empty: a short raw-log window around a keyword hit in the copied transcript, not yet extracted. It is not knowledge of the same standing — do not report it as an integrated fact. When semantic search is enabled, `results` also matches on meaning, so a query can surface a fact that shares none of its words. `pending` and `episodes` never do — they are keyword-only. A just-captured fact is findable by its own words but not yet by a paraphrase of them.

NameTypeReqDescription
domainstringPrioritise a domain. Domains are whatever this store uses — they are not a fixed list, so call get_schemas to see them rather than guessing. This biases ranking rather than filtering: facts in the do…
querystringyesWhat to search for

No output schema declared.

No examples provided.

Common questions

What is the FactMem MCP server?

FactMem is an MCP server listed in the public MCP registry as io.github.gordonkjlee/factmem. A local memory engine. You own the SQLite file. Not Mem0's hosted OpenMemory MCP. This page covers its npm package (@factmem/mcp).

Is the FactMem MCP server safe to use?

FactMem scores 85 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the FactMem MCP server expose?

FactMem exposes 10 tools: log_event, get_events, capture_fact, get_session_context, consolidate, and 5 more. Their descriptions and schemas cost roughly 2,464 tokens of context every time the server is loaded.

Is the FactMem MCP server still maintained?

FactMem is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the FactMem MCP server under?

FactMem declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.