About Engrama
Engrama is an MCP server in the RAG category: a memory graph designed for the agent that uses it, not the human who feeds it. Engrama reconstructs context from associations on demand, replacing the "stuff everything into the prompt" reflex with targeted graph traversal. SQLite default, Neo4j optional.
Install
git clone https://github.com/scops/engramaThis server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.
Tools (14)
engrama_approve_insightApprove or dismiss a pending Insight after human review.
| Parameter | Type | Description |
|---|---|---|
| action | string | 'approve' or 'dismiss'. |
| title * | string | Exact title of the Insight. |
engrama_contextRetrieve a node and its neighbourhood up to N hops. Use this to
build rich context before answering a question — e.g. fetch the
user's Person node to see their projects, or a Technology node to
see what it connects to. Works even for isolated nodes (returns the
node with an empty neighbours list).
| Parameter | Type | Description |
|---|---|---|
| hops | integer | Maximum relationship depth to traverse. |
| label * | string | Label of the starting node — one of: CTF, Client, Concept, Course, Dataset, Decision, Domain, Exercise, Experiment, Gear, Insight, Location, Material, Model, Person, Photo, Pipeline, Problem, Project, Species, Target, Technique, Technology, Tool, Vulnerability. |
| name * | string | Name of the starting node. |
engrama_gdpr_forgetPermanently erase **the caller's own** memory (GDPR, Spec 001 US-3).
| Parameter | Type | Description |
|---|---|---|
| mode | string | 'dry-run' (default, safe) reports what would be erased without deleting anything; 'apply' permanently erases the caller's own identity. There is no undo and no server-side backup. |
engrama_ingestRead a document, conversation, or text and return its content with
entity extraction guidance. After calling this tool, use the returned
content and extraction prompt to identify entities and relationships,
then call ``engrama_remember`` with inline relations for each entity.
| Parameter | Type | Description |
|---|---|---|
| context_hint | string | Optional hint about the context (e.g. project name, domain, course). Helps guide entity extraction. |
| source * | string | Content to ingest. Either a vault-relative path to a note (e.g. '10-projects/websocket-debugging.md') or raw text content. |
| source_type | string | Type of source: 'note' (vault path — will be read), 'text' (raw text content), or 'conversation' (conversation transcript). |
engrama_reflectDetect cross-entity patterns in the memory graph. Call this
periodically (e.g. at the end of a session or when the user asks
for insights) to discover solution transfers between projects,
shared technologies, training opportunities, technique transfers,
concept clusters, stale knowledge, and under-connected nodes.
Parameters not published.
engrama_reindexFind and repair nodes that are missing their vector embedding.
| Parameter | Type | Description |
|---|---|---|
| dry_run | boolean | Only meaningful for mode='apply'. Default true (simulate). Pass false explicitly to actually re-embed and write. |
| limit | integer | Maximum number of vector-less nodes to process in this call. |
| mode * | string | One of 'detect' | 'classify' | 'apply'. Run them in that order. |
engrama_relateConnect two nodes with a typed relationship. Always call this
right after engrama_remember to wire the new node into the graph.
Also use it to record newly discovered connections between existing
nodes. Both endpoints must already exist (create them first with
engrama_remember if needed).
| Parameter | Type | Description |
|---|---|---|
| from_label * | string | Label of the source node — one of: CTF, Client, Concept, Course, Dataset, Decision, Domain, Exercise, Experiment, Gear, Insight, Location, Material, Model, Person, Photo, Pipeline, Problem, Project, Species, Target, Technique, Technology, Tool, Vulnerability. |
| from_name * | string | Name of the source node. |
| rel_type * | string | Relationship type — one of: ABOUT, APPLIES, BELONGS_TO, CAUSED_BY, COMPOSED_OF, CONTRADICTS, COVERS, DEPENDS_ON, DOCUMENTS, EVALUATES, EXECUTED_WITH, EXPLOITS, FEATURES, FEEDS, FOR, HAS, HAS_MATERIAL, IMPLEMENTS, INCLUDES, INFORMED_BY, INHABITS, INSTANCE_OF, INVOLVES, IN_DOMAIN, LINKS_TO, ORIGIN_OF, PERFORMS, PRACTICES, PREREQUISITE_OF, RELATED_TO, REPLACES, REQUIRES, RUNS, SERVES, SHOT_WITH, SIMILAR_TO, SOLVED_BY, SUBSET_OF, TAKEN_AT, TARGETS, TEACHES, TRAINS_ON, USES. |
| to_label * | string | Label of the target node — one of: CTF, Client, Concept, Course, Dataset, Decision, Domain, Exercise, Experiment, Gear, Insight, Location, Material, Model, Person, Photo, Pipeline, Problem, Project, Species, Target, Technique, Technology, Tool, Vulnerability. |
| to_name * | string | Name of the target node. |
engrama_rememberStore a piece of knowledge as a node in the memory graph.
| Parameter | Type | Description |
|---|---|---|
| force_new | boolean | Create the node even if it looks like an existing one. Only matters when the server runs with ENGRAMA_REMEMBER_DEDUPE=block; otherwise possible duplicates are reported, never refused. |
| label * | string | Node label — one of: CTF, Client, Concept, Course, Dataset, Decision, Domain, Exercise, Experiment, Gear, Insight, Location, Material, Model, Person, Photo, Pipeline, Problem, Project, Species, Target, Technique, Technology, Tool, Vulnerability. |
| properties * | object | Node properties. Must include 'name' (or 'title' for Decision/Problem). For rich retrieval, include enrichment fields: - 'summary': 2–3 sentence overview — what this is, why it matters - 'details': comprehensive context — techniques, decisions, approaches, alternatives, key examples. The richer this field, the more useful the memory becomes. - 'tags': freeform list for filtering, e.g. ["active-directory", "credential-access", "windows"] - 'source': how this knowledge was captured ("conversation", "ingest", "manual", "sync") - 'status': current state ("active", "resolved", "superseded") Example of a GOOD node: {"name": "kerberoasting-lab", "summary": "Hands-on lab demonstrating Kerberoasting against AD service accounts using Rubeus and Hashcat, with detection via Event 4769.", "details": "Students request TGS tickets for SPNs with Rubeus kerberoast, crack offline with Hashcat. Covers RC4 vs AES crackability, detection via Event 4769 anomalies. Defense: gMSA, AES-only policy, honey tokens.", "tags": ["active-directory", "credential-access", "lab"], "source": "conversation"} Example of a BAD (too thin) node: {"name": "kerberoasting-lab", "description": "Lab about kerberoasting"} |
| relations | object | Optional relations to create in the same call. Format: {"REL_TYPE": ["target_name", ...]}. Example: {"USES": ["Python"], "IN_DOMAIN": ["teaching"], "FOR": ["Acme Corp"]}. Targets are matched by name; a missing target is created as a stub. By default the stub's label is inferred from the relation type, which is lossy. To pin it, pass an object instead of a string: {"RELATED_TO": [{"name": "Python", "label": "Tool"}]}. |
engrama_searchSearch the memory graph. Use this at the START of every session
to load context relevant to the current topic, and whenever you need
to check whether a node already exists before creating it.
| Parameter | Type | Description |
|---|---|---|
| limit | integer | Maximum results to return. |
| query * | string | Lucene-syntax search string (e.g. 'neo4j', 'Python framework'). |
engrama_statusReturn a snapshot of the running Engrama MCP server's configuration.
Parameters not published.
Show all 14 tools
engrama_surface_insightsRetrieve pending Insights for human review. Call this after
engrama_reflect, or periodically, to show the user patterns the
graph has detected. Present each Insight and ask the user to
approve or dismiss it — never act on an Insight without explicit
approval.
| Parameter | Type | Description |
|---|---|---|
| limit | integer | Maximum number of pending Insights to return. |
| query | any | Optional: return only pending Insights semantically related to this query (same cosine gate as the search proactive hint). Ignored if ``title`` is given. |
| title | any | Optional: return only the pending Insight with this exact title. |
engrama_sync_noteSync a single note from Engrama's internal Obsidian vault to the graph.
| Parameter | Type | Description |
|---|---|---|
| dry_run | boolean | When true, do not write to the graph or inject `engrama_id` into the note's frontmatter. Return the same JSON shape as a real sync, with a `would_*` view of what the operation would have done. Useful to preview a sync against a different vault before committing. |
| path * | string | Vault-relative path to the note, e.g. '10-projects/engrama.md'. |
engrama_sync_vaultScan Engrama's internal Obsidian vault and reconcile all notes.
| Parameter | Type | Description |
|---|---|---|
| dry_run | boolean | When true, do not write to the graph or inject `engrama_id` into any note's frontmatter. Return the same JSON shape as a real sync, with counts of what *would* be created/updated/skipped and the list of files that would receive an `engrama_id` injection. Useful to preview the impact before committing to a full scan. |
| folder | string | Optional folder to restrict the scan (vault-relative). Empty string scans the entire vault. |
engrama_write_insight_to_vaultAppend an approved Insight as a section in an Obsidian note.
| Parameter | Type | Description |
|---|---|---|
| target_note * | string | Relative path to the Obsidian note to append to. |
| title * | string | Exact title of the approved Insight. |
Ask AI
Ask AI about Engrama
Powered by Claude · Grounded in docs
Security checks
6 checks have not been run yet.