io.github.YonasValentin/mcp-memory-graph
NPM · MCP-MEMORY-GRAPH · SCANNED SEP 20
Local-first memory for Claude Code and any MCP client: hybrid search + knowledge graph, $0/token.
Available components
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 Security89
- No malware found by supply-chain analysis.Pass
- CVE check failed: a known high-severity CVE affects sharp 0.34.5, reached via @huggingface/transformers > sharp. A fixed version is available. View diagnostics → Fail
- No install/post-install scripts declared.Pass
- 74 of 212 dependencies flagged as unhealthy (2 deprecated). View diagnostics → Partial
Provenance & Transparency87
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to YonasValentin/mcp-memory-graph). View diagnostics → Pass
- License check failed: the license (PolyForm-Noncommercial-1.0.0) isn't a recognized OSI-approved license. See how to fix → Fail
- Actively maintained (last published 75 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability69
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 8922 tokens (~174/item across 51 items; 51 tools + 0 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 Management87
- Stability observed for 26 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage99
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 98% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 52 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
How do I install the io.github.YonasValentin/mcp-memory-graph server?
io.github.YonasValentin/mcp-memory-graph runs locally as an npm package, launched with npx -y mcp-memory-graph. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · mcp-memory-graph
claude mcp add yonasvalentin-mcp-memory-graph -- npx -y mcp-memory-graph
{
"mcpServers": {
"yonasvalentin-mcp-memory-graph": {
"command": "npx",
"args": [
"-y",
"mcp-memory-graph"
]
}
}
} {
"servers": {
"yonasvalentin-mcp-memory-graph": {
"command": "npx",
"args": [
"-y",
"mcp-memory-graph"
]
}
}
} codex mcp add yonasvalentin-mcp-memory-graph -- npx -y mcp-memory-graph
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"yonasvalentin-mcp-memory-graph": {
"type": "local",
"command": [
"npx",
"-y",
"mcp-memory-graph"
],
"enabled": true
}
}
} openclaw mcp add yonasvalentin-mcp-memory-graph --command npx --arg -y --arg mcp-memory-graph
mcp_servers:
yonasvalentin-mcp-memory-graph:
command: "npx"
args: ["-y", "mcp-memory-graph"] {
"McpServers": {
"yonasvalentin-mcp-memory-graph": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"mcp-memory-graph"
]
}
}
} assistant mcp add yonasvalentin-mcp-memory-graph -t stdio -c npx -a -y mcp-memory-graph
{
"mcpServers": {
"yonasvalentin-mcp-memory-graph": {
"command": "npx",
"args": [
"-y",
"mcp-memory-graph"
]
}
}
} 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.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 −2
- Stability: pass → 0.80 functional
- 17 Sept 26 0
- Stability: 0.97 → pass security
- 16 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 11 Sept 26 −2
- Stability: pass → 0.80 functional
- 10 Sept 26 0
- Stability: 0.97 → pass security
- 9 Sept 26 +1
- GHSA-rgj7-g3m4-5g8c affects this package: high ▼ security
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/mcp-memory-graph@2.10.3
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 | YonasValentin/mcp-memory-graph |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/YonasValentin/mcp-memory-graph/.github/workflows/release.yml@refs/tags/v2.10.3 |
| Rekor log index | 2084853267 |
| Predicate type | https://slsa.dev/provenance/v1 |
| Subject digest | sha512:bb14d422b8c04ef83f5b0cc0d41992e5ea65ea12fd6f78ece3aa3d14c02f13f105ca164c47e6f4dd6e1c345a5d87c7e79f34dc61d14f4d6df3743599c |
Background: How many MCP packages publish verified provenance →
Vulnerabilities 2 findings
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-f88m-g3jw-g9cj | high | yes | ||
| GHSA-rgj7-g3m4-5g8c | high | yes |
Background: What a vulnerability scan can and cannot prove →
Dependencies 212 packages
| Packages resolved | 212 |
|---|---|
| Deprecated | 2 |
| Stale | 73 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
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 →
core_memory_append ~125
Append text to the pinned core-memory block (newline-separated when non-empty). If the result would exceed char_limit the write is refused (error: core_memory_full) so you compact via core_memory_replace instead of silently overflowing.
| Name | Type | Req | Description |
|---|---|---|---|
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
| text | string | yes | Text to append to the pinned core-memory block (newline-separated when the block is non-empty). Refused if it would exceed char_limit — compact via core_memory_replace instead. |
No output schema declared.
No examples provided.
core_memory_get ~88
Read the pinned "core memory" block for a (scope, namespace) — a small, bounded, always-in-context note the agent maintains about who it is and what matters now. Returns content, char_limit, and used (character count).
| Name | Type | Req | Description |
|---|---|---|---|
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
No output schema declared.
No examples provided.
core_memory_replace ~126
Replace the first occurrence of old_text with new_text in the pinned core-memory block. Returns error: not_found if old_text is absent, or core_memory_full if the result would exceed char_limit. Use this to update or compact the block.
| Name | Type | Req | Description |
|---|---|---|---|
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| new_text | string | yes | Replacement text for the first occurrence of old_text |
| old_text | string | yes | Substring to find (first occurrence) in the core-memory block |
| scope | string | – | Memory scope for isolation |
No output schema declared.
No examples provided.
memory_attribution ~111
Multi-agent / team attribution rollup. Returns how many currently-valid top-level memories each agent (agent_id, set at store time) wrote — { by_agent, by_author, total } — distinct from author (the human/source). Memories stored without an agent_id are bucketed under "unattributed". Optional scope/namespace filters scope the rollup.
| Name | Type | Req | Description |
|---|---|---|---|
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
No output schema declared.
No examples provided.
memory_canvas ~236
Export the memory graph as a JSON Canvas 1.0 .canvas — opens as a spatial board in real Obsidian. Each currently-valid top-level memory becomes a text node on a deterministic grid; memory_links become labeled, arrow-tipped edges. Optionally filter by scope/namespace and cap with limit. When vault_path is given the canvas is written there (confined under the vault) and its path returned; otherwise only the canvas object.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum memories to include as canvas nodes (default 50) |
| name | string | – | Filename stem for the written .canvas (default "memory-graph"). Sanitized — path separators and ".." can never escape the vault. |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
| vault_path | string | – | Absolute path to an Obsidian vault directory (created if missing). When given, the canvas is written there as a .canvas file (confined under the vault) and its path is returned; otherwise only the ca… |
No output schema declared.
No examples provided.
memory_communities ~127
GraphRAG global sensemaking (agent-driven, no LLM in the server). Detects communities (densely-connected entity clusters) over the entity graph on demand via weighted label propagation, and returns each community's top entities + linked memories. This is the corpus-level view that chunk-level search can't give — synthesize named themes from the communities to answer "what are the main themes?".
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum communities to return, largest first (default 20) |
| min_size | integer | – | Drop communities with fewer than this many entities (default 1) |
No output schema declared.
No examples provided.
memory_condense ~60
Apply agent-generated summaries to condense old memories. Preserves original content for later restoration. Use after consolidation reports flag condensation candidates.
| Name | Type | Req | Description |
|---|---|---|---|
| memories | array | yes | Batch of memories with agent-generated summaries |
| target_level | string | – | Target condensation level |
No output schema declared.
No examples provided.
memory_consolidate ~219
Run the "dream cycle": find and merge near-duplicate memories, prune expired/low-quality entries, and update quality scores based on access patterns. Use dry_run=true to preview changes.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | If true, report what would be done without making changes |
| forgetting_floor | number | – | Opt-in spaced-repetition prune. When set (0-1), remove weakly-held memories whose retention e^(-Δt/stability) has decayed below this floor. Omit to disable. |
| max_operations | integer | – | Maximum number of merge/prune operations per run |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| prune_expired | boolean | – | Remove memories past their expires_at date |
| prune_low_quality | boolean | – | Remove memories with both low importance and low confidence |
| scope | string | – | Memory scope for isolation |
| similarity_threshold | number | – | Cosine similarity threshold for duplicate detection (0.5-1.0) |
No output schema declared.
No examples provided.
memory_delete ~61
Delete memories by ID or by filter criteria (scope, department, before_date, expired_only). Provide at least one of id or filter.
| Name | Type | Req | Description |
|---|---|---|---|
| filter | object | – | Delete memories matching filter criteria |
| id | string | – | Delete a specific memory by ID |
No output schema declared.
No examples provided.
memory_expertise ~141
Adaptive per-user expertise profile. action=observe records demonstrated knowledge of a topic (level rises on a saturating curve, never collapses other topics); action=get returns the profile. The agent supplies the classified topic — the server just tracks evidence over time.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | observe demonstrated knowledge of a topic | get the profile |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Scope (default 'user'). |
| topic | string | – | The topic (required for observe; optional filter for get). |
| weight | integer | – | Evidence increment for observe (default 1). |
No output schema declared.
No examples provided.
memory_export ~127
Export memories as JSON for backup or migration. Supports filtering by scope, namespace, and department. Max 1000 records per export.
| Name | Type | Req | Description |
|---|---|---|---|
| department | string | – | Department (e.g., legal, engineering, hr, sales, finance) |
| limit | integer | – | Maximum memories to export in this page (live, top-level only) |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| offset | integer | – | Pagination offset; use with has_more to export a large corpus in pages |
| scope | string | – | Memory scope for isolation |
No output schema declared.
No examples provided.
memory_export_dataset ~167
Export high-signal rows (auto-extracted learnings + agent reflections) as instruction→output training pairs (pairs/chatml/alpaca) for a project LoRA/distillation flywheel. Read-only, quality-filtered by importance/confidence. Training stays out of the repo — this only emits the JSONL.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | Output shape: {prompt,completion} | ChatML messages | Alpaca instruction/output. |
| limit | integer | – | Max training pairs to emit. |
| min_confidence | number | – | Quality floor on confidence_score. |
| min_importance | number | – | Quality floor on importance_score. |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
No output schema declared.
No examples provided.
memory_export_vault ~153
Write memories OUT to an Obsidian vault as .md files with YAML frontmatter — the reverse of vault_sync. Each currently-valid top-level memory becomes a plain markdown file a human can open and edit; namespaced memories land under <vault>/<namespace>/. Lossless: written files parse back via the vault parser. Optionally filter by scope/namespace.
| Name | Type | Req | Description |
|---|---|---|---|
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
| vault_path | string | yes | Absolute path to the target Obsidian vault directory (created if missing). Memories are written as .md files with YAML frontmatter — the reverse of vault_sync. |
No output schema declared.
No examples provided.
memory_extract_entities ~80
Store LLM-extracted entities and relationships for a memory. The calling agent should analyze memory content and provide structured entity/relationship data. This enables knowledge graph queries.
| Name | Type | Req | Description |
|---|---|---|---|
| entities | array | yes | Entities extracted from the memory content |
| memory_id | string | yes | Memory ID to associate extracted entities with |
| relationships | array | – | Relationships between entities |
No output schema declared.
No examples provided.
memory_extract_learnings ~180
Extract decisions, patterns, error fixes, and conventions from a session transcript using heuristic analysis. Deduplicates against existing memories and optionally auto-stores.
| Name | Type | Req | Description |
|---|---|---|---|
| auto_store | boolean | – | If true, automatically store extracted learnings as memories |
| categories | array | – | Which categories of learnings to extract (default: all) |
| department | string | – | Department (e.g., legal, engineering, hr, sales, finance) |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
| source | string | – | Source identifier for the session (e.g., "session-2026-03-26") |
| tags | array | – | Tags for categorization |
| transcript | string | yes | Session transcript or conversation text to extract learnings from |
No output schema declared.
No examples provided.
memory_forget ~193
GDPR-grade forget (additive — does NOT replace memory_delete). hard:false (default) soft-deletes/tombstones: stamps valid_to so the memory is excluded from default retrieval but stays queryable via as_of and is recoverable. hard:true erases for real: returns a portability "export" copy FIRST (data-subject access), THEN permanently deletes (irreversible, cascades). Returns { forgotten, mode, recoverable, export? }.
| Name | Type | Req | Description |
|---|---|---|---|
| hard | boolean | – | Erasure mode. false (default): soft-delete/tombstone — stamps valid_to so the memory is excluded from default retrieval but remains queryable via as_of and is recoverable. true: hard erase — returns… |
| id | string | yes | Memory ID to forget |
No output schema declared.
No examples provided.
memory_get ~56
Retrieve a specific memory by its ID. Optionally include child chunks for ingested documents.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Memory ID to retrieve |
| include_chunks | boolean | – | If true, also return child chunks for ingested documents |
No output schema declared.
No examples provided.
memory_graph ~115
Query the knowledge graph: find entities, their relationships, and linked memories. Use entity name to start traversal, or browse all entities by type. Supports multi-hop traversal (depth 1-3).
| Name | Type | Req | Description |
|---|---|---|---|
| depth | integer | – | Graph traversal depth (1-3 hops) |
| entity | string | – | Entity name to start graph traversal from |
| entity_type | string | – | Filter entities by type |
| include_memories | boolean | – | Include linked memories in the response |
| limit | integer | – | Maximum entities to return |
No output schema declared.
No examples provided.
memory_health ~79
Store health report: live/retired/stale counts, aging buckets, unresolved conflicts, and webhook delivery health, rolled up to a single ok|attention status with reasons. Read-only; optionally scoped.
| Name | Type | Req | Description |
|---|---|---|---|
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
No output schema declared.
No examples provided.
memory_history ~94
Point-in-time history surface for one memory: its current bi-temporal timeline (created_at/updated_at/valid_from/valid_to/tx_expired/superseded_at/version) plus the full memory_versions edit history. Returns { memory_id, exists, timeline, versions } or { memory_id, exists:false }.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Memory ID to get the bi-temporal timeline + version history for |
No output schema declared.
No examples provided.
memory_import ~65
Import memories from JSON. Each item is embedded and stored. Use overwrite=true to update existing memories by ID.
| Name | Type | Req | Description |
|---|---|---|---|
| data | array | yes | Array of memory objects to import (max 500 per batch) |
| overwrite | boolean | – | If true, overwrite existing memories with same ID |
No output schema declared.
No examples provided.
memory_ingest ~275
Ingest a full document: automatically chunks it based on content type (text, markdown, code, legal), embeds each chunk, and stores with provenance. Use this for large documents.
| Name | Type | Req | Description |
|---|---|---|---|
| access_level | string | – | Access classification level |
| author | string | – | Who created this content |
| chunk_overlap | integer | – | Overlap between chunks in characters for context preservation |
| chunk_size | integer | – | Target chunk size in characters (~4 chars per token) |
| content | string | yes | Full document content to ingest |
| content_type | string | – | Content type determines chunking strategy |
| department | string | – | Department (e.g., legal, engineering, hr, sales, finance) |
| document_type | string | – | Type of document (e.g., contract, policy, code, incident, decision) |
| metadata | object | – | Domain-specific metadata (e.g., {contract_type: 'NDA', parties: ['A','B']}) |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
| source | string | – | Origin of the content (e.g., file path, URL, system name) |
| tags | array | – | Tags for categorization |
| title | string | – | Document title |
No output schema declared.
No examples provided.
memory_insights ~112
Active advisor digest: what in the store needs ATTENTION now — unresolved conflicts, memories flagged stale by change-propagation, most-contradicted facts, and decisions recorded with no supporting evidence. Complements memory_questions (what to capture next). Read-only; optionally scoped.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum number of insights to return (default 20) |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
No output schema declared.
No examples provided.
memory_lesson ~317
Capture a structured lesson or incident in one call: fills the matching section template (incident → Symptom/Root Cause/Fix/Prevention; lesson → What/Why it matters/How to apply) from your field values and stores it through the normal write path (deduped — a repeat capture is a NOOP). Unknown document_types use a generic scaffold.
| Name | Type | Req | Description |
|---|---|---|---|
| access_level | string | – | Access classification level |
| department | string | – | Department (e.g., legal, engineering, hr, sales, finance) |
| document_type | string | – | Section template to fill: lesson | incident | decision | bug-fix | meeting | session. Unknown types use a generic Summary/Details/Notes scaffold. |
| fields | object | yes | Section values keyed by section name (snake_case ok), e.g. {symptom, root_cause, fix, prevention} for an incident or {what, why_it_matters, how_to_apply} for a lesson. Omitted sections keep a placeho… |
| importance_score | number | – | Manual importance 0–1 (higher surfaces first in reflection/recall) |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
| source | string | – | Origin of the content (e.g., file path, URL, system name) |
| tags | array | – | Tags for categorization |
| title | string | – | Optional title (auto-derived from the first field value when omitted) |
No output schema declared.
No examples provided.
memory_link_check ~180
Find BROKEN [[wikilinks]] — the inverse of memory_unlinked_mentions. Reports (1) unresolved: a [[Title]] in a memory's content that matches no LIVE memory title in the same scope/namespace; (2) dangling_edges: stored wikilink edges whose target memory was deleted or superseded. Resolution is by TITLE (memories have no slug) so write [[Exact Title]]. Pass an id to check one memory, or scope/namespace to sweep a partition. Read-only.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | – | Check one memory by ID. Omit to sweep a whole partition (scope/namespace). |
| limit | integer | – | Max source memories to inspect in a sweep |
| namespace | string | – | Sweep namespace (when no id is given) |
| scope | string | – | Sweep scope (when no id is given) |
No output schema declared.
No examples provided.
memory_list ~222
Browse memories with filtering and pagination. Supports sorting by creation date, update date, or title.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | – | ISO 8601 point-in-time: return memories that were valid at this instant (bi-temporal). Defaults to currently-valid memories when omitted. Must be a full ISO-8601 timestamp (date + time + zone); a dat… |
| department | string | – | Department (e.g., legal, engineering, hr, sales, finance) |
| document_type | string | – | Type of document (e.g., contract, policy, code, incident, decision) |
| limit | integer | – | Maximum results to return |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| offset | integer | – | Skip this many results for pagination |
| scope | string | – | Memory scope for isolation |
| sort_by | string | – | Field to sort results by |
| sort_order | string | – | Sort direction |
No output schema declared.
No examples provided.
memory_manifest ~142
Get a lightweight index of all memories — titles, types, tags, and scores without content. Use this to discover what knowledge exists before running expensive searches.
| Name | Type | Req | Description |
|---|---|---|---|
| department | string | – | Department (e.g., legal, engineering, hr, sales, finance) |
| document_type | string | – | Type of document (e.g., contract, policy, code, incident, decision) |
| limit | integer | – | Maximum entries to return (default 500) |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| offset | integer | – | Skip this many entries for pagination |
| scope | string | – | Memory scope for isolation |
No output schema declared.
No examples provided.
memory_query ~224
Answer a question with a TIGHT, relevant subgraph instead of flooding context. Seeds from hybrid search, walks the memory graph (hub-avoiding) up to max_hops, and returns a token-budgeted "context" string plus structured nodes — with an actionable hint when truncated.
| Name | Type | Req | Description |
|---|---|---|---|
| max_hops | integer | – | How many hops to walk out from the seed memories (1-4). |
| max_tokens | integer | – | Approximate token budget for the rendered context (~4 chars per token). Nodes are rendered until the budget is hit, then truncated with a hint. |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| query | string | yes | The question to answer. Seeds from hybrid search, then walks the memory graph to return a tight, relevant subgraph instead of flooding context. |
| scope | string | – | Memory scope for isolation |
| seed_limit | integer | – | Maximum seed memories from the initial search. A gap cutoff drops seeds scoring below 20% of the top seed to keep the traversal focused. |
No output schema declared.
No examples provided.
memory_query_structured ~150
Structured query over memory PROPERTIES (the agent's "Bases/Dataview"): filter currently-valid, top-level memories by scope/namespace/department/document_type/language/tags (AND)/min_importance/created_at range, sort by created_at|updated_at|importance_score|title, paginate, and project specific fields. Exact, deterministic retrieval that complements fuzzy memory_search — use it for "all decision memories in namespace=acme with importance>0.7, newest first".
| Name | Type | Req | Description |
|---|---|---|---|
| fields | array | – | Return only these fields (projection) |
| filter | object | – | – |
| limit | integer | – | – |
| offset | integer | – | – |
| sort | object | – | – |
No output schema declared.
No examples provided.
memory_questions ~155
Active "questions to ask" digest. Surfaces open questions / gaps the graph is uniquely positioned to find so you know what to verify or learn next: AMBIGUOUS inferred links to confirm (verify), frequently-mentioned but barely-documented entities (gap), and disconnected memories that may be stale or mis-scoped (orphan). Returns { questions: [{ question, type, evidence }], count } over currently-valid top-level memories. Optional scope/namespace filters and limit (default 20).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum number of questions to return (default 20) |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
No output schema declared.
No examples provided.
memory_reflect ~256
Generative-Agents-style reflection (agent-driven, no LLM in the server). mode:"gather" (default) returns the most reflection-worthy memories (high importance × recent) as material plus an instruction to synthesize 1–3 higher-level insights. mode:"store" persists a synthesized insight (provenance="reflection") and "derived_from"-links it to its source memories.
| Name | Type | Req | Description |
|---|---|---|---|
| insight | string | – | store: the higher-level insight you synthesized from the gathered material |
| limit | integer | – | gather: max reflection-material rows to return (default 10) |
| mode | string | – | "gather" (default): the server SELECTs the most reflection-worthy memories (high importance × recent) as material for you to synthesize. "store": persist a synthesized insight back, linked to its sou… |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
| source_ids | array | – | store: ids of the source memories this insight was derived from (linked via "derived_from"; non-existent ids are skipped) |
| title | string | – | store: optional short title for the stored insight |
No output schema declared.
No examples provided.
memory_related ~69
Find memories semantically related to a given memory ID. Uses vector similarity to discover connections.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Memory ID to find related memories for |
| limit | integer | – | Maximum number of related memories to return |
| min_similarity | number | – | Minimum similarity threshold (0-1) |
No output schema declared.
No examples provided.
memory_restore ~107
Bring a memory back: un-tombstones a soft-forgotten memory (memory_forget {hard:false}) by clearing valid_to/tx_expired so it re-enters default recall, AND/OR restores a condensed memory to its original full content. Both are applied when both apply. Returns reinstated/uncondensed flags.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Memory ID to bring back — un-tombstones a soft-forgotten memory and/or restores condensed content to original full text |
No output schema declared.
No examples provided.
memory_revalidate ~167
Change-propagation surface. action=list: memories flagged needs_revalidation (a source they were derived from changed). action=preview: the blast radius of a change to `id` (which dependents WOULD be flagged) without mutating anything. action=confirm: clear `id`'s stale flag after re-verifying it.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | list stale memories | preview the blast radius of a change to `id` (dry-run) | confirm `id` is current |
| id | string | – | Memory id (required for preview/confirm). |
| limit | integer | – | Max stale memories to list. |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
No output schema declared.
No examples provided.
memory_search ~789
Search memories using hybrid vector+keyword search. Finds semantically similar content and exact keyword matches, with optional filters for scope, department, tags, date range, and temporal decay.
| Name | Type | Req | Description |
|---|---|---|---|
| access_level | string | – | Access classification level |
| as_of | string | – | ISO 8601 point-in-time: return memories that were valid at this instant (bi-temporal). Defaults to currently-valid memories when omitted. Must be a full ISO-8601 timestamp (date + time + zone); a dat… |
| auto_decay | boolean | – | When true and no explicit temporal_decay is given, derive decay per result from its volatility class (volatile facts decay fast, stable facts not at all). Down-ranks stale volatile facts without hand… |
| date_from | string | – | Filter: only memories created at/after this full ISO-8601 timestamp (e.g. 2026-03-01T00:00:00Z) |
| date_to | string | – | Filter: only memories created at/before this full ISO-8601 timestamp (e.g. 2026-03-31T23:59:59Z) |
| department | string | – | Department (e.g., legal, engineering, hr, sales, finance) |
| detail_level | string | – | Controls response detail: "summary" returns titles + snippets (default, saves tokens), "full" returns complete content, "ids_only" returns just IDs and titles for browsing |
| document_type | string | – | Type of document (e.g., contract, policy, code, incident, decision) |
| language | string | – | Content language (ISO 639-1 code) |
| limit | integer | – | Maximum results to return |
| max_tokens | integer | – | Approximate maximum response size in tokens (~4 chars per token). Results are truncated to fit within budget. Applies after detail_level projection. |
| min_confidence | number | – | Minimum confidence score threshold (0-1) |
| min_groundedness | number | – | Minimum TRUST threshold (0-1), distinct from min_confidence (relevance). Drops results whose groundedness — stored confidence_score + provenance tier + recency — is below this. Use to demand well-sou… |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| offset | integer | – | Skip this many results for pagination |
| query | string | yes | Search query — supports natural language for semantic search and keywords for exact matching |
| rerank | boolean | – | Enable local cross-encoder reranking: reorder the top candidates by joint (query, document) relevance using a cross-encoder model — the biggest precision win over the bi-encoder base embedder. Slower… |
| rerank_top_n | integer | – | How many top candidates to rerank when "rerank" is true (default 50). Higher = better recall coverage but slower. |
| scope | string | – | Memory scope for isolation |
| search_mode | string | – | Search mode: hybrid (vector+keyword), vector only, or keyword only |
| tags | array | – | Filter to memories containing ALL specified tags |
| temporal_decay | object | – | Apply time-based decay to favor recent memories |
| use_graph | boolean | – | Enable HippoRAG multi-hop recall: seed the entity graph from the query and fuse Personalized PageRank as a third ranker, surfacing memories connected through entities (associative recall) that pure v… |
No output schema declared.
No examples provided.
memory_session_note ~201
Frictionless per-session capture ("daily note for agents"). Keyed by source "session:<session_id>": the first call creates one session memory (document_type "session"); every later call for the same session_id appends to that same memory (newline-joined, re-embedded and versioned). Different session_ids stay isolated. Returns { memory_id, created, appended }.
| Name | Type | Req | Description |
|---|---|---|---|
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
| session_id | string | yes | Session identifier. The note is keyed by source "session:<session_id>" — the first call creates the memory, later calls append to that same one. |
| text | string | yes | Text to capture (created as content, or appended newline-joined to the session note). |
| title | string | – | Optional title used only on create (defaults to "Session <session_id>"). |
No output schema declared.
No examples provided.
memory_session_state ~221
Save or resume a resumable session-state ("where was I"): structured summary/next_steps/open_questions/files_touched/branch keyed by session_key. save upserts (versioned, so you can diff sessions via memory_version_diff); resume returns the latest. Bypasses the dedup write-gate so an incremental save always persists.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | save the current session state | resume the latest |
| branch | string | – | Git branch this session is on. |
| extra | object | – | Any additional caller-defined state fields. |
| files_touched | array | – | Files in flight. |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| next_steps | array | – | Ordered list of what to do next. |
| open_questions | array | – | Unresolved questions. |
| scope | string | – | Memory scope for isolation |
| session_key | string | – | Stable key for the work thread (defaults to branch, else "default"). |
| summary | string | – | Where things stand right now. |
No output schema declared.
No examples provided.
memory_stats ~85
Get usage statistics: total memories, chunks, documents, breakdowns by scope/department/type, storage size, and expired count.
| Name | Type | Req | Description |
|---|---|---|---|
| department | string | – | Department (e.g., legal, engineering, hr, sales, finance) |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
No output schema declared.
No examples provided.
memory_store ~531
Store a new memory with content, metadata, and automatic vector embedding. Use this to save information, decisions, patterns, or knowledge for later semantic retrieval.
| Name | Type | Req | Description |
|---|---|---|---|
| access_level | string | – | Access classification level |
| agent_id | string | – | Identifier of the writing agent for multi-agent attribution |
| author | string | – | Who created this content |
| content | string | yes | The text content to store as a memory |
| department | string | – | Department (e.g., legal, engineering, hr, sales, finance) |
| document_type | string | – | Type of document (e.g., contract, policy, code, incident, decision) |
| expires_at | string | – | Full ISO-8601 expiration timestamp, e.g. 2026-03-01T00:00:00Z (memory auto-excluded from search after this) |
| importance_score | number | – | Explicit importance 0-1 (governance/criticality). When omitted it is derived from content; min_importance filters operate on this value. |
| language | string | – | Content language (ISO 639-1 code) |
| metadata | object | – | Domain-specific metadata (e.g., {contract_type: 'NDA', parties: ['A','B']}) |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| on_conflict | string | – | Write policy when a near-match exists. "add" (default): insert as new, except an exact duplicate is skipped (NOOP) — identical to prior behaviour. "update": merge content into the existing match (app… |
| scope | string | – | Memory scope for isolation |
| source | string | – | Origin of the content (e.g., file path, URL, system name) |
| tags | array | – | Tags for categorization |
| title | string | – | Short title for the memory |
| verification_detail | string | – | Free text: how/when/by-what the fact was verified (e.g. "checked live UAT DB 2026-06-18"). |
| verification_tier | string | – | How well this fact is verified: source_verified > tool_verified > asserted > unverified. Lowers groundedness for unverified claims. Omit ⇒ neutral. |
| volatility | string | – | Override the auto-derived volatility class. Omit to auto-classify from content + document_type (volatile deploy/status facts warn sooner on recall). |
No output schema declared.
No examples provided.
memory_template ~150
Fetch an Obsidian-style note scaffold for a document_type so stored memories stay structurally consistent. Returns a markdown template with ## Section headers (e.g., decision → Context/Decision/Consequences; incident → Symptom/Root Cause/Fix/Prevention; also learning, bug-fix, meeting, session). Unknown types get a generic Summary/Details/Notes scaffold (known:false). Read-only: fill the scaffold, then store it via memory_store.
| Name | Type | Req | Description |
|---|---|---|---|
| document_type | string | yes | Document type to fetch a note scaffold for (e.g., decision, incident, learning, bug-fix, meeting, session). Unknown types get a generic Summary/Details/Notes scaffold (known:false). |
No output schema declared.
No examples provided.
memory_tiers ~107
Show the MemGPT-style tier distribution (hot / recall / archival) of currently-valid, top-level memories and list the hot working set. Tiers are derived from access recency + frequency — hot = frequently or recently accessed, archival = old and rarely touched, recall = everything in between. Read-only; optional scope/namespace filter.
| Name | Type | Req | Description |
|---|---|---|---|
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
No output schema declared.
No examples provided.
memory_unlinked_mentions ~172
Surface "unlinked mentions" for a memory — other memories that are semantically related (vector-near + shared entities) but that you have NOT explicitly linked yet. This is Obsidian's killer feature, automated: instead of matching note titles as literal text, it uses embeddings + the entity graph to propose latent connections the agent never made. Auto "similar_to" suggestions are surfaced; existing wikilink/co-occurrence/typed links are excluded. Use it to discover and then confirm real connections (e.g. via memory_extract_entities or a stored link).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Memory ID to surface unlinked mentions for |
| limit | integer | – | Maximum number of unlinked mentions to return |
| min_similarity | number | – | Minimum cosine similarity for a mention (0-1) |
No output schema declared.
No examples provided.
memory_update ~243
Update an existing memory. If content changes, the vector embedding is automatically regenerated. Previous versions are preserved in history.
| Name | Type | Req | Description |
|---|---|---|---|
| changed_by | string | – | Who made this change (for version history) |
| content | string | – | New content (will re-generate embedding) |
| expires_at | – | – | New full ISO-8601 expiration timestamp (e.g. 2026-03-01T00:00:00Z), or null to remove |
| id | string | yes | ID of the memory to update |
| importance_score | number | – | Reassign importance 0-1 (governance/criticality) |
| metadata | object | – | Updated metadata (replaces existing) |
| tags | array | – | Updated tags (replaces existing) |
| title | string | – | New title |
| verification_detail | string | – | Free text accompanying a verification_tier change. |
| verification_tier | string | – | Set/upgrade the verification tier after the fact (the main post-hoc use case — you verify a stored claim against live state later). Raises/lowers groundedness. |
| volatility | string | – | Manual override of the auto-derived volatility class. |
No output schema declared.
No examples provided.
memory_verify ~266
Verify the signed provenance envelope of memories: recomputes each content_hash and ed25519-checks the signature against THIS machine's trusted signing key (not the row's self-embedded key). Verify one by id, or a batch by scope/namespace. Returns per-memory status (verified / unsigned / tampered / untrusted) + a summary {verified, unsigned, tampered, untrusted}. "untrusted" = validly signed but by a non-trust-root key (e.g. a teammate on a synced vault) — distinct from "tampered". Read-only. Signing is enabled by MCP_SIGN_MEMORIES.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | – | Verify a single memory by id. Omit to verify a batch by scope/namespace. |
| limit | integer | – | Max memories to verify in batch mode (default 100) |
| namespace | string | – | Namespace within scope (e.g., project name, team name) |
| scope | string | – | Memory scope for isolation |
| trusted_pubkeys | array | – | Additional trusted signer public keys (SPKI PEM) for multi-machine/team vaults — a memory signed by any of these (or by MCP_TRUSTED_PUBKEYS, or this machine's own key) verifies instead of reading 'un… |
No output schema declared.
No examples provided.
memory_version_diff ~94
Show a line-by-line diff between two revisions of a memory (Obsidian-Sync-grade trust). `to` defaults to the current version. Use it to audit exactly what an edit changed — added/removed lines plus a summary count.
| Name | Type | Req | Description |
|---|---|---|---|
| from | integer | yes | Version number to diff from |
| id | string | yes | Memory ID |
| to | integer | – | Version to diff to (defaults to current) |
No output schema declared.
No examples provided.
memory_version_restore ~96
Roll a memory back to a prior version's content. The restore is itself a versioned, re-embedded edit (the pre-restore state is snapshotted, the vault file re-mirrored) — never a destructive overwrite. Returns the restored memory.
| Name | Type | Req | Description |
|---|---|---|---|
| changed_by | string | – | Who performed the restore |
| id | string | yes | Memory ID |
| version | integer | yes | Version number to restore content from |
No output schema declared.
No examples provided.
memory_versions ~55
View the version history of a memory, showing all past edits with timestamps and who made each change.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Memory ID to get version history for |
| limit | integer | – | Maximum number of versions to return |
No output schema declared.
No examples provided.
memory_webhook ~252
Manage the active-infrastructure event bus (gated on MCP_WEBHOOKS). register an outbound webhook target (URL is SSRF-validated — public http(s) only), list targets (secrets never returned), delete a target, or dispatch the durable delivery queue now. Mutations to memories (created/updated/superseded/deleted/forgotten) enqueue HMAC-signed deliveries that this tool drains with retry + circuit-breaker + dead-letter.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | register a target | list targets | delete a target | dispatch the queue now |
| events | string | – | Comma-separated event types or '*' (default all): memory.created/updated/superseded/deleted/forgotten. |
| id | string | – | Target id (action=delete). |
| namespace | string | – | Only deliver events for memories in this namespace. |
| scope | string | – | Only deliver events for memories in this scope. |
| secret | string | – | Optional HMAC-SHA256 signing secret; sent as X-Memory-Signature on each delivery. |
| url | string | – | Target URL (action=register). Validated against the SSRF guard: public http(s) only. |
No output schema declared.
No examples provided.
vault_search ~237
Search memories via hybrid vector+keyword search, scoped to a namespace. Defaults the namespace to the vault folder name; pass an explicit `namespace` to search memories that live under a different namespace (e.g. after memory_export_vault).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum results to return |
| min_confidence | number | – | Minimum confidence score threshold (0-1) |
| namespace | string | – | Namespace to search. Defaults to the vault folder name — set this when your memories live in a namespace different from the vault directory name (e.g. after memory_export_vault wrote them under <vaul… |
| offset | integer | – | Skip this many results for pagination |
| query | string | yes | Search query — supports natural language for semantic search and keywords for exact matching |
| scope | string | – | Memory scope to search (default "project") |
| search_mode | string | – | Search mode: hybrid (vector+keyword), vector only, or keyword only |
| tags | array | – | Filter to memories containing ALL specified tags |
| vault_path | string | yes | Absolute path to the Obsidian vault directory |
No output schema declared.
No examples provided.
vault_status ~54
Check the sync status of an Obsidian vault: total files, synced/pending/changed counts, last sync time, and memory count.
| Name | Type | Req | Description |
|---|---|---|---|
| vault_path | string | yes | Absolute path to the Obsidian vault directory |
No output schema declared.
No examples provided.
What is the io.github.YonasValentin/mcp-memory-graph server?
io.github.YonasValentin/mcp-memory-graph is listed in the public MCP registry as io.github.YonasValentin/mcp-memory-graph. Local-first memory for Claude Code and any MCP client: hybrid search + knowledge graph, $0/token. This page covers its npm package (mcp-memory-graph).
Is the io.github.YonasValentin/mcp-memory-graph server safe to use?
io.github.YonasValentin/mcp-memory-graph scores 87 out of 100 on VerifyMCP. We recorded 2 known advisories against 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 io.github.YonasValentin/mcp-memory-graph server expose?
io.github.YonasValentin/mcp-memory-graph exposes 51 tools: memory_store, memory_search, memory_get, memory_update, memory_delete, and 46 more. Their descriptions and schemas cost roughly 8,705 tokens of context every time the server is loaded.
Is the io.github.YonasValentin/mcp-memory-graph server still maintained?
io.github.YonasValentin/mcp-memory-graph 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 io.github.YonasValentin/mcp-memory-graph server under?
io.github.YonasValentin/mcp-memory-graph declares the PolyForm-Noncommercial-1.0.0 licence, which is not on the OSI-approved list. Read the terms before using it at work, and note this covers the source only, not the cost of any service it calls.