knowmind
The knowmind server is an AI memory and knowledge management layer that gives AI assistants persistent, searchable memory — enabling them to store, recall, update, and link information across sessions.
Recall knowledge (
knowmind_recall): Hybrid search (BM25 + vector + graph traversal) over your knowledge corpus to retrieve relevant memories, decisions, and facts.Time-filtered recall (
knowmind_recall_at_time): Query what was known at a specific point in time using bi-temporal filtering.Store memories (
knowmind_store_memory): Save insights, decisions, preferences, facts, and results as typed memory entries (semantic, episodic, procedural, or reference).Upload documents (
knowmind_upload_document): Ingest longer texts with automatic chunking, embeddings, and graph indexing; re-uploading by title replaces the old version.Update facts (
knowmind_update_fact): Update an existing memory bi-temporally — the old entry is marked as superseded, preserving full history.Link memories (
knowmind_link): Create typed relationships between memory nodes (e.g.,HAS_EMPLOYEE,DEPENDS_ON); inverse edges are created automatically.Unlink memories (
knowmind_unlink): Remove a typed relationship between two memory nodes, including its inverse.List relations (
knowmind_list_relations): Retrieve all incoming and outgoing relationships for a specific memory node.List recent entries (
knowmind_list_recent): Browse the most recently created documents and memories.Health check (
knowmind_health): Get the current status of platform components (Postgres, Memory Service, Graph).Corpus statistics (
knowmind_stats): View counts of stored memories, graph edges, and chunks in your tenant corpus.
Integrates with GitHub Copilot via VS Code to provide long-term memory and knowledge graph capabilities, allowing AI agents to store and retrieve contextual information during development.
knowmind
Persistent memory for your AI tools. Store something once, and it is available in Claude Code, Cursor, and any other MCP client that runs a local (stdio) server — as a typed knowledge graph with provenance, confidence, and a bitemporal history for every fact. Hosted in Germany (Hetzner, Nuremberg data center); the CLI and MCP server in this repository are Apache-2.0.
The free tier is permanently free and requires no payment details. The API, CLI, and MCP server are included in every tier.
Connect your AI tool in three steps
Create a free account at knowmind.de and generate an access token: Dashboard → API tokens.
Store the token locally:
npx -y knowmind login --token kmt_xxxxxxxxWire up your client:
Claude Code (one command)
claude mcp add knowmind --env KNOWMIND_TOKEN=kmt_xxx -- npx -y knowmind mcpCursor (~/.cursor/mcp.json) — also works for Claude Desktop, Windsurf, Cline, Continue, Goose, and Zed with their respective config files:
{
"mcpServers": {
"knowmind": {
"command": "npx",
"args": ["-y", "knowmind", "mcp"],
"env": { "KNOWMIND_TOKEN": "kmt_xxx" }
}
}
}Any other MCP client: knowmind is a standard MCP server over stdio (npx -y knowmind mcp). On Windows, if npx does not start directly, use "command": "cmd", "args": ["/c", "npx", "-y", "knowmind", "mcp"].
npx -y knowmind install <ide> writes this configuration for you (e.g. claude, cursor, vscode), and npx -y knowmind init sets up automatic memory hygiene — recall before each task, store after each meaningful change — for clients with a hook or rule mechanism (Claude Code, Cursor).
Related MCP server: Memory Nexus MCP
How knowmind stores facts
Bitemporal history. Every fact carries two time axes: when it was true and when it was recorded. Corrections never overwrite the original; the old statement stays queryable with the date it stopped being valid, so you can reconstruct what the system knew on any given day.
Provenance and confidence per fact. New facts require a confidence level and keep a link to their source. Older facts without a confidence level are marked as such.
Typed knowledge graph. Entities and relations use a restricted set of edge types; catch-all relations are rejected at write time.
Operated in the EU, isolated per tenant. The service runs on Hetzner in Nuremberg, Germany, with tenant isolation, a public data processing agreement, and a subprocessor list at knowmind.de/legal/avv. Access logs are hash-chained and externally timestamped (RFC 3161).
knowmind is a hosted service; there is no self-hosted community edition. If you need self-hosting, one of the projects below will serve you better. knowmind is built for the people and teams that need an operated memory service with an audit trail in the EU.
Pricing
Tier | Price | For whom |
Free | €0 | individuals and evaluation |
Pro | €15/month or €150/year | individual professionals |
Team | €99/month | teams with shared memory |
Business | €349/month | larger teams |
Enterprise | from €1,000/month | organizations with on-premise requirements |
The free tier includes 2,500 memories, 1 user, and a 30-day access log.
How that compares (vendor pricing pages, checked 2026-09-05):
Product | Free tier | First paid tier | Self-hosting |
knowmind | 2,500 memories | €15/month | no (Enterprise on-premise option) |
Mem0 | 10,000 entries, 1,000 retrievals/month | $19/month | yes (Apache-2.0) |
Zep | 10,000 credits/month | $125/month | Graphiti open source; Zep as BYOC |
cognee | 1M tokens, 1 workspace | $2.50 per 1M tokens | yes |
Letta | limited agents, own keys | $20/month | yes (per vendor) |
Supermemory | ~$5 usage included | $19/month | from Scale tier |
Details and current prices: knowmind.de/pricing.
Commands
npx -y knowmind search "Where does the staging deploy run?"
npx -y knowmind upload notes.md --title "Meeting notes 2026-05-12"
npx -y knowmind stats
npx -y knowmind health
npx -y knowmind status --line # one-line status for your AI tool's statuslineAvailable Tools
Thirteen tools over MCP. Every one works against your own workspace; the server never sees another tenant's data.
Reading
knowmind_recall_memories — Search your memory and get the passages that answer a
question, ranked. Combines keyword search, vector similarity and the knowledge
graph, then reranks with a cross-encoder.
query (string, required) · k (integer, default 5, max 20) · hops (integer,
default 2 — how far to follow graph edges from a hit)
Usage: your AI tool asks "Which database does the billing service use?" before
answering, instead of guessing.
Errors: returns an empty result set when nothing matches — never an invented
answer.
knowmind_recall_at_time — The same search, but as your memory stood on a
given date. Facts superseded after that date are excluded; facts that were valid
then are returned even if they are no longer true.
query (string, required) · as_of (ISO date or timestamp, required in
practice) · k (integer, default 5)
Usage: "What was our pricing in March?" — answers from the state of that day,
not today's.
Difference from knowmind_recall_memories: use recall for what is true now, and
recall_at_time for what was true then. Asking recall about the past returns
today's facts.
knowmind_list_recent — The most recently added entries, newest first.
k (integer, default 10)
Usage: a quick look at what landed in memory during this session.
knowmind_list_relations — All typed edges attached to one entry, in both
directions.
memory_id (string, required)
Usage: "What does this contract connect to?" before changing or superseding it.
Errors: unknown id returns an error, not an empty list.
knowmind_get_schema — The entity classes and relation types this workspace
accepts. No parameters.
Usage: call it before knowmind_upsert_entity or knowmind_link_entities to use a type the
server will accept, rather than inventing one.
knowmind_get_stats — Size of the corpus: documents, chunks, entities, edges.
No parameters.
knowmind_get_health — Whether the service and its stores are reachable. No
parameters.
Usage: a status line, or a check before a long ingest.
Writing
knowmind_store_memory — Store a short fact, decision or note. Stays as one
unit; it is not split.
content (string, required) · title (string) · memory_type (string, e.g.
semantic, episodic) · tags (array of strings) · source (string) ·
domain (string) · relations (array — edges to create along with the entry)
Usage: "We decided to keep the monolith until Q3" after a meeting.
Errors: rejected with 422 when the text contains what looks like a password or
an access key. Store a pointer instead, not the secret.
knowmind_upload_document — Store a longer text as a document. It is split
into passages, embedded, and becomes searchable through knowmind_recall_memories.
content (string, required) · title (string) · source (string) ·
relations (array)
Usage: meeting minutes, a specification, a handbook chapter.
Difference from knowmind_store_memory: one sentence you want back verbatim is
a memory; a page you want searched is a document. A long text stored as a memory
is retrieved as one block, which crowds out other results.
knowmind_update_fact — Supersede a fact that has changed. The old version
keeps its validity window and stays auditable; nothing is deleted.
target_id (string, required) · new_title (string, required) · new_content
(string, required) · update_reason (string)
Usage: a price, a deadline or a responsibility changed. Never overwrite —
supersede, so "what did we believe in July" stays answerable.
Errors: unknown target_id is rejected.
knowmind_upsert_entity — Create or update a typed entity (a person, a company, a
product) with aliases.
name (string, required) · entity_class (string, required — see
knowmind_get_schema) · description (string) · aliases (array of strings)
Usage: give "ACME Ltd." its aliases so a question about "ACME" finds it.
Errors: a class outside the schema is rejected.
knowmind_link_entities — Create a typed edge between two entries, with a confidence
value.
from_id (string, required) · to_id (string, required) · rel_type (string,
required — see knowmind_get_schema) · confidence (number 0–1)
Usage: connect a contract to the client it belongs to. The inverse edge is
created for you.
knowmind_unlink_entities — Remove a typed edge.
from_id, to_id, rel_type (all required)
Usage: an edge created in error. The entries themselves stay.
On deleting
There is no delete tool, and that is deliberate. Facts are superseded
(knowmind_update_fact), edges are removed (knowmind_unlink_entities), and the history
stays auditable. Deleting an entire workspace including its data is a
self-service action in the web interface at
knowmind.de — it is not something an agent should be able
to do by calling a tool.
Older tool names
Seven tools were renamed on 12 September 2026 so that every name follows
knowmind_<verb>_<object> and says whether it reads or writes. The previous
names keep answering unchanged until 31 March 2027 and still appear in
discovery, marked as deprecated:
until now | from now on |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
knowmind_entity became upsert, not get: it creates the node or returns
the existing one. Nothing else about the tools changed — same parameters,
same behaviour.
Discovery
GET https://knowmind.de/api/mcp/v1 returns name, version, protocol version and
the full tool list with input schemas — without a token. Directory crawlers and
inspectors can read the complete surface anonymously; only tools/call requires
a key.
Links
Documentation · Pricing · Data processing agreement · Privacy
Die deutsche Fassung steht in README.de.md.
Available Tools
13 toolsknowmind_entityAIdempotent
Create the node for a thing the corpus talks about - a person, an organisation, an application, a host, a technology - or return the existing one. THE GRAPH NEEDS THESE: memories are texts, and two texts mentioning the same server stay unconnected until that server exists as its own node. Create an entity when a name recurs across memories or when you are about to link something that has no node yet, then connect it with knowmind_link. Same name, same class and same tenant always return the same id, so calling twice creates no duplicate. Give the entity its plain proper name ("PostgreSQL", not "the database we use"), and pick the class from the catalogue in knowmind_schema. Requires write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Proper name of the thing, as it would be written in a document. No role, no status, no description. | |
| aliases | No | Other spellings the same thing appears under. Optional. | |
| description | No | One sentence saying what this is. Optional, helps later retrieval. | |
| entity_class | Yes | Class from the catalogue (knowmind_schema -> entityClasses), e.g. Person, Organization, Application, Host, Technology. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that same name/class/tenant returns the same id (idempotent) and that it requires write scope, which aligns with annotations. Adds context about not duplicating nodes, though it does not describe failure modes or side effects beyond creation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is verbose and includes a rationale paragraph ('THE GRAPH NEEDS THESE') that, while informative, could be trimmed. It repeats the idempotency point and includes imperative naming/style advice that lengthens the text without drastically improving clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Provides comprehensive context: why entities are needed, when to create, naming conventions, class catalogue, and write scope. Despite no output schema, the description gives enough for an agent to invoke correctly, though it omits edge cases like duplicates or conflicts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already covers all four parameters with descriptions; the description adds guidance for name formatting (plain proper name) and entity_class selection (from knowmind_schema catalogue). This adds value for the main parameters, while aliases and description rely on schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the tool creates an entity node or returns an existing one, with clear scope (person, organization, application, host, technology). Mentions related tools like knowmind_link, but does not explicitly name an alternative sibling to avoid, so purpose is clear but not maximally distinguishing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit conditions for when to create an entity (when a name recurs or before linking to something without a node) and instructs to connect with knowmind_link. This gives concrete usage guidance beyond the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_healthARead-onlyIdempotent
Return the health of the knowmind backend (Postgres, memory service, graph). Use before a batch of writes or when calls fail, to tell an outage apart from an empty result. Returns a status object per component. Read scope suffices; takes no parameters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds useful context by stating read scope suffices, no parameters, and returns a status object per component, which helps the agent understand the tool's behavior beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and well-structured: the first sentence states the purpose, the second provides usage and return details. No unnecessary information, and the key points are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple health-check tool with no output schema, the description is complete. It covers what the tool returns (status per component), when to use it, and that it is read-only, leaving no ambiguity for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the input schema is trivially complete. The description explicitly notes 'takes no parameters', reinforcing that no arguments are needed and adding clarity beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns the health of the knowmind backend and lists the components (Postgres, memory service, graph). The verb 'return' is specific and distinguishes this from sibling tools like stats or list operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides usage scenarios: before batch writes or when calls fail, to distinguish an outage from an empty result. This gives clear guidance on when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_linkAIdempotent
Create a typed relation between two memory nodes (a knowledge-graph edge). THIS IS HOW THE GRAPH IS BUILT: after storing memories, connect them - a corpus without edges answers only what a single note already says. Subject and object classes must match the predicate; the inverse edge is materialized automatically, and derived edges (RUNS_ON, WORKS_FOR_CLIENT, HOST_SERVES_CLIENT, DEPENDS_ON_SUPPLIER) are computed by the server - never set them by hand. Get both node IDs via knowmind_recall first, and call knowmind_schema for the full catalogue with explanations. Allowed rel_type values: ABOUT (Contract|Document|FileResource → Topic), ASSIGNED_TO (ActionRecord|Task → Agent|Organization|Person|SoftwareAgent), CLIENT_OF (Agent|Organization|Person|SoftwareAgent → Organization), CONTACT_PERSON_FOR (Person → Organization), COVERED_BY (Topic → Contract|Document|FileResource), DELIVERED_AS (Application → Product), DELIVERED_BY (Product → Application), DEPENDS_ON (Application → Application), DEPLOYED_TO (Application → Container), DEVELOPED_BY (Application → Agent|Organization|Person|SoftwareAgent), DEVELOPS (Agent|Organization|Person|SoftwareAgent → Application), ENABLES (Application → Application), FOR_CLIENT (Project → Agent|Organization|Person|SoftwareAgent), HAS_ASSIGNED_TASK (Agent|Organization|Person|SoftwareAgent → ActionRecord|Task), HAS_CHILD (Person → Person), HAS_CLIENT (Organization → Agent|Organization|Person|SoftwareAgent), HAS_CONTACT_PERSON (Organization → Person), HAS_EMPLOYEE (Organization → Person), HAS_OPERATED_APPLICATION (Agent|Organization|Person|SoftwareAgent → Application), HAS_PARENT (Person → Person), HAS_PREDECESSOR (ActionRecord|Project|Task → ActionRecord|Project|Task), HAS_PROJECT (Agent|Organization|Person|SoftwareAgent → Project), HAS_ROLE (Person → Role), HAS_SIBLING (Person → Person), HAS_SKILL (Agent|Organization|Person|SoftwareAgent → Skill), HAS_SUCCESSOR (ActionRecord|Project|Task → ActionRecord|Project|Task), HOSTED_ON (Container → Host), HOSTS (Host → Container), HOSTS_APPLICATION (Container → Application), INFRASTRUCTURE_PROVIDED_BY (Host → Organization), INTEGRATES_WITH (Application → Application), IS_LED_BY (Organization → Person), KNOWS (Person → Person), LEADS (Person → Organization), OPERATED_FOR (Application → Agent|Organization|Person|SoftwareAgent), PAID_BY (Agent|Organization|Person|SoftwareAgent → Agent|Organization|Person|SoftwareAgent), PARTNER_OF (Organization → Organization), PAYS (Agent|Organization|Person|SoftwareAgent → Agent|Organization|Person|SoftwareAgent), PRODUCED_BY (Contract|Document|FileResource → Project), PRODUCES (Project → Contract|Document|FileResource), PROVIDES_INFRASTRUCTURE (Organization → Host), ROLE_OF (Role → Person), SERVED_UNDER (Application → Domain), SERVES (Domain → Application), SKILL_OF (Skill → Agent|Organization|Person|SoftwareAgent), SPOUSE_OF (Person → Person), SUPPLIED_BY (Agent|Organization|Person|SoftwareAgent → Organization), SUPPLIES (Organization → Agent|Organization|Person|SoftwareAgent), SUPPLIES_TECHNOLOGY (Organization → Technology), SUPPORTED_BY (Contract|Document|FileResource → Contract|Document|FileResource), SUPPORTS (Contract|Document|FileResource → Contract|Document|FileResource), TECHNOLOGY_SUPPLIED_BY (Technology → Organization), TECHNOLOGY_USED_BY (Technology → Application), USES_TECHNOLOGY (Application → Technology), WORKED_ON_BY (Project → Agent|Organization|Person|SoftwareAgent), WORKS_FOR (Person → Organization), WORKS_ON (Agent|Organization|Person|SoftwareAgent → Project). Requires write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| to_id | Yes | Memory ID of the target node. | |
| from_id | Yes | Memory ID of the source node (get it via knowmind_recall). | |
| rel_type | Yes | Edge type in UPPER_SNAKE_CASE from the allowed list. Must fit the subject and object classes. | |
| confidence | No | Edge confidence in [0..1]; 1.0 for a fact stated verbatim, 0.7 for a clear paraphrase. Below that, do not create the edge. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses automatic inverse edge materialization, that certain derived edges are server-computed and must not be manually set, and that write scope is required. These behavioral details are not present in the annotations and materially affect how the agent plans its calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded and the explanatory text is efficient. The long list of allowed rel_type values is necessary and directly actionable; while lengthy, it is the core value offered over the structured schema rather than fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nontrivial edge-creation tool, the description covers workflow, prerequisites, allowed values, semantic constraints, derived edges, and scope requirements. No output schema exists, but the tool's return format is not needed to invoke it correctly; the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for IDs and confidence, but the rel_type schema only says 'from the allowed list' without listing it. The description compensates with the full list of allowed values and the subject/object class mappings for each relation, which is critical for selecting a valid parameter value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Create a typed relation between two memory nodes (a knowledge-graph edge)'. It clearly distinguishes this from recall/list/store operations and explains how it fits into graph construction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use the tool ('after storing memories... connect them') and gives explicit prerequisites: get node IDs via knowmind_recall and call knowmind_schema for explanations. It also tells what NOT to do: 'never set derived edges by hand', which removes guesswork.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_list_recentARead-onlyIdempotent
List the most recently created documents/memories in the tenant corpus, newest first (by created_at). Same corpus that recall searches. Use to review what was just stored or confirm a write landed; use knowmind_recall when you already know what you are looking for. Graph-only entities without a timestamp do not appear, so this count intentionally differs from stats.memories. Read scope suffices.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Number of newest entries to return (1-50, default 10). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, non-destructive profile, lowering the bar. The description additionally discloses the sorting key, the corpus identity, an important exclusion ('graph-only entities without a timestamp do not appear'), and the cross-tool discrepancy ('count intentionally differs from stats.memories') — the kind of nuance that prevents an agent from misinterpreting the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero wasted words: front-loaded purpose and ordering, then usage guidance, then behavioral caveats and scope. Every sentence earns its place, there is no redundancy with the schema or annotations, and the critical sibling routing appears early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only tool this is nearly complete: annotations carry safety, the schema covers k entirely, and the description covers ordering, corpus, exclusion behavior, and permission requirements. The only minor gap is that no output schema exists and the description does not spell out the fields per returned entry; agents can partially infer them from the size of the data but a small hint would be fully closed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the single parameter k is fully documented in the input schema with range and default, so the description carries no parameter-meaning burden. The description does not add new semantics for k beyond what the schema already states, making baseline 3 appropriate. This is acceptable, not strong.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Identifies a specific verb and resource — listing the most recently created documents/memories — with the ordering semantics ('newest first by created_at') and corpus scope ('same corpus that recall searches'). It also names the sibling it is not ('use knowmind_recall when you already know what you are looking for'), so an agent can discriminate among the 12 siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('review what was just stored or confirm a write landed') and an explicit alternative-route rule ('use knowmind_recall when you already know what you are looking for'). Also supplies the permission precondition ('read scope is sufficient') so the agent knows it does not need write credentials.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_list_relationsARead-onlyIdempotent
List all relations of one memory (incoming and outgoing), each with its edge type and the connected node. Use to inspect how an entity is connected before adding or removing edges with knowmind_link/knowmind_unlink; find the memory_id first via knowmind_recall. Read scope suffices.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes | Memory ID whose relations to list (get it via knowmind_recall). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and non-destructive behavior. Description adds context by saying 'Read scope suffices' and explaining the intended use case, reinforcing safety but not contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no redundant wording. The structure clearly separates what the tool does from when to use it, and includes necessary cross-references.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter and clear purpose, the description covers all necessary context: what it returns, when to use it, and how to get the required ID. No gaps for the user to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter memory_id is fully described in the schema (including how to obtain it). The description repeats this but does not add new meaning, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool lists all relations of a memory, both incoming and outgoing, with edge type and connected node, distinguishing it from sibling tools like knowmind_link and knowmind_recall.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use it: before adding or removing edges with knowmind_link/knowmind_unlink, and instructs to get memory_id via knowmind_recall, plus notes that read scope is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_recallARead-onlyIdempotent
Retrieve relevant knowledge before answering anything that benefits from prior context - decisions, preferences, project state, people, deadlines, past conversations. Hybrid recall (BM25 + pgvector + graph hops) over the tenant corpus; returns the top-k memory chunks, each with a relevance score and source reference. Suitable whenever earlier context would improve the answer; use knowmind_recall_at_time when you need what was valid at a past point in time. Read scope suffices.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Number of chunks to return (1-25, default 5). | |
| hops | No | Graph expansion depth over typed relations (0-3, default 2); 0 = text/vector only, no graph. | |
| query | Yes | Natural-language question; full sentences retrieve better than keywords. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and non-destructive hints; the description adds meaningful behavioral detail: hybrid recall (BM25 + pgvector + graph hops), top-k chunks with relevance scores and source references, and 'Read scope suffices' for permissions. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded, but contains minor redundancy: 'Retrieve relevant knowledge before answering anything...' and 'Suitable whenever earlier context would improve the answer' overlap. Overall it is appropriately sized, earning a strong score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description covers the operation, when to use, return format (top-k chunks with score and source), and safety. The annotation set plus description provide a complete picture; no output schema exists, but the description compensates for it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining the hybrid recall approach and the role of graph hops, which gives meaning to k and hops parameters, though it does not detail each parameter's syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieve relevant knowledge') and resource (memory chunks from the tenant corpus), and explicitly distinguishes itself from knowmind_recall_at_time. It leaves no doubt about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when it is suitable ('whenever earlier context would improve the answer') and names the alternative (knowmind_recall_at_time) for past-point-in-time retrieval. This is clear when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_recall_at_timeARead-onlyIdempotent
Time-travel recall: return only memories that were valid at a given instant (valid_from <= as_of <= valid_to, or still open). Answers 'what did the agent know on March 14?'. Use instead of knowmind_recall when the point in time matters; otherwise use knowmind_recall for the current truth. Read scope suffices.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Number of chunks to return (1-25, default 5). | |
| as_of | No | ISO-8601 timestamp to evaluate validity at; defaults to now. Example: '2026-03-14T00:00:00Z'. | |
| query | Yes | Natural-language question. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior. The description adds meaningful behavioral detail about temporal validity filtering and notes that read scope suffices, going slightly beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, followed by a concrete example of the question it answers and a clear tool-selection guideline. No unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the temporal recall behavior and relationship to the current-truth variant, while the schema covers parameter bounds and defaults. It does not describe output format, but no output schema is present and the core usage context is sufficiently covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all parameters with descriptions, so the baseline is 3. The description adds the validity-interval semantics (valid_from <= as_of <= valid_to, or still open), which clarifies how as_of is used beyond the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the verb (recall), resource (memories), and temporal scope (valid at a given instant), and explicitly distinguishes it from the sibling tool knowmind_recall by noting when to use each.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage direction: 'Use instead of knowmind_recall when the point in time matters; otherwise use knowmind_recall for the current truth.' This directly routes the agent to the correct tool choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_schemaARead-onlyIdempotent
Return the relation catalogue of this tenant's knowledge graph: every allowed edge type with its subject and object classes and an explanation of when to use it. Call this before building edges with knowmind_link, so you pick the right predicate instead of the nearest-sounding one. Read scope suffices.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description reinforces the read-only nature and adds useful behavioral context: it is scoped to the tenant's graph, returns a catalogue, and 'read scope suffices'. There is no contradiction and it adds meaningful non-schema context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each earning its place: what it returns, when to call it and why, and what scope conveys. It is front-loaded, specific, and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only schema tool, the description is appropriately complete: it specifies the output content, its purpose, the tenant scope, and the read permission requirement. Agents have enough to invoke it correctly without more detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and an empty input schema, so no parameter-level semantics are needed. The baseline for a no-parameter tool is 4, and the description already explains what the returned data will contain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Return the relation catalogue of this tenant's knowledge graph' with the exact content (allowed edge types, subject and object classes, usage explanations). This clearly distinguishes it from data-query siblings like knowmind_list_relations and knowmind_recall, since it returns schema rather than graph instances.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit guidance: call this before building edges with knowmind_link and use it to pick the correct predicate. The 'read scope suffices' note also sets permission expectations. It does not explicitly state when not to call it or contrast with alternatives like knowmind_list_relations, but the core usage context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_statsARead-onlyIdempotent
Return current counts for the tenant corpus: memories, graph edges and vector chunks. Use to gauge how much has been stored; for the actual entries use knowmind_list_recent or knowmind_recall. Read scope suffices; takes no parameters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows it is a safe read operation. The description adds 'Read scope suffices', which is consistent with the annotations but does not introduce new behavioral details such as rate limits or side effects. Since annotations cover the safety profile, the description adds minimal extra value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, comprising two sentences, and is well-structured. It efficiently conveys the purpose, usage, and alternatives without unnecessary detail, making it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple stats tool with no parameters, the description is complete: it defines the output (counts of corpus components), the purpose (gauge storage), and directs to alternatives. No additional context is required for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is empty. The description explicitly states 'takes no parameters', which reinforces the fact despite the schema already being empty. The baseline for 0 parameters is 4, and the statement adds clarity without any ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns counts for the tenant corpus (memories, graph edges, vector chunks) and explicitly distinguishes it from sibling tools by directing users to knowmind_list_recent or knowmind_recall for actual entries. The verb 'Return' is specific and the resource scope is defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly indicates when to use the tool ('to gauge how much has been stored') and also states when not to use it, pointing to alternatives for retrieving actual entries. This provides clear usage boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_store_memoryA
Store durable insights the moment they arise - decisions, preferences, facts, results, appointments. Persists one memory entry in the tenant corpus (Postgres + vector index + graph node), afterwards findable via knowmind_recall and knowmind_list_recent. Append-only: the same title replaces nothing (use knowmind_update_fact to supersede); sha-identical content is detected as idempotent (unchanged). Returns the new memory id. Use for a single short fact; for long or multi-fact text use knowmind_upload_document. GIVE THE EDGES ALONG: whatever the text says about people, organisations, projects, hosts or technologies belongs into relations in THIS call - name the counterpart, the server creates its node and the edge, no second call needed. A memory without edges is a note; with edges it becomes a graph that answers questions nobody wrote down. Use knowmind_link separately only to connect two entries that already exist. Requires write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Free-text keywords for later filtering (lowercase, no spaces recommended). | |
| title | No | Short human-readable title (a few words). Not a uniqueness key - duplicate titles create separate entries. | |
| domain | No | Knowledge domain this entry belongs to, by its short key (e.g. 'sales', 'engineering'). Unknown keys are ignored and the entry stays unassigned - it is never guessed into a domain. | |
| source | No | Where this came from - URL, file path, or a short note. Free text, stored for provenance. | |
| content | Yes | The memory text. Keep it to one atomic fact per entry so it stays retrievable and updatable. | |
| relations | No | Edges from this entry to the things it talks about - set them HERE, in the same call. Name the counterpart in plain words; the server finds or creates its node and draws the edge, so you need neither knowmind_recall nor knowmind_entity nor knowmind_link for it. Example: storing 'Anna Meier leitet die IT bei der Muster GmbH' carries [{predicate: 'WORKS_FOR', object: 'Muster GmbH', object_class: 'Organization'}]. An entry without edges is a note; with edges it answers questions nobody wrote down. Allowed predicate values: ABOUT (Contract|Document|FileResource → Topic), ASSIGNED_TO (ActionRecord|Task → Agent|Organization|Person|SoftwareAgent), CLIENT_OF (Agent|Organization|Person|SoftwareAgent → Organization), CONTACT_PERSON_FOR (Person → Organization), COVERED_BY (Topic → Contract|Document|FileResource), DELIVERED_AS (Application → Product), DELIVERED_BY (Product → Application), DEPENDS_ON (Application → Application), DEPLOYED_TO (Application → Container), DEVELOPED_BY (Application → Agent|Organization|Person|SoftwareAgent), DEVELOPS (Agent|Organization|Person|SoftwareAgent → Application), ENABLES (Application → Application), FOR_CLIENT (Project → Agent|Organization|Person|SoftwareAgent), HAS_ASSIGNED_TASK (Agent|Organization|Person|SoftwareAgent → ActionRecord|Task), HAS_CHILD (Person → Person), HAS_CLIENT (Organization → Agent|Organization|Person|SoftwareAgent), HAS_CONTACT_PERSON (Organization → Person), HAS_EMPLOYEE (Organization → Person), HAS_OPERATED_APPLICATION (Agent|Organization|Person|SoftwareAgent → Application), HAS_PARENT (Person → Person), HAS_PREDECESSOR (ActionRecord|Project|Task → ActionRecord|Project|Task), HAS_PROJECT (Agent|Organization|Person|SoftwareAgent → Project), HAS_ROLE (Person → Role), HAS_SIBLING (Person → Person), HAS_SKILL (Agent|Organization|Person|SoftwareAgent → Skill), HAS_SUCCESSOR (ActionRecord|Project|Task → ActionRecord|Project|Task), HOSTED_ON (Container → Host), HOSTS (Host → Container), HOSTS_APPLICATION (Container → Application), INFRASTRUCTURE_PROVIDED_BY (Host → Organization), INTEGRATES_WITH (Application → Application), IS_LED_BY (Organization → Person), KNOWS (Person → Person), LEADS (Person → Organization), OPERATED_FOR (Application → Agent|Organization|Person|SoftwareAgent), PAID_BY (Agent|Organization|Person|SoftwareAgent → Agent|Organization|Person|SoftwareAgent), PARTNER_OF (Organization → Organization), PAYS (Agent|Organization|Person|SoftwareAgent → Agent|Organization|Person|SoftwareAgent), PRODUCED_BY (Contract|Document|FileResource → Project), PRODUCES (Project → Contract|Document|FileResource), PROVIDES_INFRASTRUCTURE (Organization → Host), ROLE_OF (Role → Person), SERVED_UNDER (Application → Domain), SERVES (Domain → Application), SKILL_OF (Skill → Agent|Organization|Person|SoftwareAgent), SPOUSE_OF (Person → Person), SUPPLIED_BY (Agent|Organization|Person|SoftwareAgent → Organization), SUPPLIES (Organization → Agent|Organization|Person|SoftwareAgent), SUPPLIES_TECHNOLOGY (Organization → Technology), SUPPORTED_BY (Contract|Document|FileResource → Contract|Document|FileResource), SUPPORTS (Contract|Document|FileResource → Contract|Document|FileResource), TECHNOLOGY_SUPPLIED_BY (Technology → Organization), TECHNOLOGY_USED_BY (Technology → Application), USES_TECHNOLOGY (Application → Technology), WORKED_ON_BY (Project → Agent|Organization|Person|SoftwareAgent), WORKS_FOR (Person → Organization), WORKS_ON (Agent|Organization|Person|SoftwareAgent → Project) | |
| memory_type | No | Kind of memory: semantic (durable fact), episodic (event), procedural (how-to), reference (pointer to a resource). Default semantic. | semantic |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description reveals append-only behavior ('the same title replaces nothing'), a specific idempotence rule ('sha-identical content is detected as idempotent'), the returned value ('new memory id'), and a prerequisite ('Requires write scope'). It also explains that relations are persisted in the same call with no second tool needed. Slightly opaque on failure/error behavior and what happens to the graph node when there are no edges, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and a routing sentence in the first two lines. It is longer than it strictly needs to be because the 'GIVE THE EDGES ALONG' section and the schema description for relations repeat the same example and explanation. Still, most sentences earn their place by addressing behavior, routing, or parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a complex tool with 7 parameters and no output schema, the description covers what matters most: what counts as an atomic memory, how to add relations in the same call, which sibling to use instead, and that it returns the new memory id. It is sufficiently complete for an agent to call the tool without requiring the schema or separate documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful operational nuance to key parameters: content should be a single short fact, relations should be filled in the same call with a concrete example, and title is not a uniqueness key. It also rationalizes the relations parameter by explaining the difference between a note and a graph memory, which helps an agent decide how to fill it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Store durable insights' and 'Persists one memory entry in the tenant corpus (Postgres + vector index + graph node)'. It clearly differentiates this tool from close siblings: 'for long or multi-fact text use knowmind_upload_document' and 'use knowmind_update_fact to supersede'. An agent can immediately tell what this tool does and where it fits among the other memory tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit selection criteria: 'Use for a single short fact; for long or multi-fact text use knowmind_upload_document' and names knowmind_update_fact for superseding existing entries. It also tells the agent when not to use linking tools here: 'Use knowmind_link separately only to connect two entries that already exist'. This is full usage guidance with routing to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_unlinkADestructiveIdempotent
Delete a typed relation between two memory nodes; the inverse edge is removed with it. Idempotent - deleting a non-existent edge is a no-op. Use to correct a wrong link created via knowmind_link. Requires write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| to_id | Yes | Memory ID of the target node. | |
| from_id | Yes | Memory ID of the source node. | |
| rel_type | Yes | Edge type to remove (UPPER_SNAKE_CASE, exactly as created). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry destructiveHint=true, idempotentHint=true and readOnlyHint=false. The description adds genuine value beyond those by disclosing the cascade side effect ('the inverse edge is removed with it') and the write-scope requirement, which annotations don't state. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste: the primary action and its most important side effect are front-loaded, followed by idempotency, a use case, and a scope requirement. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, idempotent delete tool with 100% schema coverage and no output schema, the description is complete — it specifies the action, the cascade side effect, the intended use case, and the required authorization scope. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully documents from_id, to_id, and rel_type. The description's 'typed relation between two memory nodes' maps onto the parameters but adds no syntax or format detail beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a typed relation between two memory nodes') and adds a key distinguishing behavior (the inverse edge is removed with it). It clearly contrasts with the sibling knowmind_link that creates relations, so an agent can tell them apart without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the use case ('Use to correct a wrong link created via knowmind_link') and the creation counterpart, plus a prerequisite ('Requires write scope'). It gives clear when-to-use context, though it doesn't enumerate exclusions against other sibling tools like knowmind_update_fact.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_update_factA
Supersede a known fact without losing history: the existing memory gets valid_to=now, a new memory with valid_from=now is created and linked via SUPERSEDES. Use this instead of knowmind_store_memory when a fact CHANGES (address moved, contract renewed) - old statements are marked outdated, not deleted, so the timeline stays auditable and queryable via knowmind_recall_at_time. Returns the new memory id. Requires write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| new_title | Yes | Title of the new, now-valid memory. | |
| target_id | Yes | ID of the memory to supersede; get it via knowmind_recall - never invent it. | |
| new_content | Yes | Content of the new memory (the updated fact). | |
| update_reason | No | Why it changed (e.g. 'address changed', 'contract renewed'); stored on the SUPERSEDES edge. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, etc.), the description reveals key behaviors: the old memory is marked with valid_to=now, the new memory is created with valid_from=now, and the old one is not deleted but linked via SUPERSEDES. It also discloses write-scope requirements and that it returns the new memory id, all essential for correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured and front-loaded with the core purpose, then elaborates the process, whether to use it, and return value. It's slightly dense in the last sentence (covering return, write scope), but every sentence earns its place and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a mutable tool with no output schema: it states the return (new memory id), the required permissions (write scope), the change semantics (not destructive), and the intended use case. Nothing an agent needs to know to choose and invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; every parameter already has a clear meaning. The description does not further explain parameter-specific behavior (e.g., what update_reason is used for), so the baseline of 3 is appropriate – it adds no redundant detail but also doesn't go beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'supersede a known fact' and the resource (knowmind memory), with explicit semantics: valid_to=now, valid_from=now, and SUPERSEDES link. It distinguishes itself from knowmind_store_memory by naming that sibling and the exact condition ('when a fact CHANGES').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this instead of knowmind_store_memory when a fact CHANGES (address moved, contract renewed)' and highlights that old statements are not deleted, making the tool suitable for auditable timelines. It also mentions the query tool knowmind_recall_at_time for reading history, providing clear context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_upload_documentA
Ingest a longer text as one document into the tenant corpus: chunk splitting, embeddings, vector chunks and graph nodes. Upsert-by-title: if a document with the same title exists, the new version replaces the old one (server default). Use for long-form or multi-fact content (a report, a page, a doc); for a single short fact use knowmind_store_memory. Returns the document id and the number of chunks written. AFTER INGESTING: extract the facts the text states about people, organisations, projects, products, technologies and hosts, and create the corresponding edges via knowmind_link. Requires write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Document title. Acts as the upsert key - an existing document with the same title is replaced. | |
| source | No | Origin - URL or file path. Free text, stored for provenance. | |
| content | Yes | Full document text (Markdown or plain); chunked and embedded server-side. | |
| relations | No | Edges from this document to the things it talks about - set them HERE, in the same call. Name the counterpart in plain words; the server finds or creates its node and draws the edge. Allowed predicate values: ABOUT (Contract|Document|FileResource → Topic), ASSIGNED_TO (ActionRecord|Task → Agent|Organization|Person|SoftwareAgent), CLIENT_OF (Agent|Organization|Person|SoftwareAgent → Organization), CONTACT_PERSON_FOR (Person → Organization), COVERED_BY (Topic → Contract|Document|FileResource), DELIVERED_AS (Application → Product), DELIVERED_BY (Product → Application), DEPENDS_ON (Application → Application), DEPLOYED_TO (Application → Container), DEVELOPED_BY (Application → Agent|Organization|Person|SoftwareAgent), DEVELOPS (Agent|Organization|Person|SoftwareAgent → Application), ENABLES (Application → Application), FOR_CLIENT (Project → Agent|Organization|Person|SoftwareAgent), HAS_ASSIGNED_TASK (Agent|Organization|Person|SoftwareAgent → ActionRecord|Task), HAS_CHILD (Person → Person), HAS_CLIENT (Organization → Agent|Organization|Person|SoftwareAgent), HAS_CONTACT_PERSON (Organization → Person), HAS_EMPLOYEE (Organization → Person), HAS_OPERATED_APPLICATION (Agent|Organization|Person|SoftwareAgent → Application), HAS_PARENT (Person → Person), HAS_PREDECESSOR (ActionRecord|Project|Task → ActionRecord|Project|Task), HAS_PROJECT (Agent|Organization|Person|SoftwareAgent → Project), HAS_ROLE (Person → Role), HAS_SIBLING (Person → Person), HAS_SKILL (Agent|Organization|Person|SoftwareAgent → Skill), HAS_SUCCESSOR (ActionRecord|Project|Task → ActionRecord|Project|Task), HOSTED_ON (Container → Host), HOSTS (Host → Container), HOSTS_APPLICATION (Container → Application), INFRASTRUCTURE_PROVIDED_BY (Host → Organization), INTEGRATES_WITH (Application → Application), IS_LED_BY (Organization → Person), KNOWS (Person → Person), LEADS (Person → Organization), OPERATED_FOR (Application → Agent|Organization|Person|SoftwareAgent), PAID_BY (Agent|Organization|Person|SoftwareAgent → Agent|Organization|Person|SoftwareAgent), PARTNER_OF (Organization → Organization), PAYS (Agent|Organization|Person|SoftwareAgent → Agent|Organization|Person|SoftwareAgent), PRODUCED_BY (Contract|Document|FileResource → Project), PRODUCES (Project → Contract|Document|FileResource), PROVIDES_INFRASTRUCTURE (Organization → Host), ROLE_OF (Role → Person), SERVED_UNDER (Application → Domain), SERVES (Domain → Application), SKILL_OF (Skill → Agent|Organization|Person|SoftwareAgent), SPOUSE_OF (Person → Person), SUPPLIED_BY (Agent|Organization|Person|SoftwareAgent → Organization), SUPPLIES (Organization → Agent|Organization|Person|SoftwareAgent), SUPPLIES_TECHNOLOGY (Organization → Technology), SUPPORTED_BY (Contract|Document|FileResource → Contract|Document|FileResource), SUPPORTS (Contract|Document|FileResource → Contract|Document|FileResource), TECHNOLOGY_SUPPLIED_BY (Technology → Organization), TECHNOLOGY_USED_BY (Technology → Application), USES_TECHNOLOGY (Application → Technology), WORKED_ON_BY (Project → Agent|Organization|Person|SoftwareAgent), WORKS_FOR (Person → Organization), WORKS_ON (Agent|Organization|Person|SoftwareAgent → Project) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by disclosing the upsert-by-title replacement behavior, server-side chunking/embedding, and the fact that it returns a document id plus chunk count. It also clarifies the destructive edge case in which an existing document with the same title is replaced, which is exactly the kind of context an agent needs despite destructiveHint being false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and efficient, front-loading the core purpose in the first sentence. Every sentence carries meaningful information: when to use it, the behavior, the output, the alternative tool, and the follow-up workflow. No filler or redundant restating of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is strong overall: it covers return values, write-permission requirements, upsert behavior, and follow-up links. Minor ambiguity remains because it directs the agent to create edges via knowmind_link after ingesting, even though the input schema allows edges via the 'relations' parameter in the same call, leaving two possible workflow interpretations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers all four parameters with full descriptions (100% coverage), so the baseline is 3. The description adds useful high-level context ('title acts as the upsert key', 'content is chunked and embedded server-side') but does not materially improve on the structured parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Ingest a longer text as one document into the tenant corpus') and specifies the processing pipeline (chunking, embeddings, vector chunks, graph nodes). It also explicitly contrasts with knowmind_store_memory for short facts, making the tool's purpose distinguishable from siblings without opening them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('long-form or multi-fact content') and when not to ('for a single short fact use knowmind_store_memory'). It also gives a clear post-ingestion workflow via knowmind_link and the required write scope, giving the agent actionable context for choosing and using the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v0.3.7- Added
knowmind_entity - Added
knowmind_health - Changed
knowmind_link4 fields changed- changed
Input schema / properties / confidence / descriptionPrevious value: -"Konfidenz der Kante [0..1]; Standard 1.0 für gepflegte Kanten."New value: +"Edge confidence in [0..1]; 1.0 for a fact stated verbatim, 0.7 for a clear paraphrase. Below that, do not create the edge." - changed
Input schema / properties / from_id / descriptionPrevious value: -"Memory-ID des Quellknotens"New value: +"Memory ID of the source node (get it via knowmind_recall)." - changed
Input schema / properties / rel_type / descriptionPrevious value: -"Edge-Typ in UPPER_SNAKE_CASE (z. B. OWNS, FOR_CLIENT, SUPERSEDES)"New value: +"Edge type in UPPER_SNAKE_CASE from the allowed list. Must fit the subject and object classes." - changed
Input schema / properties / to_id / descriptionPrevious value: -"Memory-ID des Zielknotens"New value: +"Memory ID of the target node."
- Changed
knowmind_list_recent1 field changed- changed
Input schema / properties / k / descriptionPrevious value: -"Anzahl der neuesten Einträge (1–50)"New value: +"Number of newest entries to return (1-50, default 10)."
- Changed
knowmind_list_relations1 field changed- changed
Input schema / properties / memory_id / descriptionPrevious value: -"Memory-ID, deren Beziehungen abgefragt werden"New value: +"Memory ID whose relations to list (get it via knowmind_recall)."
- Added
knowmind_recall - Added
knowmind_recall_at_time - Added
knowmind_schema - Changed
knowmind_store_memory7 fields changed- changed
Input schema / properties / content / descriptionPrevious value: -"Volltext des Memory-Eintrags"New value: +"The memory text. Keep it to one atomic fact per entry so it stays retrievable and updatable." - added
Input schema / properties / domainAdded value: +{ + "description": "Knowledge domain this entry belongs to, by its short key (e.g. 'sales', 'engineering'). Unknown keys are ignored and the entry stays unassigned - it is never guessed into a domain.", + "type": "string" +} - added
Input schema / properties / memory_type / descriptionAdded value: +"Kind of memory: semantic (durable fact), episodic (event), procedural (how-to), reference (pointer to a resource). Default semantic." - added
Input schema / properties / relationsAdded value: +{ + "description": "Edges from this entry to the things it talks about - set them HERE, in the same call. Name the counterpart in plain words; the server finds or creates its node and draws the edge, so you need neither knowmind_recall nor knowmind_entity nor knowmind_link for it. Example: storing 'Anna Meier leitet die IT bei der Muster GmbH' carries [{predicate: 'WORKS_FOR', object: 'Muster GmbH', object_class: 'Organization'}]. An entry without edges is a note; with edges it answers questions nobody wrote down. Allowed predicate values: ABOUT (Contract|Document|FileResource → Topic), ASSIGNED_TO (ActionRecord|Task → Agent|Organization|Person|SoftwareAgent), CLIENT_OF (Agent|Organization|Person|SoftwareAgent → Organization), CONTACT_PERSON_FOR (Person → Organization), COVERED_BY (Topic → Contract|Document|FileResource), DELIVERED_AS (Application → Product), DELIVERED_BY (Product → Application), DEPENDS_ON (Application → Application), DEPLOYED_TO (Application → Container), DEVELOPED_BY (Application → Agent|Organization|Person|SoftwareAgent), DEVELOPS (Agent|Organization|Person|SoftwareAgent → Application), ENABLES (Application → Application), FOR_CLIENT (Project → Agent|Organization|Person|SoftwareAgent), HAS_ASSIGNED_TASK (Agent|Organization|Person|SoftwareAgent → ActionRecord|Task), HAS_CHILD (Person → Person), HAS_CLIENT (Organization → Agent|Organization|Person|SoftwareAgent), HAS_CONTACT_PERSON (Organization → Person), HAS_EMPLOYEE (Organization → Person), HAS_OPERATED_APPLICATION (Agent|Organization|Person|SoftwareAgent → Application), HAS_PARENT (Person → Person), HAS_PREDECESSOR (ActionRecord|Project|Task → ActionRecord|Project|Task), HAS_PROJECT (Agent|Organization|Person|SoftwareAgent → Project), HAS_ROLE (Person → Role), HAS_SIBLING (Person → Person), HAS_SKILL (Agent|Organization|Person|SoftwareAgent → Skill), HAS_SUCCESSOR (ActionRecord|Project|Task → ActionRecord|Project|Task), HOSTED_ON (Container → Host), HOSTS (Host → Container), HOSTS_APPLICATION (Container → Application), INFRASTRUCTURE_PROVIDED_BY (Host → Organization), INTEGRATES_WITH (Application → Application), IS_LED_BY (Organization → Person), KNOWS (Person → Person), LEADS (Person → Organization), OPERATED_FOR (Application → Agent|Organization|Person|SoftwareAgent), PAID_BY (Agent|Organization|Person|SoftwareAgent → Agent|Organization|Person|SoftwareAgent), PARTNER_OF (Organization → Organization), PAYS (Agent|Organization|Person|SoftwareAgent → Agent|Organization|Person|SoftwareAgent), PRODUCED_BY (Contract|Document|FileResource → Project), PRODUCES (Project → Contract|Document|FileResource), PROVIDES_INFRASTRUCTURE (Organization → Host), ROLE_OF (Role → Person), SERVED_UNDER (Application → Domain), SERVES (Domain → Application), SKILL_OF (Skill → Agent|Organization|Person|SoftwareAgent), SPOUSE_OF (Person → Person), SUPPLIED_BY (Agent|Organization|Person|SoftwareAgent → Organization), SUPPLIES (Organization → Agent|Organization|Person|SoftwareAgent), SUPPLIES_TECHNOLOGY (Organization → Technology), SUPPORTED_BY (Contract|Document|FileResource → Contract|Document|FileResource), SUPPORTS (Contract|Document|FileResource → Contract|Document|FileResource), TECHNOLOGY_SUPPLIED_BY (Technology → Organization), TECHNOLOGY_USED_BY (Technology → Application), USES_TECHNOLOGY (Application → Technology), WORKED_ON_BY (Project → Agent|Organization|Person|SoftwareAgent), WORKS_FOR (Person → Organization), WORKS_ON (Agent|Organization|Person|SoftwareAgent → Project)", + "items": { + "properties": { + "confidence": { + "description": "Edge confidence in [0..1]; 1.0 for a fact stated verbatim, 0.7 for a clear paraphrase. Below that, leave the edge out.", + "type": "number" + }, + "object": { + "description": "Proper name of the counterpart, as it would be written in a document ('Muster GmbH', not 'the client').", + "type": "string" + }, + "object_class": { + "description": "Class of the counterpart (Person, Organization, Application, Host, Technology, ...). Pick it from knowmind_schema.", + "type": "string" + }, + "object_description": { + "description": "One sentence about the counterpart, used when its node has to be created. Optional.", + "type": "string" + }, + "predicate": { + "description": "Edge type in UPPER_SNAKE_CASE from the allowed list.", + "type": "string" + } + }, + "required": [ + "predicate", + "object" + ], + "type": "object" + }, + "type": "array" +} - changed
Input schema / properties / source / descriptionPrevious value: -"Quelle/Herkunft, frei-text"New value: +"Where this came from - URL, file path, or a short note. Free text, stored for provenance." - changed
Input schema / properties / tags / descriptionPrevious value: -"Schlagworte für Filterung"New value: +"Free-text keywords for later filtering (lowercase, no spaces recommended)." - changed
Input schema / properties / title / descriptionPrevious value: -"Kurz-Titel des Memory-Eintrags"New value: +"Short human-readable title (a few words). Not a uniqueness key - duplicate titles create separate entries."
- Changed
knowmind_unlink3 fields changed- changed
Input schema / properties / from_id / descriptionPrevious value: -"Memory-ID des Quellknotens"New value: +"Memory ID of the source node." - changed
Input schema / properties / rel_type / descriptionPrevious value: -"Edge-Typ"New value: +"Edge type to remove (UPPER_SNAKE_CASE, exactly as created)." - changed
Input schema / properties / to_id / descriptionPrevious value: -"Memory-ID des Zielknotens"New value: +"Memory ID of the target node."
- Added
knowmind_update_fact - Changed
knowmind_upload_document4 fields changed- changed
Input schema / properties / content / descriptionPrevious value: -"Volltext des Dokuments"New value: +"Full document text (Markdown or plain); chunked and embedded server-side." - added
Input schema / properties / relationsAdded value: +{ + "description": "Edges from this document to the things it talks about - set them HERE, in the same call. Name the counterpart in plain words; the server finds or creates its node and draws the edge. Allowed predicate values: ABOUT (Contract|Document|FileResource → Topic), ASSIGNED_TO (ActionRecord|Task → Agent|Organization|Person|SoftwareAgent), CLIENT_OF (Agent|Organization|Person|SoftwareAgent → Organization), CONTACT_PERSON_FOR (Person → Organization), COVERED_BY (Topic → Contract|Document|FileResource), DELIVERED_AS (Application → Product), DELIVERED_BY (Product → Application), DEPENDS_ON (Application → Application), DEPLOYED_TO (Application → Container), DEVELOPED_BY (Application → Agent|Organization|Person|SoftwareAgent), DEVELOPS (Agent|Organization|Person|SoftwareAgent → Application), ENABLES (Application → Application), FOR_CLIENT (Project → Agent|Organization|Person|SoftwareAgent), HAS_ASSIGNED_TASK (Agent|Organization|Person|SoftwareAgent → ActionRecord|Task), HAS_CHILD (Person → Person), HAS_CLIENT (Organization → Agent|Organization|Person|SoftwareAgent), HAS_CONTACT_PERSON (Organization → Person), HAS_EMPLOYEE (Organization → Person), HAS_OPERATED_APPLICATION (Agent|Organization|Person|SoftwareAgent → Application), HAS_PARENT (Person → Person), HAS_PREDECESSOR (ActionRecord|Project|Task → ActionRecord|Project|Task), HAS_PROJECT (Agent|Organization|Person|SoftwareAgent → Project), HAS_ROLE (Person → Role), HAS_SIBLING (Person → Person), HAS_SKILL (Agent|Organization|Person|SoftwareAgent → Skill), HAS_SUCCESSOR (ActionRecord|Project|Task → ActionRecord|Project|Task), HOSTED_ON (Container → Host), HOSTS (Host → Container), HOSTS_APPLICATION (Container → Application), INFRASTRUCTURE_PROVIDED_BY (Host → Organization), INTEGRATES_WITH (Application → Application), IS_LED_BY (Organization → Person), KNOWS (Person → Person), LEADS (Person → Organization), OPERATED_FOR (Application → Agent|Organization|Person|SoftwareAgent), PAID_BY (Agent|Organization|Person|SoftwareAgent → Agent|Organization|Person|SoftwareAgent), PARTNER_OF (Organization → Organization), PAYS (Agent|Organization|Person|SoftwareAgent → Agent|Organization|Person|SoftwareAgent), PRODUCED_BY (Contract|Document|FileResource → Project), PRODUCES (Project → Contract|Document|FileResource), PROVIDES_INFRASTRUCTURE (Organization → Host), ROLE_OF (Role → Person), SERVED_UNDER (Application → Domain), SERVES (Domain → Application), SKILL_OF (Skill → Agent|Organization|Person|SoftwareAgent), SPOUSE_OF (Person → Person), SUPPLIED_BY (Agent|Organization|Person|SoftwareAgent → Organization), SUPPLIES (Organization → Agent|Organization|Person|SoftwareAgent), SUPPLIES_TECHNOLOGY (Organization → Technology), SUPPORTED_BY (Contract|Document|FileResource → Contract|Document|FileResource), SUPPORTS (Contract|Document|FileResource → Contract|Document|FileResource), TECHNOLOGY_SUPPLIED_BY (Technology → Organization), TECHNOLOGY_USED_BY (Technology → Application), USES_TECHNOLOGY (Application → Technology), WORKED_ON_BY (Project → Agent|Organization|Person|SoftwareAgent), WORKS_FOR (Person → Organization), WORKS_ON (Agent|Organization|Person|SoftwareAgent → Project)", + "items": { + "properties": { + "confidence": { + "description": "Edge confidence in [0..1].", + "type": "number" + }, + "object": { + "description": "Proper name of the counterpart.", + "type": "string" + }, + "object_class": { + "description": "Class of the counterpart (Person, Organization, Application, Host, Technology, ...).", + "type": "string" + }, + "object_description": { + "description": "One sentence about the counterpart, used when its node has to be created. Optional.", + "type": "string" + }, + "predicate": { + "description": "Edge type in UPPER_SNAKE_CASE from the allowed list.", + "type": "string" + } + }, + "required": [ + "predicate", + "object" + ], + "type": "object" + }, + "type": "array" +} - changed
Input schema / properties / source / descriptionPrevious value: -"Quelle, z.B. URL oder Dateipfad"New value: +"Origin - URL or file path. Free text, stored for provenance." - changed
Input schema / properties / title / descriptionPrevious value: -"Dokument-Titel"New value: +"Document title. Acts as the upsert key - an existing document with the same title is replaced."
7 tool updates
v0.3.1- First observed
knowmind_link - First observed
knowmind_list_recent - First observed
knowmind_list_relations - First observed
knowmind_stats - First observed
knowmind_store_memory - First observed
knowmind_unlink - First observed
knowmind_upload_document
TDQS
Scored across 13 tools
Each tool has a clearly distinct purpose: recall vs recall_at_time, store_memory vs upload_document, link vs unlink, and entity vs schema are all separated with explicit use-case guidance. There is no real risk of an agent picking the wrong tool for a given action.
Most tools follow a knowmind_<verb>_<object> pattern such as store_memory, upload_document, update_fact, and list_relations. Some tools are bare nouns or verbs (stats, health, entity, schema, recall, link, unlink), but the shared prefix and snake_case style keep the overall set predictable.
13 tools is well within the ideal range for a knowledge-graph memory server. Each tool covers a distinct part of the workflow: ingestion, retrieval, fact supersession, graph construction, schema inspection, health checks, and statistics.
The core write/read/update graph workflows are well covered, including storing memories, uploading documents, recalling current and historical facts, and managing entities and relations. The main gap is the lack of explicit delete operations for memories, documents, or entities, though supersede, upsert, and unlink provide reasonable workarounds and deletion may be intentionally excluded for auditability.
Maintenance
Related MCP Connectors
Persistent memory for AI agents. EU-hosted, privacy-first, hybrid recall, contradiction detection.
Memory for AI agents that knows what is still true. Typed bi-temporal facts, EU-hosted.
Persistent memory and knowledge management for AI agents with semantic search and 50+ tools.
Persistent memory for AI agents. Semantic search, memory graph, W3C DID identity.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceLong-term Memory for AI. On Device. Secure. Coding tools, AI Agents. Instant Recall. Precise.-
- AlicenseAqualityDmaintenanceEnables AI agents with persistent semantic memory, including semantic recall, knowledge graphs, and instant domain expertise via pre-built Intelligence Packs.1038 npmMIT
- AlicenseNot gradedqualityBmaintenancePrivacy Agent Memory with best performance and security33MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to maintain persistent, local memory with retrieval-augmented search, knowledge graphs, and context surfacing, without any cloud dependencies.31 npmMIT