knowmind
knowmind is a hosted, tenant-isolated persistent memory service for MCP clients that stores a typed, bitemporal knowledge graph and lets an agent recall, write, correct and inspect knowledge.
Recall knowledge (
knowmind_recall): hybrid BM25 + vector + graph-hop search returning top-k chunks with relevance scores and source references.Time-travel recall (
knowmind_recall_at_time): retrieve only what was valid at a given instant, e.g. the state of the world on March 14.Store short facts (
knowmind_store_memory): append-only atomic memories with title, tags, domain, source, memory type, and edges created inline via plain-language relations.Ingest long documents (
knowmind_upload_document): chunking, embedding and graph nodes, upserted by title.Correct without deleting (
knowmind_update_fact): supersede a fact; the old version keeps its validity window and stays auditable.Build the graph: create typed entities (
knowmind_entity) and create or remove typed edges (knowmind_link,knowmind_unlink) restricted to an allowed predicate catalogue with class constraints.Inspect: list a memory's incoming/outgoing relations (
knowmind_list_relations), fetch the relation catalogue (knowmind_schema), list newest entries (knowmind_list_recent), corpus counts (knowmind_stats) and component health (knowmind_health).Guardrails: no delete tool exists; edges and facts are superseded or unlinked instead, and workspace deletion is a web-UI-only action. Secrets are rejected with 422.
Access model: free tier with 2,500 memories, token-based auth, data hosted in Nuremberg, Germany; the schema shown uses the older tool names that remain valid until 31 March 2027.
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) — the same mcpServers block works for Claude Desktop, Windsurf and Gemini CLI in their config files; Zed expects it under context_servers:
{
"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, npx -y knowmind install <ide> is the better way: if pythonw.exe from Python 3.10 to 3.14 sits in its default location (%LOCALAPPDATA%\Programs\Python\Python3… or C:\Python3…), the entries it writes start the server without a console window; Codex and the printed Claude Code command use npx directly. If you configure by hand and npx does not start directly, use "command": "cmd", "args": ["/c", "npx", "-y", "knowmind", "mcp"]; clients without a console of their own then open a window with each tool call.
npx -y knowmind install <ide> writes this configuration for you, for example cursor, vscode, windsurf, zed, claude-desktop, gemini or codex; npx -y knowmind install list shows all clients. For Claude Code it prints the claude mcp add command instead, and --project writes .mcp.json in the current folder.
Clients that cannot read the token from the environment get a placeholder to replace with your token. Running install again updates only the knowmind entry and keeps a token you entered; before it changes a file, it saves a copy next to it.
npx -y knowmind init sets up memory hygiene in your client: hooks in Claude Code that recall before each task and, when a turn contained something worth keeping (a deploy or commit, a new rule, an architecture decision, changed code or configuration) and nothing was stored yet, ask the model to store it before the turn ends, a rule file in Cursor, and a block in AGENTS.md that tells Codex when to ask knowmind and what to keep.
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 statusline
npx -y knowmind sync ./openwiki # pages in Open Knowledge Format keep their review dataKnowledge in Open Knowledge Format
knowmind sync reads folders in the Open Knowledge Format (OKF 0.1 and 0.2),
such as the openwiki/ folder that OpenWiki creates in a repository.
Every search hit then carries the page's status (stable if the page sets
none), its trust tier as defined by OKF (trust: unverified,
machine-confirmed or human-reviewed) and how many sources it lists. If the
page provides them, the hit also carries who or what generated the page
(generated), its last five verifications (verified), the time after which
it counts as stale (stale_after) and its first ten sources (sources). The
full header stays part of the document.
Inside a bundle, directory listings (index.md) and logs (log.md) are not
imported. knowmind recognizes a bundle by okf_version in its root index.md or by the
files OpenWiki keeps there. If it finds neither, --okf treats the folder you
sync as a bundle.
Available Tools
Fifteen 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_list_inferred — Relations that wait for a human decision: relations knowmind
inferred from a text, and relations that start from a document although their type needs a
person, organisation or similar. Each comes with its review state, both connected entries, its
source and the entry that supports it.
status (open, confirmed or rejected, optional) · limit (integer, default 50, max 200) ·
offset (integer, default 0)
Usage: review what the graph learned on its own. Open relations do not feed the derivation
rules until someone confirms them.
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.
knowmind_review_inferred — Record a decision on one relation from
knowmind_list_inferred. confirm lets it feed the derivation rules; reject ends the
relation, its reverse and every relation derived from it (valid_to is set, nothing is
deleted); undo takes a rejection back.
edge_id (string, required) · decision (confirm, reject or undo, required) ·
evidence (string, optional — id of the entry that supports the decision)
Usage: after reviewing the list. Returns the state before and after and how many reverse and
derived relations were affected.
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
22 toolsknowmind_entityAIdempotent
DEPRECATED, removed on 2027-03-31: use knowmind_upsert_entity. This name keeps answering unchanged until then. 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?
Annotations already declare idempotentHint=true and destructiveHint=false, but the description adds material context beyond them: the deprecation window (removed 2027-03-31, answers unchanged until then), the write-scope requirement, and the dedup rule ("same name, same class and same tenant always return the same id, so calling twice creates no duplicate"). It also disambiguates upsert-vs-create semantics by noting it returns the existing node.
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 deprecation notice and replacement pointer are correctly front-loaded, and the operational guidance that follows is dense rather than padded. It runs slightly long for a deprecated alias, but nearly every sentence carries actionable instruction, so no serious trimming is warranted.
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 create-style tool with no output schema, the description covers purpose, idempotency, naming contract, class sourcing, dependency on knowmind_schema/knowmind_link, and the migration path. Nothing an agent needs in order to call 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 description coverage is 100%, so the schema already documents all four parameters and baseline is 3. The description adds real meaning on top: name must be the plain proper name ("PostgreSQL", not "the database we use") and entity_class must come from knowmind_schema -> entityClasses.
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 ("Create the node for a thing the corpus talks about") and enumerates concrete entity types (person, organisation, application, host, technology). It also names its replacement, knowmind_upsert_entity, so an agent can distinguish it from every sibling without opening a 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?
Gives explicit routing (use knowmind_upsert_entity instead), the condition for using the tool at all ("when a name recurs across memories or when you are about to link something that has no node yet"), and the follow-up action ("then connect it with knowmind_link"). When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_get_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 declare readOnly, idempotent and non-destructive, so the description rightly spends its words elsewhere: it discloses that a read scope suffices (auth requirement) and that it returns a status object per component. It stops short of describing status values or failure modes.
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 tight sentences, front-loaded with the purpose, then usage, then return/auth facts. Every sentence carries distinct information with no 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 parameterless, output-schema-less health check, the description covers what it does, when to call it, the auth scope, and the shape of the return. 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?
Zero parameters, so the baseline is 4. The description confirms 'takes no parameters', aligning with the empty schema, though there is no parameter meaning to add.
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 ('Return the health of the knowmind backend') and enumerates the components covered (Postgres, memory service, graph). An agent can tell this apart from stats/schema siblings immediately.
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 clear triggering conditions: 'before a batch of writes or when calls fail, to tell an outage apart from an empty result.' That is strong context, but it never names or excludes the near-identical 'knowmind_health' sibling, so an agent gets no routing help between the two.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_get_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, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds value beyond these by stating the authorization requirement ('Read scope suffices') and enumerating the return contents (edge types, subject/object classes, usage notes). It stops short of describing formatting or caching behavior, 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?
Three sentences, each earning its place: what is returned, when to call it, and the auth scope. The most important routing instruction (call before knowmind_link) is front-loaded and there is no 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 retrieval tool with no output schema, the description fully covers purpose, sequencing, auth scope, and the shape of the returned content. An agent has everything needed to call it correctly without opening any other field.
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?
Zero parameters, so the baseline is 4. The description correctly implies the tool is scoped implicitly to the caller's tenant ('this tenant's knowledge graph'), which is the only contextual input that matters here.
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: 'Return the relation catalogue of this tenant's knowledge graph.' It further specifies the payload (every allowed edge type with subject/object classes and usage explanations), which distinguishes it from siblings like knowmind_link or knowmind_list_relations.
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 instructs 'Call this before building edges with knowmind_link,' naming the exact alternative and the condition that selects it. The rationale ('pick the right predicate instead of the nearest-sounding one') makes the when-to-use reasoning unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_get_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, idempotentHint, destructiveHint=false and a closed world, so the safety profile is covered. The description still contributes the auth requirement ('Read scope suffices') and the fact that it takes no parameters, which the annotations do not convey. It stops short of noting anything about cost, caching or freshness of the counts, so it falls just short of a 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?
Two sentences: the first declares the return content, the second covers usage, alternatives and prerequisites. No filler, and the most important information (what is counted) is 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?
With no output schema, the description carries the burden of describing the return and it does so by enumerating the three count categories. Combined with the read-scope note and the zero-parameter statement, an agent has everything needed to call this correctly and interpret the result.
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?
Zero parameters, so the baseline is 4; the description confirms this explicitly ('takes no parameters'), which removes any doubt about supplying arguments. Nothing further can be added about parameters.
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?
Names a specific verb and resource ('Return current counts for the tenant corpus') and enumerates exactly what is counted: memories, graph edges and vector chunks. It explicitly differentiates itself from knowmind_list_recent and knowmind_recall, so an agent can route correctly without opening sibling 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?
States the use case directly ('Use to gauge how much has been stored') and names the alternatives to pick instead when actual entries are wanted ('for the actual entries use knowmind_list_recent or knowmind_recall'). It also gives the prerequisite ('Read scope suffices'), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_healthARead-onlyIdempotent
DEPRECATED, removed on 2027-03-31: use knowmind_get_health. This name keeps answering unchanged until then. 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?
Beyond the readOnly/idempotent/destructive annotations, it discloses lifecycle behavior (deprecated, removed 2027-03-31, answers unchanged until then), the auth requirement ('read scope suffices'), that it takes no parameters, and the shape of the result ('status object per component'). These are substantive traits the annotations do not carry.
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?
Front-loaded with the deprecation warning, then purpose, usage, return shape and auth in four tight sentences. Every sentence adds information; nothing is repeated from the schema or annotations.
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?
There is no output schema, so the description compensates by stating the return is a per-component status object. Deprecation, auth scope, and usage context are all covered, leaving nothing an agent needs 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?
The tool takes zero parameters, so the baseline is 4. The description confirms 'takes no parameters', which is consistent with the empty schema and leaves no 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?
States a specific verb and resource ('Return the health of the knowmind backend') and enumerates the components checked (Postgres, memory service, graph). It also distinguishes itself from its replacement knowmind_get_health and flags its own deprecation, so an agent can place it immediately.
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 conditions: 'before a batch of writes or when calls fail, to tell an outage apart from an empty result.' It also names the successor tool and the migration deadline, which is exactly the routing information an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_linkAIdempotent
DEPRECATED, removed on 2027-03-31: use knowmind_link_entities. This name keeps answering unchanged until then. 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. The server checks the edge against the ontology's shapes before writing it: the subject and object must belong to the classes the predicate requires (for entries without a class the check only warns), entity names must carry no role or suffix, and the edge must name its evidence - the id of the entry that states the relation. A rejected edge returns the violated rule. 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). | |
| evidence | Yes | Memory ID of the entry that states this relation (often from_id or a note found via knowmind_recall). Required: an edge without evidence is rejected. | |
| 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?
Annotations only declare idempotentHint=true, destructiveHint=false, readOnlyHint=false and openWorldHint=false; the description adds substantially beyond that: ontology shape validation before write, warn-only behavior for classless entries, the evidence-required rule, the fact that rejects return the violated rule, automatic inverse-edge materialization, and the 'Requires write scope' auth note. This is exactly the behavioral context annotations cannot carry.
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 deprecation notice and replacement name are correctly front-loaded, and the workflow/procedure sentences earn their place. The trailing enumeration of ~49 relation types is long but necessary because no enum exists in the schema; the only real cost is that this bulk sits at the end rather than being summarized earlier. Slightly over-long but not wasteful.
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?
With no output schema, the description still covers the return path for failures ('A rejected edge returns the violated rule') and the automatic inverse/derived edge behavior. Combined with write-scope, evidence, and validation rules, an agent has everything needed to call this correctly or to choose the successor tool instead.
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%, which sets a baseline of 3, but the description materially exceeds it: it enumerates all allowed rel_type values with their subject→object class domains (a list the schema only references as 'from the allowed list' with no enum), and reinforces the evidence and confidence requirements. The rel_type catalogue is the single most important piece of parameter meaning and the schema does not contain 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?
States a specific verb and resource ('Create a typed relation between two memory nodes (a knowledge-graph edge)') and frames the tool's role in graph construction, not just its mechanics. It immediately distinguishes itself from sibling knowmind_link_entities by declaring the deprecation and the replacement name, so an agent can route without opening either 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?
Gives explicit when-to-use ('after storing memories, connect them'), when-not ('derived edges ... never set them by hand'), the replacement tool for new work (knowmind_link_entities), and the prerequisite workflow (get both node IDs via knowmind_recall first, call knowmind_schema for the catalogue). Alternatives and prerequisites are spelled out rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_link_entitiesAIdempotent
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. The server checks the edge against the ontology's shapes before writing it: the subject and object must belong to the classes the predicate requires (for entries without a class the check only warns), entity names must carry no role or suffix, and the edge must name its evidence - the id of the entry that states the relation. A rejected edge returns the violated rule. 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). | |
| evidence | Yes | Memory ID of the entry that states this relation (often from_id or a note found via knowmind_recall). Required: an edge without evidence is rejected. | |
| 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?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is known. The description adds substantial behavioral context beyond that - server-side ontology-shape validation, subject/object class requirements, evidence-required rejection with the violated rule returned, and automatic inverse/derived edge materialization. This is genuinely rich beyond the annotation bar, though the annotation already covers the write/idempotency basics.
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?
Purpose and the critical usage constraints are front-loaded and earn their place, but the inline enumeration of ~60 rel_type values dominates the text and partly duplicates the referenced knowmind_schema catalogue, which the description itself tells the agent to consult. Structure is good; length is heavier than needed.
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 5-param write tool with no output schema, the description covers purpose, prerequisites, validation/failure behavior, idempotency implications of automatic inverse/derived edges, and the full rel_type value space. An agent has everything needed to call it correctly and to anticipate rejection.
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, and the schema already documents from_id/to_id/evidence/confidence. The description goes further by enumerating the full allowed rel_type catalogue against a schema that declares no enum, plus the class-compatibility constraint the value must satisfy - real added meaning for the key parameter.
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+resource ('Create a typed relation between two memory nodes (a knowledge-graph edge)') and immediately frames the role in the graph. It names the sibling helpers it depends on (knowmind_recall, knowmind_schema), giving an agent enough to distinguish the task.
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 says when to use it ('after storing memories, connect them'), why it matters ('a corpus without edges answers only what a single note already says'), and what NOT to do ('derived edges ... are computed by the server - never set them by hand'). It routes to alternatives for prerequisites (recall, schema).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_list_inferredARead-onlyIdempotent
List relations that wait for a human decision, each with its review state (open, confirmed, rejected) and its reason: inferred_from_text (knowmind inferred it from a text) or starts_from_document (it starts from a document although its kind needs a person, organisation or similar). Per relation also the two connected entries, where it came from (source), the entry that supports it (evidence), and the counts per state. Open relations do not feed the derivation rules until someone confirms them. Use to review what the graph learned on its own; record a decision with knowmind_review_inferred. Read scope suffices.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of relations to return (1-200, default 50). | |
| offset | No | Relations to skip, for paging. | |
| status | No | Only relations in this state. Omit for all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), so the description's added value is the domain behavior it discloses: open relations do not feed derivation rules until confirmed, and read scope suffices for authorization. Useful context beyond the structured fields, though paging/volume behavior is not discussed.
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?
Front-loaded with the core purpose before enumerating states and reasons; each sentence carries information. It is dense and packs several parenthetical definitions into one paragraph, which slightly slows scanning but wastes no words.
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?
With no output schema present, the description carries the return-shape burden and does so: it explains per-relation state, reason, connected entries, source, evidence, and per-state counts. Combined with the sibling pointer and scope note, an agent has everything needed to call and interpret 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 description coverage is 100% for all three parameters (limit, offset, status), including ranges and enum values, so the schema already carries parameter meaning. The description adds nothing about parameter syntax, making the baseline 3 appropriate.
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?
Opens with a concrete verb+resource+scope: relations awaiting a human decision, with their review state and reason. It implicitly separates itself from knowmind_list_relations by narrowing to inferred/pending items, though it never names that sibling to make the boundary explicit.
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 a clear use case ('review what the graph learned on its own') and names the companion tool that records the decision (knowmind_review_inferred). It does not state an explicit when-not or contrast against knowmind_list_relations for already-confirmed relations.
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
DEPRECATED, removed on 2027-03-31: use knowmind_recall_memories. This name keeps answering unchanged until then. Retrieve relevant knowledge before answering anything that benefits from prior context - decisions, preferences, project state, people, deadlines, past conversations. Hybrid recall (BM25 + pgvector + knowledge graph) 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. Passages from pages in Open Knowledge Format carry metadata.review_flags: stale once stale_after is reached, unverified when no verification is recorded, superseded when the page's status is deprecated or superseded or its valid_to is reached, drifted when code cited by the page's claims changed or was removed since the page was written; an empty list means none applies. When kein_belastbarer_treffer is true, the corpus most likely holds no answer; unless the hits clearly answer the question, say so. Read scope suffices.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Number of chunks to return (1-25, default 5). | |
| hops | No | Accepted for compatibility (0-3, default 2); currently has no effect on recall. | |
| 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/idempotent/non-destructive, but the description goes well beyond them: it names the retrieval architecture (BM25 + pgvector + knowledge graph), the return shape (top-k chunks with relevance score and source reference), the meaning of every metadata.review_flags value, the kein_belastbarer_treffer signal for 'no answer in corpus', and the auth requirement ('Read scope suffices'). This is exactly the extra context annotations cannot carry.
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?
Front-loads the deprecation notice and the replacement tool, then the purpose, then the flag semantics — good ordering with no filler sentences. The review_flags enumeration is dense and long, but each clause defines a distinct value that would otherwise be opaque; only mildly over-sized.
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?
No output schema exists, and the description compensates by describing the return shape (top-k chunks, relevance score, source reference) plus the semantics of embedded flags. Combined with the deprecation timeline and scope note, an agent has everything needed to call and interpret 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?
Schema description coverage is 100%, so query/k/hops are already fully documented, including that hops currently has no effect. The description adds no syntax, format, or trade-off guidance beyond the schema (e.g., no guidance on choosing k), 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 ('Retrieve relevant knowledge') plus the situations it serves (decisions, preferences, project state, people, deadlines, past conversations). It explicitly distinguishes itself from two siblings by name (knowmind_recall_memories as successor, knowmind_recall_at_time for point-in-time), so an agent can route without opening any 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?
Gives an explicit when-to-use ('before answering anything that benefits from prior context'), an explicit when-to-use-the-alternative ('use knowmind_recall_at_time when you need what was valid at a past point in time'), and a deprecation route to the replacement tool. Nothing is left to inference.
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. Passages from pages in Open Knowledge Format carry metadata.review_flags (stale, unverified, superseded, drifted); stale and superseded are judged against as_of. When kein_belastbarer_treffer is true, the corpus as of as_of most likely holds no answer; it is judged on the hits visible at as_of. Unless they clearly answer the question, say so. 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 cover readOnly, idempotent, non-destructive and closed-world, but the description adds real behavioral context they cannot: review_flags on OKF pages (stale/superseded judged against as_of), the kein_belastbarer_treffer sentinel meaning, and the 'read scope suffices' auth note. It stops short of describing pagination or result ordering, so it is strong rather than exhaustive.
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?
Front-loads the core purpose and routing rule in the first two sentences with no wasted framing. The back half (review_flags, kein_belastbarer_treffer, 'unless they clearly answer the question, say so') is dense and the final clause is slightly ambiguous, costing a point.
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?
With no output schema, the description carries the burden of explaining notable return semantics, and it does so for review_flags and the kein_belastbarer_treffer sentinel. The bounded k and default-to-now as_of are covered by the schema, so an agent has what it needs; only ordering/pagination of results is unspecified.
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%, so the baseline is 3; the description earns above baseline by explaining what as_of actually controls - the valid_from/valid_to validity window and how review_flags are evaluated against it - which the schema's 'ISO-8601 timestamp to evaluate validity at' does not spell out.
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?
Names a specific verb and resource ('Time-travel recall: return only memories that were valid at a given instant') and states the exact validity predicate (valid_from <= as_of <= valid_to, or still open). It explicitly distinguishes itself from the sibling knowmind_recall, so an agent can route without opening either 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?
Gives an explicit selection rule: 'Use instead of knowmind_recall when the point in time matters; otherwise use knowmind_recall for the current truth.' Names the alternative and the condition that picks it, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_recall_memoriesARead-onlyIdempotent
Retrieve relevant knowledge before answering anything that benefits from prior context - decisions, preferences, project state, people, deadlines, past conversations. Hybrid recall (BM25 + pgvector + knowledge graph) 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. Passages from pages in Open Knowledge Format carry metadata.review_flags: stale once stale_after is reached, unverified when no verification is recorded, superseded when the page's status is deprecated or superseded or its valid_to is reached, drifted when code cited by the page's claims changed or was removed since the page was written; an empty list means none applies. When kein_belastbarer_treffer is true, the corpus most likely holds no answer; unless the hits clearly answer the question, say so. Read scope suffices.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Number of chunks to return (1-25, default 5). | |
| hops | No | Accepted for compatibility (0-3, default 2); currently has no effect on recall. | |
| 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 only cover the safety profile (readOnly/idempotent/non-destructive/closed-world); the description goes well beyond that, disclosing the retrieval pipeline, the return shape (top-k chunks with relevance score and source reference), the auth requirement ('Read scope suffices'), and a full decode of metadata.review_flags values (stale, unverified, superseded, drifted) and of kein_belastbarer_treffer. No contradictions with 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?
Front-loaded with purpose and the sibling distinction, and every clause carries usable information. It loses a point because the review_flags enumeration is delivered as one very dense semicolon-chained sentence that is harder to parse than the rest of the text.
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?
With no output schema, the description carries the burden of explaining returns and does so: chunk count, relevance score, source reference, review_flags semantics, and the negative-signal flag. Auth scope and the time-scoped alternative are also covered, leaving nothing essential missing for correct invocation.
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%, so all three parameters (including k's bounds and hops' no-op status) are already documented structurally; that sets the baseline at 3. The description adds only indirect hints ('top-k', hybrid recall) and no per-parameter syntax or format detail 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?
States a specific verb+resource ('Retrieve relevant knowledge') plus the scope ('over the tenant corpus') and the retrieval mechanism (hybrid BM25 + pgvector + knowledge graph). It explicitly names the sibling it is not (knowmind_recall_at_time) and the condition that distinguishes them, so an agent can route without opening either 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?
Gives an explicit trigger ('before answering anything that benefits from prior context - decisions, preferences, project state, people, deadlines, past conversations') and names the alternative tool plus the condition selecting it ('when you need what was valid at a past point in time'). It also tells the agent what to do when the result is empty of signal ('unless the hits clearly answer the question, say so').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_review_inferredA
Record a human decision on one inferred relation from knowmind_list_inferred. confirm: the relation counts as checked and feeds the derivation rules from now on. reject: the relation, its reverse relation and every relation derived from it get valid_to=now; nothing is deleted. undo: takes a rejection back and restores the reverse and derived relations. Pass the edge_id from the list and, if there is one, the id of the entry that supports the decision as evidence. Returns the state before and after and the number of reverse and derived relations affected. Requires write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| edge_id | Yes | edge_id of the relation, as returned by knowmind_list_inferred. | |
| decision | Yes | confirm, reject, or undo a rejection. | |
| evidence | No | Id of the entry that supports the decision. Optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description explains the exact effects of confirm, reject, and undo, including that reject sets valid_to=now on the relation, its reverse, and all derived relations while deleting nothing. It also notes the return payload and that write scope is required, giving rich operational 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 front-loaded with the core action and then systematically covers decision semantics, parameter usage, return values, and scope requirements. Every sentence carries necessary information with no 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 mutation tool with no output schema, the description is complete: it covers inputs, decision effects, return contents, and authorization scope. An agent has everything needed to invoke 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 schema coverage is 100%, so the baseline is 3, but the description adds substantial meaning beyond schema: it defines the semantic consequences of each decision enum value and clarifies that evidence is optional. This goes well beyond the schema's terse 'confirm, reject, or undo a rejection'.
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 verb and resource: 'Record a human decision on one inferred relation from knowmind_list_inferred.' It explicitly names the sibling tool that produces the input, so an agent can distinguish it from other review 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?
The description clearly places the tool after knowmind_list_inferred and explains what each decision value accomplishes, giving strong context for when to use it. However, it does not state when not to use it or name alternative tools for related tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_schemaARead-onlyIdempotent
DEPRECATED, removed on 2027-03-31: use knowmind_get_schema. This name keeps answering unchanged until then. 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 only cover the read-safe profile, but the description adds the deprecation lifecycle (removal date, unchanged behavior until then) and the authorization requirement ('read scope suffices'), which annotations cannot express. It also confirms idempotent stable answers via 'keeps answering unchanged'.
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 deprecation warning is front-loaded, followed by what it returns and when to call it. Four short sentences, each carrying distinct information with no repetition.
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?
With no output schema, the description compensates by describing the payload shape (edge types plus subject/object classes and usage explanations) and the precondition for calling it correctly. Nothing needed to invoke it 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?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate beyond confirming the call needs no arguments, which is implicit in 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?
States the resource precisely: the tenant's relation catalogue, every allowed edge type with subject/object classes and usage explanations. It also names the exact replacement sibling (knowmind_get_schema), so an agent can distinguish this legacy alias from its successor without opening a 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 routes the agent: use knowmind_get_schema instead, and call this before building edges with knowmind_link to pick the right predicate. Both the when-to-use and the named alternative are stated rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_statsARead-onlyIdempotent
DEPRECATED, removed on 2027-03-31: use knowmind_get_stats. This name keeps answering unchanged until then. 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?
Goes well past the annotations: the deprecation window (removed 2027-03-31) and the guarantee that behavior stays unchanged until then are lifecycle facts no annotation can express, and 'read scope suffices; takes no parameters' documents the auth requirement and call shape. It also discloses the return contents (three count categories), which matters since there is no output schema.
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 deprecation warning is front-loaded, followed by purpose, routing guidance, and call requirements — four clauses, no filler, nothing repeated for its own sake.
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?
Complete for a zero-parameter read tool with no output schema: it covers purpose, return shape, migration path, auth scope, and lifetime. An agent has everything needed to decide and call 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 takes zero parameters, so the baseline is 4, and the description correctly confirms 'takes no parameters' rather than inventing inputs. There is no additional parameter meaning to add.
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 ('Return current counts for the tenant corpus') and enumerates exactly what is counted: memories, graph edges and vector chunks. It also names its own replacement (knowmind_get_stats) and the entry-listing siblings it is not, so an agent can separate it from the other stats/list tools without opening a 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?
Gives explicit when-to-use ('gauge how much has been stored') and explicit when-not plus alternatives ('for the actual entries use knowmind_list_recent or knowmind_recall'). It also routes future callers to knowmind_get_stats with a concrete sunset date.
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. Always creates a new entry; an earlier entry with the same title stays valid, because titles do not identify entries here (to supersede, use knowmind_update_fact, or knowmind_upload_document, which replaces by title); 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. ENTRIES ARE NEVER HARD-DELETED, they are superseded: correct a fact with knowmind_update_fact, remove an edge with knowmind_unlink_entities. Both keep the history auditable, which is the point of this store - what was true when, and when that changed. 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?
Annotations give the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description adds substantial context beyond them: 'Always creates a new entry' with titles as non-keys, sha-identical content treated as idempotent, the never-hard-delete/supersede model, the write-scope requirement, and 'Returns the new memory id.' The idempotency nuance refines rather than contradicts the annotation.
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?
Front-loaded with the core action and scoping, but the body is long and repeats content already in the schema and annotations — notably the 'A memory without edges is a note...' metaphor appears here and again verbatim in the relations schema description. The all-caps emphasis and duplicated predicate list dilute the density.
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 7-param mutation tool with no output schema, the description covers everything an agent needs: effect (creates one entry), return value (the new memory id), auth scope, the never-deleted/superseded lifecycle, and the edge-creation side effect. Nothing material 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 already documents all 7 parameters and even embeds the allowed predicate list. The description still adds meaning by insisting relations be set in THIS call ('GIVE THE EDGES ALONG') and warning that the server creates the counterpart node and edge, so no separate knowmind_recall/entity/link call is needed — semantics 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?
States a specific verb+resource ('Store durable insights... Persists one memory entry in the tenant corpus') and enumerates what qualifies (decisions, preferences, facts, results, appointments). It explicitly separates the tool from siblings: knowmind_recall/knowmind_list_recent for retrieval, knowmind_upload_document for long text, knowmind_update_fact for superseding, knowmind_link for connecting existing entries.
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 and when-not: 'Use for a single short fact; for long or multi-fact text use knowmind_upload_document' and 'Use knowmind_link separately only to connect two entries that already exist.' It also routes supersession to knowmind_update_fact and removal to knowmind_unlink_entities, covering the alternatives by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_unlinkADestructiveIdempotent
DEPRECATED, removed on 2027-03-31: use knowmind_unlink_entities. This name keeps answering unchanged until then. End a relation between two memories; inverse and inferred edges end with it. It stays in history, where knowmind_recall_at_time finds it. Repeating it does nothing. Fixes a wrong 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?
Goes well beyond the annotations: inverse and inferred edges are removed along with the edge (cascade), the edge is retained in history and retrievable via knowmind_recall_at_time (soft delete, reversible read path), repetition is a no-op, and write scope is required. Annotations already declare destructive/idempotent; the description adds the consequential detail.
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?
Front-loads the deprecation and replacement, then packs functionality, cascade semantics, history behavior, idempotency, and auth into short declarative clauses with no 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?
No output schema, so the description must cover behavior, and it does: lifecycle (deprecated with date), side effects (inverse/inferred edges), durability (history + recall_at_time), idempotency, and permission requirements. Nothing needed to call 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 description coverage is 100% with all three parameters documented (including the UPPER_SNAKE_CASE, 'exactly as created' constraint), so the schema carries the parameter burden. The description adds no parameter-level detail beyond the schema, which is the baseline 3.
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 precise verb+resource: 'End a relation between two memories.' It also names the sibling that supersedes it (knowmind_unlink_entities) and the inverse operation it undoes (knowmind_link), so an agent can place it exactly in the graph-editing family.
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 routes the agent away from this tool to knowmind_unlink_entities, gives the cutoff date (2027-03-31), and states the remaining legitimate use case ('Fixes a wrong knowmind_link'). When-to-use, when-not-to-use, and the alternative are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_unlink_entitiesADestructiveIdempotent
End a relation between two memories; inverse and inferred edges end with it. It stays in history, where knowmind_recall_at_time finds it. Repeating it does nothing. Fixes a wrong 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 flag destructive and idempotent, but the description adds real behavioral depth beyond them: inverse and inferred edges are cascaded, the edge persists in history where knowmind_recall_at_time can find it, and the call requires write scope. Cascade scope and the auth requirement are exactly the kind of context an agent cannot get from the hints alone.
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?
Four short sentences, front-loaded with the core action and effect, then cascading consequence, then idempotency, then the auth prerequisite. Nothing is padding; every clause carries a distinct fact.
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?
With no output schema, the description covers the important call-time concerns: cascade effects, history retention, idempotency, and write-scope requirement. It stops short of describing what happens if the named relation does not exist, but that is largely implied by the stated idempotency.
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%, so from_id, to_id and rel_type are already fully documented in the schema, including the UPPER_SNAKE_CASE convention. The description adds no syntax or format detail beyond what the schema provides, so the baseline of 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?
The description states a specific verb and resource ('End a relation between two memories') and immediately scopes it against siblings by naming the inverse operation (knowmind_link) and the history lookup tool (knowmind_recall_at_time). An agent can distinguish this from knowmind_link_entities without opening either 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?
It gives one usage scenario ('Fixes a wrong knowmind_link'), which implies when to reach for it, but never states when NOT to use it or names an explicit alternative tool for corrections. The routing signal is implied rather than spelled out.
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_documentADestructive
Ingest a longer text as one document into the tenant corpus: chunk splitting, embeddings, vector chunks and graph nodes. Upsert-by-title (server default): if a valid document with the same title exists in the same domain, the new version supersedes it; the old version stays retrievable via knowmind_recall_at_time, and the superseded ids come back in replaced_document_ids. If the same text already exists in another valid document of the same domain, no new document is created and the response carries deduplicated. 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. Unless replace is false, it identifies the document: a valid document with the same title in the same domain is superseded and stays retrievable via knowmind_recall_at_time. | |
| source | No | Origin, a URL or file path. Free text appended to the content for provenance; it does not decide which document is superseded. | |
| content | Yes | Full document text (Markdown or plain); chunked and embedded server-side. | |
| replace | No | Default on knowmind.de: true, supersede the valid document with the same title in the same domain. false: store as a new document next to it. | |
| 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?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds materially: what actually happens to the superseded version (it stays retrievable via knowmind_recall_at_time), the content-based dedup behavior (no new document, response carries 'deduplicated'), and the write-scope prerequisite. This clarifies the practical meaning of the destructive flag rather than merely restating it.
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?
Front-loaded with purpose and scoping first, then upsert/dedup semantics, then when-to-use, then the required scope. Dense but every sentence carries information; the only cost is that it is long and packs several distinct concerns (title upsert, dedup, return fields, post-ingest linking) into one block.
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?
There is no output schema, and the description compensates by naming the return values it can (document id, number of chunks written, replaced_document_ids, 'deduplicated'). With annotations covering safety, auth scope stated, and the alternative tool named, nothing essential for correct invocation 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 baseline is 3, but the description adds real meaning beyond the schema: the upsert-by-title resolution rule, the same-domain constraint, and content-level dedup that no parameter documents. Minor tension: the description tells the agent to set edges via knowmind_link 'AFTER INGESTING', while the relations parameter description says to set them 'HERE, in the same call', which muddies rather than clarifies that parameter.
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 with scope: 'Ingest a longer text as one document into the tenant corpus', then enumerates the pipeline steps (chunk splitting, embeddings, vector chunks, graph nodes). It explicitly distinguishes itself from the sibling knowmind_store_memory ('for a single short fact use knowmind_store_memory'), so an agent can route correctly without opening either 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?
Gives an explicit when-to-use ('long-form or multi-fact content (a report, a page, a doc)') paired with when-not and the named alternative ('for a single short fact use knowmind_store_memory'). It also prescribes the follow-up workflow (extract facts, create edges via knowmind_link) and states the required write scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowmind_upsert_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?
Annotations already declare non-read-only plus idempotent, but the description goes further: it names the identity key ('same name, same class and same tenant always return the same id, so calling twice creates no duplicate') and discloses the authorization prerequisite ('Requires write scope'), neither of which appears in the annotation block. It stops short of describing the returned payload beyond 'the existing one', which is a minor residual gap.
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?
Front-loaded with the core action and its dedup behavior, and the routing sentence to knowmind_link comes before the finer naming conventions. The capitalized 'THE GRAPH NEEDS THESE' framing is rhetorical padding that does not add actionable content, but the remainder is dense and 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 four-parameter, partially-required write tool with full schema coverage and no output schema, the description covers the essential set: when to call, key identity semantics, authorization scope, naming convention, and where to source the class catalogue. There is no output schema, so return values need not be enumerated.
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, and the description adds meaning beyond it by directing where entity_class values come from ('pick the class from the catalogue in knowmind_schema') and reinforcing the naming convention for name. That cross-tool pointer is genuinely useful, though the naming advice partially duplicates the schema's own wording.
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 verb and resource ('Create the node for a thing the corpus talks about') and immediately covers the upsert fallback ('or return the existing one'), listing the entity kinds it applies to. It also separates itself from knowmind_link, which is the nearest sibling, so an agent can route correctly without opening either 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?
It gives explicit triggering conditions ('when a name recurs across memories or when you are about to link something that has no node yet') and names the follow-up tool ('then connect it with knowmind_link'). Alternatives and ordering relative to linking are both stated, not implied.
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.4.5- Added
knowmind_get_health - Added
knowmind_get_schema - Added
knowmind_get_stats - Changed
knowmind_link2 fields changed- added
Input schema / properties / evidenceAdded value: +{ + "description": "Memory ID of the entry that states this relation (often from_id or a note found via knowmind_recall). Required: an edge without evidence is rejected.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "from_id", - "to_id", - "rel_type" -]New value: +[ + "from_id", + "to_id", + "rel_type", + "evidence" +]
- Added
knowmind_link_entities - Added
knowmind_list_inferred - Changed
knowmind_recall1 field changed- changed
Input schema / properties / hops / descriptionPrevious value: -"Graph expansion depth over typed relations (0-3, default 2); 0 = text/vector only, no graph."New value: +"Accepted for compatibility (0-3, default 2); currently has no effect on recall."
- Added
knowmind_recall_memories - Added
knowmind_review_inferred - Added
knowmind_unlink_entities - Changed
knowmind_upload_document3 fields changed- added
Input schema / properties / replaceAdded value: +{ + "description": "Default on knowmind.de: true, supersede the valid document with the same title in the same domain. false: store as a new document next to it.", + "type": "boolean" +} - changed
Input schema / properties / source / descriptionPrevious value: -"Origin - URL or file path. Free text, stored for provenance."New value: +"Origin, a URL or file path. Free text appended to the content for provenance; it does not decide which document is superseded." - changed
Input schema / properties / title / descriptionPrevious value: -"Document title. Acts as the upsert key - an existing document with the same title is replaced."New value: +"Document title. Unless replace is false, it identifies the document: a valid document with the same title in the same domain is superseded and stays retrievable via knowmind_recall_at_time."
- Added
knowmind_upsert_entity
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 22 tools
Among the active tools, purposes are distinct: store/upload split by content length, recall vs recall_at_time split by time semantics, entity vs link vs unlink, and inferred-review pair. However, 7 tools (recall, health, stats, entity, link, schema, unlink) are deprecated aliases that still answer, creating seven near-duplicate pairs an agent could misroute to if it skims.
Active tools follow a clean knowmind_verb_noun snake_case pattern (get_health, store_memory, link_entities, recall_at_time). The deprecated aliases (knowmind_health, knowmind_stats, knowmind_entity, knowmind_link) drop the verb and break the pattern, a minor but visible inconsistency.
22 tools is on the heavy side; 7 of them are deprecated aliases, so the effectively supported surface is ~15, which is reasonable for a memory-plus-graph server. The alias inflation pushes the raw count into the borderline-heavy band.
Coverage is broad: write (store/upload), supersede (update_fact), time-travel and current recall, listing (recent/relations), entity upsert, link/unlink, inferred-relation review, plus health/stats/schema diagnostics. Intentional no-hard-delete design and upsert-by-title document replacement leave only minor gaps (no batch ops, no explicit document edit beyond re-upload).
Maintenance
Related MCP Connectors
Persistent memory for AI agents. EU-hosted, privacy-first, hybrid recall, contradiction detection.
Persistent business-intelligence memory for AI agents.
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.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceLong-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.1032 npmMIT
- AlicenseNot gradedqualityAmaintenancePrivacy Agent Memory with best performance and security35MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to maintain persistent, local memory with retrieval-augmented search, knowledge graphs, and context surfacing, without any cloud dependencies.439 npmMIT