Skip to main content
Glama

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.

npm · knowmind.de

Connect your AI tool in three steps

  1. Create a free account at knowmind.de and generate an access token: Dashboard → API tokens.

  2. Store the token locally:

npx -y knowmind login --token kmt_xxxxxxxx
  1. Wire up your client:

Claude Code (one command)

claude mcp add knowmind --env KNOWMIND_TOKEN=kmt_xxx -- npx -y knowmind mcp

Cursor (~/.cursor/mcp.json) — also works for Claude Desktop, Windsurf, Cline, Continue, Goose, and Zed with their respective config files:

{
  "mcpServers": {
    "knowmind": {
      "command": "npx",
      "args": ["-y", "knowmind", "mcp"],
      "env": { "KNOWMIND_TOKEN": "kmt_xxx" }
    }
  }
}

Any other MCP client: knowmind is a standard MCP server over stdio (npx -y knowmind mcp). On Windows, if npx does not start directly, use "command": "cmd", "args": ["/c", "npx", "-y", "knowmind", "mcp"].

npx -y knowmind install <ide> writes this configuration for you (e.g. claude, cursor, vscode), and npx -y knowmind init sets up automatic memory hygiene — recall before each task, store after each meaningful change — for clients with a hook or rule mechanism (Claude Code, Cursor).

Related MCP server: Memory Nexus MCP

How knowmind stores facts

  • Bitemporal history. Every fact carries two time axes: when it was true and when it was recorded. Corrections never overwrite the original; the old statement stays queryable with the date it stopped being valid, so you can reconstruct what the system knew on any given day.

  • Provenance and confidence per fact. New facts require a confidence level and keep a link to their source. Older facts without a confidence level are marked as such.

  • Typed knowledge graph. Entities and relations use a restricted set of edge types; catch-all relations are rejected at write time.

  • Operated in the EU, isolated per tenant. The service runs on Hetzner in Nuremberg, Germany, with tenant isolation, a public data processing agreement, and a subprocessor list at knowmind.de/legal/avv. Access logs are hash-chained and externally timestamped (RFC 3161).

knowmind is a hosted service; there is no self-hosted community edition. If you need self-hosting, one of the projects below will serve you better. knowmind is built for the people and teams that need an operated memory service with an audit trail in the EU.

Pricing

Tier

Price

For whom

Free

€0

individuals and evaluation

Pro

€15/month or €150/year

individual professionals

Team

€99/month

teams with shared memory

Business

€349/month

larger teams

Enterprise

from €1,000/month

organizations with on-premise requirements

The free tier includes 2,500 memories, 1 user, and a 30-day access log.

How that compares (vendor pricing pages, checked 2026-09-05):

Product

Free tier

First paid tier

Self-hosting

knowmind

2,500 memories

€15/month

no (Enterprise on-premise option)

Mem0

10,000 entries, 1,000 retrievals/month

$19/month

yes (Apache-2.0)

Zep

10,000 credits/month

$125/month

Graphiti open source; Zep as BYOC

cognee

1M tokens, 1 workspace

$2.50 per 1M tokens

yes

Letta

limited agents, own keys

$20/month

yes (per vendor)

Supermemory

~$5 usage included

$19/month

from Scale tier

Details and current prices: knowmind.de/pricing.

Commands

npx -y knowmind search "Where does the staging deploy run?"
npx -y knowmind upload notes.md --title "Meeting notes 2026-05-12"
npx -y knowmind stats
npx -y knowmind health
npx -y knowmind status --line   # one-line status for your AI tool's statusline

Available Tools

Thirteen tools over MCP. Every one works against your own workspace; the server never sees another tenant's data.

Reading

knowmind_recall_memories — Search your memory and get the passages that answer a question, ranked. Combines keyword search, vector similarity and the knowledge graph, then reranks with a cross-encoder. query (string, required) · k (integer, default 5, max 20) · hops (integer, default 2 — how far to follow graph edges from a hit) Usage: your AI tool asks "Which database does the billing service use?" before answering, instead of guessing. Errors: returns an empty result set when nothing matches — never an invented answer.

knowmind_recall_at_time — The same search, but as your memory stood on a given date. Facts superseded after that date are excluded; facts that were valid then are returned even if they are no longer true. query (string, required) · as_of (ISO date or timestamp, required in practice) · k (integer, default 5) Usage: "What was our pricing in March?" — answers from the state of that day, not today's. Difference from knowmind_recall_memories: use recall for what is true now, and recall_at_time for what was true then. Asking recall about the past returns today's facts.

knowmind_list_recent — The most recently added entries, newest first. k (integer, default 10) Usage: a quick look at what landed in memory during this session.

knowmind_list_relations — All typed edges attached to one entry, in both directions. memory_id (string, required) Usage: "What does this contract connect to?" before changing or superseding it. Errors: unknown id returns an error, not an empty list.

knowmind_get_schema — The entity classes and relation types this workspace accepts. No parameters. Usage: call it before knowmind_upsert_entity or knowmind_link_entities to use a type the server will accept, rather than inventing one.

knowmind_get_stats — Size of the corpus: documents, chunks, entities, edges. No parameters.

knowmind_get_health — Whether the service and its stores are reachable. No parameters. Usage: a status line, or a check before a long ingest.

Writing

knowmind_store_memory — Store a short fact, decision or note. Stays as one unit; it is not split. content (string, required) · title (string) · memory_type (string, e.g. semantic, episodic) · tags (array of strings) · source (string) · domain (string) · relations (array — edges to create along with the entry) Usage: "We decided to keep the monolith until Q3" after a meeting. Errors: rejected with 422 when the text contains what looks like a password or an access key. Store a pointer instead, not the secret.

knowmind_upload_document — Store a longer text as a document. It is split into passages, embedded, and becomes searchable through knowmind_recall_memories. content (string, required) · title (string) · source (string) · relations (array) Usage: meeting minutes, a specification, a handbook chapter. Difference from knowmind_store_memory: one sentence you want back verbatim is a memory; a page you want searched is a document. A long text stored as a memory is retrieved as one block, which crowds out other results.

knowmind_update_fact — Supersede a fact that has changed. The old version keeps its validity window and stays auditable; nothing is deleted. target_id (string, required) · new_title (string, required) · new_content (string, required) · update_reason (string) Usage: a price, a deadline or a responsibility changed. Never overwrite — supersede, so "what did we believe in July" stays answerable. Errors: unknown target_id is rejected.

knowmind_upsert_entity — Create or update a typed entity (a person, a company, a product) with aliases. name (string, required) · entity_class (string, required — see knowmind_get_schema) · description (string) · aliases (array of strings) Usage: give "ACME Ltd." its aliases so a question about "ACME" finds it. Errors: a class outside the schema is rejected.

knowmind_link_entities — Create a typed edge between two entries, with a confidence value. from_id (string, required) · to_id (string, required) · rel_type (string, required — see knowmind_get_schema) · confidence (number 0–1) Usage: connect a contract to the client it belongs to. The inverse edge is created for you.

knowmind_unlink_entities — Remove a typed edge. from_id, to_id, rel_type (all required) Usage: an edge created in error. The entries themselves stay.

On deleting

There is no delete tool, and that is deliberate. Facts are superseded (knowmind_update_fact), edges are removed (knowmind_unlink_entities), and the history stays auditable. Deleting an entire workspace including its data is a self-service action in the web interface at knowmind.de — it is not something an agent should be able to do by calling a tool.

Older tool names

Seven tools were renamed on 12 September 2026 so that every name follows knowmind_<verb>_<object> and says whether it reads or writes. The previous names keep answering unchanged until 31 March 2027 and still appear in discovery, marked as deprecated:

until now

from now on

knowmind_recall

knowmind_recall_memories

knowmind_health

knowmind_get_health

knowmind_stats

knowmind_get_stats

knowmind_schema

knowmind_get_schema

knowmind_entity

knowmind_upsert_entity

knowmind_link

knowmind_link_entities

knowmind_unlink

knowmind_unlink_entities

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.

Documentation · Pricing · Data processing agreement · Privacy


Die deutsche Fassung steht in README.de.md.

Available Tools

13 tools
knowmind_entityA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProper name of the thing, as it would be written in a document. No role, no status, no description.
aliasesNoOther spellings the same thing appears under. Optional.
descriptionNoOne sentence saying what this is. Optional, helps later retrieval.
entity_classYesClass from the catalogue (knowmind_schema -> entityClasses), e.g. Person, Organization, Application, Host, Technology.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that same name/class/tenant returns the same id (idempotent) and that it requires write scope, which aligns with annotations. Adds context about not duplicating nodes, though it does not describe failure modes or side effects beyond creation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is verbose and includes a rationale paragraph ('THE GRAPH NEEDS THESE') that, while informative, could be trimmed. It repeats the idempotency point and includes imperative naming/style advice that lengthens the text without drastically improving clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Provides comprehensive context: why entities are needed, when to create, naming conventions, class catalogue, and write scope. Despite no output schema, the description gives enough for an agent to invoke correctly, though it omits edge cases like duplicates or conflicts.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already covers all four parameters with descriptions; the description adds guidance for name formatting (plain proper name) and entity_class selection (from knowmind_schema catalogue). This adds value for the main parameters, while aliases and description rely on schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the tool creates an entity node or returns an existing one, with clear scope (person, organization, application, host, technology). Mentions related tools like knowmind_link, but does not explicitly name an alternative sibling to avoid, so purpose is clear but not maximally distinguishing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit conditions for when to create an entity (when a name recurs or before linking to something without a node) and instructs to connect with knowmind_link. This gives concrete usage guidance beyond the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowmind_healthA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds useful context by stating read scope suffices, no parameters, and returns a status object per component, which helps the agent understand the tool's behavior beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and well-structured: the first sentence states the purpose, the second provides usage and return details. No unnecessary information, and the key points are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple health-check tool with no output schema, the description is complete. It covers what the tool returns (status per component), when to use it, and that it is read-only, leaving no ambiguity for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so the input schema is trivially complete. The description explicitly notes 'takes no parameters', reinforcing that no arguments are needed and adding clarity beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it returns the health of the knowmind backend and lists the components (Postgres, memory service, graph). The verb 'return' is specific and distinguishes this from sibling tools like stats or list operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides usage scenarios: before batch writes or when calls fail, to distinguish an outage from an empty result. This gives clear guidance on when to use this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowmind_list_recentA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kNoNumber of newest entries to return (1-50, default 10).

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_relationsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
memory_idYesMemory ID whose relations to list (get it via knowmind_recall).

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_recallA
Read-onlyIdempotent

Retrieve relevant knowledge before answering anything that benefits from prior context - decisions, preferences, project state, people, deadlines, past conversations. Hybrid recall (BM25 + pgvector + graph hops) over the tenant corpus; returns the top-k memory chunks, each with a relevance score and source reference. Suitable whenever earlier context would improve the answer; use knowmind_recall_at_time when you need what was valid at a past point in time. Read scope suffices.

ParametersJSON Schema
NameRequiredDescriptionDefault
kNoNumber of chunks to return (1-25, default 5).
hopsNoGraph expansion depth over typed relations (0-3, default 2); 0 = text/vector only, no graph.
queryYesNatural-language question; full sentences retrieve better than keywords.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only and non-destructive hints; the description adds meaningful behavioral detail: hybrid recall (BM25 + pgvector + graph hops), top-k chunks with relevance scores and source references, and 'Read scope suffices' for permissions. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded, but contains minor redundancy: 'Retrieve relevant knowledge before answering anything...' and 'Suitable whenever earlier context would improve the answer' overlap. Overall it is appropriately sized, earning a strong score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the description covers the operation, when to use, return format (top-k chunks with score and source), and safety. The annotation set plus description provide a complete picture; no output schema exists, but the description compensates for it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining the hybrid recall approach and the role of graph hops, which gives meaning to k and hops parameters, though it does not detail each parameter's syntax.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Retrieve relevant knowledge') and resource (memory chunks from the tenant corpus), and explicitly distinguishes itself from knowmind_recall_at_time. It leaves no doubt about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when it is suitable ('whenever earlier context would improve the answer') and names the alternative (knowmind_recall_at_time) for past-point-in-time retrieval. This is clear when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowmind_recall_at_timeA
Read-onlyIdempotent

Time-travel recall: return only memories that were valid at a given instant (valid_from <= as_of <= valid_to, or still open). Answers 'what did the agent know on March 14?'. Use instead of knowmind_recall when the point in time matters; otherwise use knowmind_recall for the current truth. Read scope suffices.

ParametersJSON Schema
NameRequiredDescriptionDefault
kNoNumber of chunks to return (1-25, default 5).
as_ofNoISO-8601 timestamp to evaluate validity at; defaults to now. Example: '2026-03-14T00:00:00Z'.
queryYesNatural-language question.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive behavior. The description adds meaningful behavioral detail about temporal validity filtering and notes that read scope suffices, going slightly beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by a concrete example of the question it answers and a clear tool-selection guideline. No unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the temporal recall behavior and relationship to the current-truth variant, while the schema covers parameter bounds and defaults. It does not describe output format, but no output schema is present and the core usage context is sufficiently covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers all parameters with descriptions, so the baseline is 3. The description adds the validity-interval semantics (valid_from <= as_of <= valid_to, or still open), which clarifies how as_of is used beyond the schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the verb (recall), resource (memories), and temporal scope (valid at a given instant), and explicitly distinguishes it from the sibling tool knowmind_recall by noting when to use each.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit usage direction: 'Use instead of knowmind_recall when the point in time matters; otherwise use knowmind_recall for the current truth.' This directly routes the agent to the correct tool choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowmind_schemaA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description reinforces the read-only nature and adds useful behavioral context: it is scoped to the tenant's graph, returns a catalogue, and 'read scope suffices'. There is no contradiction and it adds meaningful non-schema context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each earning its place: what it returns, when to call it and why, and what scope conveys. It is front-loaded, specific, and free of filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only schema tool, the description is appropriately complete: it specifies the output content, its purpose, the tenant scope, and the read permission requirement. Agents have enough to invoke it correctly without more detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and an empty input schema, so no parameter-level semantics are needed. The baseline for a no-parameter tool is 4, and the description already explains what the returned data will contain.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Return the relation catalogue of this tenant's knowledge graph' with the exact content (allowed edge types, subject and object classes, usage explanations). This clearly distinguishes it from data-query siblings like knowmind_list_relations and knowmind_recall, since it returns schema rather than graph instances.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit guidance: call this before building edges with knowmind_link and use it to pick the correct predicate. The 'read scope suffices' note also sets permission expectations. It does not explicitly state when not to call it or contrast with alternatives like knowmind_list_relations, but the core usage context is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowmind_statsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows it is a safe read operation. The description adds 'Read scope suffices', which is consistent with the annotations but does not introduce new behavioral details such as rate limits or side effects. Since annotations cover the safety profile, the description adds minimal extra value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, comprising two sentences, and is well-structured. It efficiently conveys the purpose, usage, and alternatives without unnecessary detail, making it easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple stats tool with no parameters, the description is complete: it defines the output (counts of corpus components), the purpose (gauge storage), and directs to alternatives. No additional context is required for an agent to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty. The description explicitly states 'takes no parameters', which reinforces the fact despite the schema already being empty. The baseline for 0 parameters is 4, and the statement adds clarity without any ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns counts for the tenant corpus (memories, graph edges, vector chunks) and explicitly distinguishes it from sibling tools by directing users to knowmind_list_recent or knowmind_recall for actual entries. The verb 'Return' is specific and the resource scope is defined.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly indicates when to use the tool ('to gauge how much has been stored') and also states when not to use it, pointing to alternatives for retrieving actual entries. This provides clear usage boundaries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowmind_store_memoryA

Store durable insights the moment they arise - decisions, preferences, facts, results, appointments. Persists one memory entry in the tenant corpus (Postgres + vector index + graph node), afterwards findable via knowmind_recall and knowmind_list_recent. Append-only: the same title replaces nothing (use knowmind_update_fact to supersede); sha-identical content is detected as idempotent (unchanged). Returns the new memory id. Use for a single short fact; for long or multi-fact text use knowmind_upload_document. GIVE THE EDGES ALONG: whatever the text says about people, organisations, projects, hosts or technologies belongs into relations in THIS call - name the counterpart, the server creates its node and the edge, no second call needed. A memory without edges is a note; with edges it becomes a graph that answers questions nobody wrote down. Use knowmind_link separately only to connect two entries that already exist. Requires write scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoFree-text keywords for later filtering (lowercase, no spaces recommended).
titleNoShort human-readable title (a few words). Not a uniqueness key - duplicate titles create separate entries.
domainNoKnowledge 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.
sourceNoWhere this came from - URL, file path, or a short note. Free text, stored for provenance.
contentYesThe memory text. Keep it to one atomic fact per entry so it stays retrievable and updatable.
relationsNoEdges 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_typeNoKind of memory: semantic (durable fact), episodic (event), procedural (how-to), reference (pointer to a resource). Default semantic.semantic

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description reveals append-only behavior ('the same title replaces nothing'), a specific idempotence rule ('sha-identical content is detected as idempotent'), the returned value ('new memory id'), and a prerequisite ('Requires write scope'). It also explains that relations are persisted in the same call with no second tool needed. Slightly opaque on failure/error behavior and what happens to the graph node when there are no edges, so not a full 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and a routing sentence in the first two lines. It is longer than it strictly needs to be because the 'GIVE THE EDGES ALONG' section and the schema description for relations repeat the same example and explanation. Still, most sentences earn their place by addressing behavior, routing, or parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a complex tool with 7 parameters and no output schema, the description covers what matters most: what counts as an atomic memory, how to add relations in the same call, which sibling to use instead, and that it returns the new memory id. It is sufficiently complete for an agent to call the tool without requiring the schema or separate documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful operational nuance to key parameters: content should be a single short fact, relations should be filled in the same call with a concrete example, and title is not a uniqueness key. It also rationalizes the relations parameter by explaining the difference between a note and a graph memory, which helps an agent decide how to fill it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Store durable insights' and 'Persists one memory entry in the tenant corpus (Postgres + vector index + graph node)'. It clearly differentiates this tool from close siblings: 'for long or multi-fact text use knowmind_upload_document' and 'use knowmind_update_fact to supersede'. An agent can immediately tell what this tool does and where it fits among the other memory tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit selection criteria: 'Use for a single short fact; for long or multi-fact text use knowmind_upload_document' and names knowmind_update_fact for superseding existing entries. It also tells the agent when not to use linking tools here: 'Use knowmind_link separately only to connect two entries that already exist'. This is full usage guidance with routing to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowmind_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
new_titleYesTitle of the new, now-valid memory.
target_idYesID of the memory to supersede; get it via knowmind_recall - never invent it.
new_contentYesContent of the new memory (the updated fact).
update_reasonNoWhy it changed (e.g. 'address changed', 'contract renewed'); stored on the SUPERSEDES edge.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this instead of knowmind_store_memory when a fact CHANGES (address moved, contract renewed)' and highlights that old statements are not deleted, making the tool suitable for auditable timelines. It also mentions the query tool knowmind_recall_at_time for reading history, providing clear context and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowmind_upload_documentA

Ingest a longer text as one document into the tenant corpus: chunk splitting, embeddings, vector chunks and graph nodes. Upsert-by-title: if a document with the same title exists, the new version replaces the old one (server default). Use for long-form or multi-fact content (a report, a page, a doc); for a single short fact use knowmind_store_memory. Returns the document id and the number of chunks written. AFTER INGESTING: extract the facts the text states about people, organisations, projects, products, technologies and hosts, and create the corresponding edges via knowmind_link. Requires write scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoDocument title. Acts as the upsert key - an existing document with the same title is replaced.
sourceNoOrigin - URL or file path. Free text, stored for provenance.
contentYesFull document text (Markdown or plain); chunked and embedded server-side.
relationsNoEdges 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

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond the annotations by disclosing the upsert-by-title replacement behavior, server-side chunking/embedding, and the fact that it returns a document id plus chunk count. It also clarifies the destructive edge case in which an existing document with the same title is replaced, which is exactly the kind of context an agent needs despite destructiveHint being false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and efficient, front-loading the core purpose in the first sentence. Every sentence carries meaningful information: when to use it, the behavior, the output, the alternative tool, and the follow-up workflow. No filler or redundant restating of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is strong overall: it covers return values, write-permission requirements, upsert behavior, and follow-up links. Minor ambiguity remains because it directs the agent to create edges via knowmind_link after ingesting, even though the input schema allows edges via the 'relations' parameter in the same call, leaving two possible workflow interpretations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers all four parameters with full descriptions (100% coverage), so the baseline is 3. The description adds useful high-level context ('title acts as the upsert key', 'content is chunked and embedded server-side') but does not materially improve on the structured parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Ingest a longer text as one document into the tenant corpus') and specifies the processing pipeline (chunking, embeddings, vector chunks, graph nodes). It also explicitly contrasts with knowmind_store_memory for short facts, making the tool's purpose distinguishable from siblings without opening them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool ('long-form or multi-fact content') and when not to ('for a single short fact use knowmind_store_memory'). It also gives a clear post-ingestion workflow via knowmind_link and the required write scope, giving the agent actionable context for choosing and using the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv0.3.7
    • Addedknowmind_entity
    • Addedknowmind_health
    • Changedknowmind_link4 fields changed
      • changedInput schema / properties / confidence / description
        Previous 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."
      • changedInput schema / properties / from_id / description
        Previous value: -"Memory-ID des Quellknotens"New value: +"Memory ID of the source node (get it via knowmind_recall)."
      • changedInput schema / properties / rel_type / description
        Previous 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."
      • changedInput schema / properties / to_id / description
        Previous value: -"Memory-ID des Zielknotens"New value: +"Memory ID of the target node."
    • Changedknowmind_list_recent1 field changed
      • changedInput schema / properties / k / description
        Previous value: -"Anzahl der neuesten Einträge (1–50)"New value: +"Number of newest entries to return (1-50, default 10)."
    • Changedknowmind_list_relations1 field changed
      • changedInput schema / properties / memory_id / description
        Previous value: -"Memory-ID, deren Beziehungen abgefragt werden"New value: +"Memory ID whose relations to list (get it via knowmind_recall)."
    • Addedknowmind_recall
    • Addedknowmind_recall_at_time
    • Addedknowmind_schema
    • Changedknowmind_store_memory7 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"Volltext des Memory-Eintrags"New value: +"The memory text. Keep it to one atomic fact per entry so it stays retrievable and updatable."
      • addedInput schema / properties / domain
        Added 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"
        +}
      • addedInput schema / properties / memory_type / description
        Added value: +"Kind of memory: semantic (durable fact), episodic (event), procedural (how-to), reference (pointer to a resource). Default semantic."
      • addedInput schema / properties / relations
        Added 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"
        +}
      • changedInput schema / properties / source / description
        Previous value: -"Quelle/Herkunft, frei-text"New value: +"Where this came from - URL, file path, or a short note. Free text, stored for provenance."
      • changedInput schema / properties / tags / description
        Previous value: -"Schlagworte für Filterung"New value: +"Free-text keywords for later filtering (lowercase, no spaces recommended)."
      • changedInput schema / properties / title / description
        Previous value: -"Kurz-Titel des Memory-Eintrags"New value: +"Short human-readable title (a few words). Not a uniqueness key - duplicate titles create separate entries."
    • Changedknowmind_unlink3 fields changed
      • changedInput schema / properties / from_id / description
        Previous value: -"Memory-ID des Quellknotens"New value: +"Memory ID of the source node."
      • changedInput schema / properties / rel_type / description
        Previous value: -"Edge-Typ"New value: +"Edge type to remove (UPPER_SNAKE_CASE, exactly as created)."
      • changedInput schema / properties / to_id / description
        Previous value: -"Memory-ID des Zielknotens"New value: +"Memory ID of the target node."
    • Addedknowmind_update_fact
    • Changedknowmind_upload_document4 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"Volltext des Dokuments"New value: +"Full document text (Markdown or plain); chunked and embedded server-side."
      • addedInput schema / properties / relations
        Added 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"
        +}
      • changedInput schema / properties / source / description
        Previous value: -"Quelle, z.B. URL oder Dateipfad"New value: +"Origin - URL or file path. Free text, stored for provenance."
      • changedInput schema / properties / title / description
        Previous value: -"Dokument-Titel"New value: +"Document title. Acts as the upsert key - an existing document with the same title is replaced."
  2. 7 tool updatesv0.3.1
    • First observedknowmind_link
    • First observedknowmind_list_recent
    • First observedknowmind_list_relations
    • First observedknowmind_stats
    • First observedknowmind_store_memory
    • First observedknowmind_unlink
    • First observedknowmind_upload_document

TDQS

A4.3/5.0

Scored across 13 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: recall vs recall_at_time, store_memory vs upload_document, link vs unlink, and entity vs schema are all separated with explicit use-case guidance. There is no real risk of an agent picking the wrong tool for a given action.

Naming Consistency4/5

Most tools follow a knowmind_<verb>_<object> pattern such as store_memory, upload_document, update_fact, and list_relations. Some tools are bare nouns or verbs (stats, health, entity, schema, recall, link, unlink), but the shared prefix and snake_case style keep the overall set predictable.

Tool Count5/5

13 tools is well within the ideal range for a knowledge-graph memory server. Each tool covers a distinct part of the workflow: ingestion, retrieval, fact supersession, graph construction, schema inspection, health checks, and statistics.

Completeness4/5

The core write/read/update graph workflows are well covered, including storing memories, uploading documents, recalling current and historical facts, and managing entities and relations. The main gap is the lack of explicit delete operations for memories, documents, or entities, though supersede, upsert, and unlink provide reasonable workarounds and deletion may be intentionally excluded for auditability.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers