Zero
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Zerowhy don't we use Redis for background jobs?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Komplyt Zero
An open-core memory graph for your AI tools. Run it yourself, or use ours in the EU.
Agents lose the reasoning behind a decision when the session ends, and each client keeps separate notes. Zero is an MCP server that gives Claude, ChatGPT, Cursor and any other MCP client one shared memory. Agents record decisions, problems and approaches together with the reason, as typed nodes in a graph. A later session, in any client, finds them by meaning instead of keyword, so the reasoning behind last month's choice is there when someone is about to undo it. It is for developers who use several AI clients on the same product, and for teams that keep re-deciding things because nobody remembers why.
A notes file grows until nobody reads it, and a plain vector store returns the closest text with nothing around it. Zero keeps the reason with each decision, links related nodes so a hit brings its context along, and lets knowledge nobody uses drop down the ranking. Nothing is deleted. It stores what the agent was asked to keep, not your chats.
The core is Apache-2.0. The team features in src/ee/ are source-available: free for noncommercial use under PolyForm Noncommercial, with a commercial licence for everything else. Zero also runs on SurrealDB (Business Source License), so the repository as a whole is not OSI open source. Details are in Licence.
To try the hosted service (free for one person, data stored in Frankfurt), add it to Claude Code and run /mcp to sign in. To run it on your own machine, see Getting started.
claude mcp add --transport http komplyt-zero https://kg.kompl.yt/mcpWhat it looks like
An agent working on a webhook service starts a session, creating the project the first time:
{ "tool": "kg_session_start", "arguments": { "project": "acme-api", "create_project": true } }It then records a decision:
{
"tool": "kg_node_create",
"arguments": {
"type": "decision",
"project": "acme-api",
"tags": ["architecture", "webhooks"],
"content": "Webhook delivery uses a Postgres job table (SKIP LOCKED) instead of Redis or SQS. Why: under 1k jobs/min, Postgres already runs, and enqueueing in the same transaction as the business write means no lost events. Revisit above 10k jobs/min."
}
}Three weeks later, in a different client, someone asks a question that shares no keywords with it:
{
"tool": "kg_query",
"arguments": { "text": "why don't we use Redis for background jobs?", "project": "acme-api" }
}The decision comes back first. Spreading activation also returns the nodes linked to it, such as the open problem about retry storms that someone related to it last week.
Related MCP server: Mnemosyne
How it ranks what comes back
Every node carries an embedding and a decay score. A query ranks candidates by 0.7 × cosine similarity + 0.3 × decay score, then follows the graph's edges for up to three hops (two by default) to pull in related nodes, each hop weakening the signal by half.
The decay score is how the graph forgets. Each time a session starts in a project, every node in that project keeps 85 % of its score, so scores fall off exponentially. Nodes that agents update climb back toward a ceiling of 0.85, by more when they sit in a dense neighbourhood, and a query gives a smaller lift. Knowledge that keeps being used stays near the top, and knowledge nobody touches fades without anyone having to curate it. Decay never deletes anything; a faded node still turns up when a query matches it closely enough.
The graph, the decay and the spreading activation are all in this repository under Apache-2.0. The hosted service runs the same ranking code.
Getting started
Use the hosted service. This is the fastest route and needs no infrastructure. Add https://kg.kompl.yt/mcp as a custom connector in Claude or ChatGPT, or in Claude Code (the command is at the top of this page).
In Claude Code, run /mcp afterwards to sign in. Data is stored in Frankfurt. Step-by-step instructions for each client are in docs/connectors.md.
Run it yourself, with Docker (quickstart). The compose file starts SurrealDB, Ollama embeddings and the server with one command. It is a quickstart for one person on one machine, not production grade: no authentication (local mode), a single unreplicated database, no backups, no TLS, and secrets passed as plain environment variables. For anything shared or long-lived, follow docs/self-hosting.md. It needs Docker with the Compose plugin: docker compose version should print a version. Debian's docker.io package lacks it, so install docker-compose (Ubuntu: docker-compose-v2) or Docker's own packages.
git clone https://github.com/Komplyzen/komplyt-zero.git
cd komplyt-zero
[ -f .env ] || { umask 077; printf 'KG_JWT_SECRET=%s\nDB_ROOT_PASS=%s\n' "$(openssl rand -hex 32)" "$(openssl rand -hex 32)" > .env; }
docker compose up --build
claude mcp add --transport http zero http://localhost:3000/mcpThe first start downloads the embedding model (bge-m3, about 1.2 GB). The server runs in local auth mode (KG_AUTH_MODE=local): no tokens, one fixed user in one fixed tenant, and a default container called "Company Knowledge" created on first use. That suits one person on one machine, so compose publishes the port on 127.0.0.1 only. Don't publish the port beyond localhost, or put a proxy in front of it, unless the proxy authenticates callers.
Once it is up, http://localhost:3000/docs shows the server's documentation page and http://localhost:3000/health answers when it is ready.
Port 3000 already in use? Then the kg container won't start ("address already in use"). Add KG_PORT=3100 (any free port) to .env, run docker compose up -d again, and use http://localhost:3100/mcp and http://localhost:3100/docs instead.
KG_JWT_SECRET and DB_ROOT_PASS are plain environment variables of the containers, so anyone with access to the Docker daemon can read them with docker inspect. SurrealDB reads its root password only from an argument or environment variable (no password file), so compose can't hide it. The command above writes both secrets to .env once (mode 600, git-ignored; the [ -f .env ] guard never overwrites it). Keep that file: the database keeps the first DB_ROOT_PASS and the first KG_JWT_SECRET hash, so a lost or regenerated value makes the next start fail (kg crash-loops, migrate gets a 401). Existing installs from before the hardening (root/root): put DB_ROOT_PASS=root and your original KG_JWT_SECRET in .env; tested, data and migrations carry over.
Run it yourself, without Docker for the server. Zero needs Bun, a SurrealDB instance and an embedding provider:
git clone https://github.com/Komplyzen/komplyt-zero.git
cd komplyt-zero/src
bun install
../scripts/local-db.sh up # SurrealDB v3.2.4 in Docker, prints the KG_DB_* values
SURREAL_HTTP=http://127.0.0.1:8000 SURREAL_USER=root SURREAL_PASS=root KG_DB_NAME=local ../scripts/migrate.sh
cp .env.example .env # fill in the values. For single-user use: set KG_AUTH_MODE=local and
# comment out KOMPLYT_JWKS_URL and KOMPLYT_ISSUER (local mode refuses to start with them)
bun index.tsIn local mode (KG_AUTH_MODE=local) you need no identity provider: the server listens on 127.0.0.1:3000 unless you set LISTEN_ADDR, and rejects browser requests from other origins, other Host values (KG_LOCAL_ALLOWED_HOSTS adds some) and non-JSON bodies.
For a team or a public deployment, keep the default mode: the server accepts bearer JWTs from an OIDC issuer you point it at (Keycloak, Zitadel, Authentik, or anything that publishes a JWKS and can add a custom claim), and every token needs a tenantId claim, which scopes each query to one tenant. The modes can't be combined: local mode refuses to start when KOMPLYT_JWKS_URL or KOMPLYT_ISSUER is set. docs/self-hosting.md covers the full setup and the claims the server expects.
Use it from npm, as a stdio server. With your own SurrealDB and embedding provider, npx @komplyzen/komplyt-zero mcp starts Zero as a stdio MCP server for your client. It reads the same KG_DB_* and EMBEDDING_* settings, and KG_AUTH_MODE=local skips the login. On Linux it needs libsecret (Debian and Ubuntu: sudo apt install libsecret-1-0), because its credential store is a native module; without it the command fails at start with ERR_DLOPEN_FAILED. For a first try, Docker is simpler, since it brings SurrealDB and Ollama along.
Using it well
The server tells every client how to use it, but a few habits separate a graph that answers questions from a pile of notes. Query before you record, because the server doesn't deduplicate. Put the reason in the content, since only the content is embedded. Start each session with the right project, because decay and filtering key on it. At the end, re-activate the nodes you relied on so they stay findable.
docs/using-zero.md collects what we learned running Zero on our own work since early 2026: what to record and what to leave out, how to replace a decision without losing its history, which queries retrieve badly, and the end-of-session routine we use. Ready-to-copy agent instructions and a session-close skill are in examples/.
Tools
Tool | What it does |
| Starts a session in a project and applies decay to that project's nodes |
| Ends the current session |
| Shows the current session and node counts (read-only) |
| Lists open problems and todos, and recent decisions and approaches (read-only) |
| Records an observation, decision, argument, todo, problem, mitigation, workaround or approach |
| Changes a node's status, content or tags (tags replace the whole list), and re-activates it |
| Semantic search with type, status and project filters, plus spreading activation |
| Creates an edge between two nodes, or strengthens an existing one |
| Reads the stored methodology, resiliency or process model of a container, project or person (read-only; computed ahead of time, see docs/meta-model.md) |
Only kg_node_update changes what a node says. Querying, relating and starting sessions change usage scores, which shape future rankings. Pass read_only: true to kg_query when you are only looking, for example from a dashboard. The same operations are available over REST under /api/v1, described by /api/v1/openapi.json. Full parameter schemas are in src/contracts.ts. If you used the tools under their earlier names, see docs/migration-tool-split.md.
Embeddings
Zero uses Cohere's embed-multilingual-v3.0 by default. Ollama works for fully local embeddings, with one constraint: the vector index has 1024 dimensions, so the model must produce 1024-dimension vectors (bge-m3 and mxbai-embed-large do; Ollama's default nomic-embed-text does not). The server checks the dimension at boot and refuses to start on a mismatch.
EMBEDDING_PROVIDER=ollama
EMBEDDING_BASE_URL=http://localhost:11434 # OLLAMA_URL is accepted as an alias
EMBEDDING_MODEL=bge-m3 # optional; OLLAMA_MODEL is accepted as an aliasRun one provider per install: every stored vector must come from the same model. Switching provider or model on an existing database needs bun run bin/reembed.ts (use --dry-run first); until it finishes, queries compare against vectors from both models and results from nodes not yet re-embedded are unreliable. Cohere takes EMBEDDING_API_KEY (COHERE_API_KEY is still accepted). EMBEDDING_PROVIDER=fixture gives deterministic vectors without network calls, which is what the tests use. To add a provider, write an EmbeddingAdapter in src/embed.ts, list it in ADAPTER_FACTORIES and add its metadata to src/embed-registry.ts; env validation then accepts the new name with no other change.
Configuration
The variables you need for a first run are below; src/.env.example lists the rest.
Variable | Required | Description |
| Yes | SurrealDB connection |
| No | Namespace and database (default |
| Yes | At least 32 characters. Used for the tenant-scoped SurrealDB sign-in, not for signing user tokens |
| No |
|
| Yes in | The OIDC issuer whose tokens the server accepts. Not allowed in |
| No | Accepted token audiences, comma-separated (default |
| No |
|
| For cohere | Provider API key ( |
| For ollama | Provider base URL ( |
| No | Provider model (default from the registry; |
| No | Bind address (default |
Open core and the hosted product
This repository is the engine. In local auth mode, or once it has an OIDC issuer to trust, it is a complete memory for one person, which you run yourself, record into and query from any MCP client.
Working as a team is the paid part. The engine enforces who may read which container of nodes, but the code that sets up team work lives in src/ee/ and belongs to Komplyt Teams: the API that creates shared containers and grants colleagues access to them, the OAuth integration for the Claude and ChatGPT connector directories, and the admin surface. Komplyzen also runs the engine as a hosted service: Komplyt Zero is free for one person, Personal raises the limits for heavier individual use, and Teams is priced per seat. Above that sits the Komplyt Platform, a separate, closed product that runs expert-authored workflows against the graph. Current tiers and prices are on kompl.yt/zero, and questions about Teams or the Platform go to hello@kompl.yt.
Licence
The engine is licensed under Apache-2.0 (see LICENSING.md for the split). The code in src/ee/ (OAuth discovery metadata for connector directories, the REST API for managing shared containers, and the admin and purge routes) is not part of the Apache-2.0 engine and is not covered by that licence. It is source-available under the PolyForm Noncommercial License 1.0.0, which allows noncommercial use only, and Komplyzen offers it under a commercial licence as well (hello@kompl.yt). Only those terms apply to it, although the Docker image contains it. The server runs without src/ee/; it then logs that it is the open-source edition and leaves those routes out.
Zero stores its data in SurrealDB, which is licensed under the Business Source License 1.1. Self-hosting SurrealDB for your own use is permitted under that licence, but that licence, like the one on src/ee/, is not OSI open source, so we call Zero open core and don't describe the repository as open source.
Contributing and security
Contributions are welcome; CONTRIBUTING.md covers the setup, the test database and what a pull request needs. Report vulnerabilities privately to security@kompl.yt, as described in SECURITY.md. For questions and a chat with the people building it, join us on Discord.
Zero is built by Komplyzen GmbH in Berlin.
Available Tools
9 toolskg_meta_modelRead Meta-ModelARead-onlyIdempotentInspect
Read the stored meta-model of a container, project or person: methodology patterns, resiliency metrics, or process flows depending on lens. Models are computed ahead of time (nightly on the hosted service), not on request; a scope with no stored model yet returns status "not_computed" and "computed_at" says how fresh a model is.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Identifier for scope. Project: name. Person: email. Container: omit for current, or explicit ID. | |
| lens | Yes | Lens: methodology (default), resiliency, or process | methodology |
| scope | Yes | Scope: container, project, or person |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds genuinely non-obvious behavior on top: models are computed nightly on the hosted service, not on request, so reads can be stale. It also discloses the two return signals an agent must handle — status "not_computed" for an uncomputed scope and "computed_at" for freshness — which prevents misinterpreting an empty/deferred 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?
Two sentences, both earning their place: the first establishes what is read and how lens changes the output, the second front-loads the critical constraint (precomputed, possibly absent). No filler or restatement of the title.
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 does the right work by naming the status and freshness fields and by distinguishing the three lens result types. It stops short of describing the shape of a model payload per lens, but for a read-only tool with full schema coverage this is close to sufficient.
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% and both enums are documented, so the schema already carries the mechanics; the description adds meaning by mapping each lens to what it actually returns (methodology patterns, resiliency metrics, process flows). It does not clarify what id is required for, but the schema handles that.
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 ("Read the stored meta-model") and enumerates the three scopes and three lenses, so the resource is unambiguous. It does not differentiate itself from the sibling kg_query, which an agent might reasonably reach for instead.
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 implies usage through the scope/lens enumeration and warns that models are precomputed rather than on-request, which effectively tells the agent not to expect a fresh recompute. However it never states when to prefer this over kg_query or kg_status, nor any prerequisites for the id field per scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kg_node_createCreate NodeAInspect
Create a knowledge node (observation, decision, problem, approach, ...). Requires an active session. New nodes start fully active. Generates an embedding for semantic search and can link to existing nodes via relates_to.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Free-form labels for filtering, as an array of strings | |
| type | Yes | Kind of knowledge: observation, decision, argument, todo, problem, mitigation, workaround or approach | |
| status | No | Initial status: open, resolved, blocked or done | |
| content | Yes | The knowledge to store, as plain text. Embedded for semantic search. | |
| project | No | Project name to file the node under (defaults to the session project) | |
| container | No | Container ID. If omitted, uses tenant default container. | |
| relates_to | No | Node IDs to relate to (max 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent, non-destructive behavior, and the description adds meaningful context beyond that: the active-session requirement, that new nodes start fully active, and that an embedding is generated for semantic search. It stops short of describing the response or how relates_to failures are handled.
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 with no filler, and the core purpose plus the session prerequisite are front-loaded. Slightly list-like but every clause carries information.
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, so ideally the description would hint at what is returned (e.g. the new node ID). It compensates well by covering prerequisites, default activation state, embedding generation, and linking, which is nearly everything needed to call 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 coverage is 100%, so enum values for type/status, defaults for project/container, and the max-20 limit on relates_to are already documented. The description only restates the linking capability and embedding behavior, which adds marginal value over 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 ('Create a knowledge node') and enumerates the node kinds, plus the side effects of embedding generation and relate_to linking. It is clear what the tool does, though it does not explicitly contrast itself with kg_node_update or kg_relate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an important precondition ('Requires an active session'), which implies the tool is used mid-session. However, it never says when to create a new node versus updating an existing one via kg_node_update, or when linking should be handled by kg_relate instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kg_node_updateUpdate NodeADestructiveInspect
Update the status, content or tags of an existing knowledge node and reactivate it. Tags replace the whole tag list. Changing content overwrites the previous content and regenerates the embedding; if that fails the update is rejected and the node is unchanged. Requires an active session.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Node ID (e.g., "node:abc123") | |
| tags | No | Replaces ALL tags on the node: send the full list you want to keep. An empty array removes every tag; omit to leave tags unchanged. | |
| status | No | New status: open, resolved, blocked or done | |
| content | No | Updated content. Regenerates embedding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the destructiveHint annotation: it discloses that tags replace the entire list, that content overwrites prior content and regenerates the embedding, that a failed embedding aborts the update leaving the node unchanged, and that session auth is required. This is exactly the mutation-risk context an agent needs.
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, front-loaded with what can be updated, followed by the two highest-risk semantics and the auth prerequisite. No padding or repetition of the tool name.
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?
Covers atomicity on embedding failure, wholesale tag replacement, reactivation, and session requirement for a destructive mutation with no output schema. The only gap is whether the updated node is returned, which is minor for a tool of this complexity.
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% and the schema already documents full-list tag replacement, empty-array removal, omit-to-keep, and embedding regeneration. The description largely restates those facts, so it adds little beyond what structured fields already provide; 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 (update) plus the resource (an existing knowledge node) and enumerates the mutable fields (status, content, tags) and the side effect of reactivation. The word 'existing' implicitly separates it from the sibling kg_node_create, but no sibling is named, so differentiation is inferred rather than stated.
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?
'Requires an active session' is an explicit prerequisite, and the tag/content sentences describe when each field's side effects apply (full-list replacement, overwrite). It never names an alternative tool or a when-not-to-use case, so usage is clear but incomplete on routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kg_queryQuery KnowledgeAInspect
Search knowledge by semantic similarity, type, status, or recency. Returns nodes ranked by relevance. Use spread=true to find related nodes via spreading activation. With an active session, returned nodes are reactivated (their usage-based decay score is boosted; node content is not changed); pass read_only=true to search without changing anything.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Semantic search query | |
| type | No | Only nodes of this type | |
| limit | Yes | Max nodes to return (1-100) | |
| author | No | Only nodes by this author | |
| spread | Yes | Enable spreading activation | |
| status | No | Only nodes with this status | |
| tenant | No | Only nodes of this tenant (defaults to your own) | |
| project | No | Only nodes in this project | |
| read_only | Yes | Skip implicit activation of returned nodes. The query then performs no writes: no decay_score change, no last_activated or session_activated update. For read-only consumers (dashboards, benchmarks) where observing must not reinforce. Send a JSON boolean or the literal string "true"; any other string coerces to false and the query will write. | |
| spread_hops | Yes | Hops for spreading (clamped 1-3) | |
| include_edges | Yes | Include edges between result nodes | |
| spread_factor | Yes | Decay factor per hop | |
| include_related | Yes | Include directly related nodes | |
| neighbors_limit | Yes | Max neighbors per node | |
| include_neighbors | Yes | Include neighbor references per node | |
| activation_threshold | Yes | Min activation to include |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The critical disclosure is that this is not a pure read: with an active session, returned nodes are reactivated and their decay score boosted, while node content is unchanged. That explains why annotations carry readOnlyHint=false with idempotentHint=false, which the description reinforces rather than contradicts. It stops short of stating the exact write fields (last_activated, session_activated), which only the schema covers.
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 tightly packed sentences that front-load the search purpose, then escalation guidance, then the side-effect warning. Every sentence earns its place; only the parenthetical could be trimmed slightly.
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 16-parameter tool with no output schema, the description covers the query modes, ranking, spreading activation, and the non-obvious write side effect. Minor gaps remain around the edge/neighbor inclusion flags and the limit, but those are fully specified in the schema, so an agent has what it needs to 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?
Schema description coverage is 100%, so every parameter is already documented, including the read_only string-coercion caveat and enum values. The description adds conceptual meaning for spread and read_only but says nothing about the other 14 parameters, so it only marginally exceeds the schema baseline.
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 ('Search knowledge'), names the retrieval modes (semantic similarity, type, status, recency) and the return ('nodes ranked by relevance'). This is unambiguously the read/query tool among siblings like kg_node_create, kg_node_update, and kg_relate.
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 concrete conditional guidance: 'Use spread=true to find related nodes via spreading activation' and 'pass read_only=true to search without changing anything.' It lacks explicit when-not-to-use direction versus siblings (e.g., kg_meta_model), but the situational guidance for the two tricky flags is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kg_relateRelate KnowledgeAInspect
Create a relationship between two knowledge nodes, or reinforce it if it already exists (the edge weight increases). Both nodes are reactivated (their decay scores are boosted). Requires an active session; limited to 100 edges per session.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target node ID | |
| from | Yes | Source node ID (e.g., "node:abc123") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag non-read-only, non-idempotent, non-destructive; the description adds real behavior: existing edges gain weight rather than duplicating, both endpoint nodes get their decay scores boosted, and a session must be active with a 100-edge cap. These are side effects and limits the agent could not infer from structured fields, and the reinforcing-weight behavior is consistent with idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and its upsert semantics, then side effects, then constraints. Nothing redundant and nothing padding.
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 two-parameter mutation tool, the description covers side effects, session requirement, and quota, which is most of what an agent needs. With no output schema, it leaves the return value (what the created/reinforced edge looks like) unspecified, a minor but real gap.
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% and both parameters are documented in the schema, including the 'node:abc123' ID format example. The description only implies directionality ('between two knowledge nodes') without adding format or ordering semantics beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a relationship between two knowledge nodes') plus the upsert variant ('reinforce it if it already exists'). The edge-between-nodes framing cleanly separates it from sibling node tools like kg_node_create and kg_node_update without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a hard precondition ('Requires an active session') and a quota ('limited to 100 edges per session'), which directly shape when the call can be made. It does not name alternatives (e.g., kg_node_create for the nodes themselves) or state when not to use it, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kg_session_endEnd SessionAInspect
End the current session. Nodes and edges are kept; a new session must be started before further writes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-destructive, non-read-only, non-idempotent. The description adds genuinely useful context beyond them: persisted data survives the end, and subsequent writes are blocked until a new session starts. Missing: behavior when no session is active or whether repeated calls error.
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 short sentences, action first, consequence second. No filler and nothing important buried.
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-param lifecycle tool with annotations covering safety hints and no output schema, this is nearly complete: it tells the agent what survives and what becomes unavailable. Only edge-case behavior (calling without an active session, idempotency of repeated ends) is unstated.
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; there is no parameter semantics to explain, and the description correctly avoids inventing any.
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 ('End the current session') and clarifies consequences (nodes/edges kept). It does not name the sibling kg_session_start as the counterpart, but the start/end pairing makes the distinction obvious.
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?
Implies the right moment (when finished writing) and states the prerequisite for continuing work: a new session must be started before further writes. It lacks an explicit 'when not to use' or a named alternative, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kg_session_infoGet Session InfoARead-onlyIdempotentInspect
Get details of the current session (number, start time, project, notes) and node counts by type. Read-only.
| 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 'Read-only' in the description is mostly repetition. What the description does add is the scope of what is retrieved (session metadata plus node counts by type), which helps an agent anticipate the read's breadth, though return format and aggregation detail remain unstated.
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 short sentences, with the resource and returned fields front-loaded. The trailing 'Read-only' duplicates the annotations and is the one non-earning fragment.
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 returns and does so at a high level (session fields and node counts by type), enough for an agent to decide to call it. It could note behavior when no session is active, which keeps it from a 5.
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, which is the baseline-4 case; there is nothing for the description to disambiguate beyond confirming it operates on the implicit current session.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Get details of the current session') and enumerates the returned fields (number, start time, project, notes) plus node counts by type. It does not explicitly contrast with siblings like kg_status or kg_meta_model, so it falls short of a 5.
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?
'current session' implies the context in which it applies, but the description never states when to use it instead of kg_status or kg_meta_model, nor any prerequisites such as an active session. Usage is only inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kg_session_startStart SessionAInspect
Start a new working-memory session. Required before creating nodes or edges. Applies decay to the usage-based scores of existing nodes (node content is not changed), and can optionally create the named project (plus the default workspace records on first use) if it does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Session notes | |
| project | No | Project to scope the session to | |
| create_project | Yes | Create the project if it does not exist |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses side effects not captured by annotations: decay applied to usage-based scores of existing nodes (while content is unchanged) and optional creation of the project plus default workspace records on first use. This is exactly the mutation context the false destructiveHint cannot convey.
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 tight sentences, front-loaded with the primary action and precondition, then side effects. No wasted 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?
Covers preconditions, side effects, and project creation for a 3-param tool with annotations. Minor gap: with no output schema, it doesn't indicate what a started session returns (e.g., a session handle), which would help the agent use 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?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema for create_project — explaining it creates the project and default workspace records on first use. Notes and project params rely on 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 ('Start') and resource ('working-memory session'), plus the key precondition that it's required before creating nodes or edges. Distinct from siblings like kg_session_end and kg_session_info.
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?
'Required before creating nodes or edges' gives clear when-to-use context. It doesn't explicitly name alternatives like kg_session_end, but the precondition makes the selection obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kg_statusGet StatusARead-onlyIdempotentInspect
Get an overview of current working memory: open todos and problems, recent decisions and approaches, node count, and active session info. Read-only. Optionally filter by project.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Only count and list nodes in this project |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so 'Read-only' is largely redundant. The description does add real value beyond annotations by disclosing the shape of the payload (todos, problems, recent decisions, node count, session info), which is not derivable from any structured field.
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 payload contents are front-loaded in the first sentence, which is the right ordering. The standalone 'Read-only.' sentence restates an annotation and is the one piece of avoidable 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 one optional parameter, rich annotations, and no output schema, the description does the heavy lifting by describing what the status snapshot contains. The remaining gap is the lack of any note on how it relates to kg_session_info, whose scope it partially overlaps.
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% and the single project parameter is already documented as 'Only count and list nodes in this project'. The description adds only that the filter is optional, matching the schema's non-required status — correct but minimal, 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?
Names a specific verb (get) and resource (working memory status), then enumerates exactly what the overview contains: todos, problems, decisions, approaches, node count, session info. It does not distinguish itself from the overlapping kg_session_info sibling, which also returns session information, so an agent must infer the boundary.
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?
'Optionally filter by project' is the only usage guidance given; there is no statement of when to prefer this over kg_query or kg_session_info. The intent (a dashboard-style snapshot) is implied by the enumerated contents but never stated as a when-to-use rule.
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.
9 tool updates
v0.1.0- First observed
kg_meta_model - First observed
kg_node_create - First observed
kg_node_update - First observed
kg_query - First observed
kg_relate - First observed
kg_session_end - First observed
kg_session_info - First observed
kg_session_start - First observed
kg_status
TDQS
Scored across 9 tools
Most tools target clearly distinct operations: node create/update/query, edge relate, and session lifecycle. The main overlap is between kg_status and kg_session_info, both of which report session information, and kg_query's optional reactivation side effect could be mistaken for a pure read. Descriptions do enough to separate them, but the boundaries are not perfectly crisp.
All tools share a consistent kg_ prefix, and action tools follow a predictable verb_noun pattern (kg_node_create, kg_node_update, kg_session_start, kg_relate). A few tools are noun-oriented labels (kg_status, kg_session_info, kg_meta_model), which is a minor deviation but still readable and coherent.
Nine tools is well-scoped for a knowledge-graph memory server, covering nodes, relationships, sessions, status, and meta-model access without obvious padding. Each tool appears to earn its place.
The set covers creation, update, search, and relationship creation for knowledge nodes, plus session lifecycle. However, there is no explicit deletion or forgetting operation for nodes or edges, and no direct node retrieval beyond query. These are notable gaps for a knowledge-graph domain where cleanup and precise retrieval matter.
Maintenance
Related MCP Connectors
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
Personal knowledge graph as an AI memory layer over MCP - read, save, and link your memories.
Persistent, portable memory for AI assistants — your private memory graph, from any MCP client.
Persistent AI memory shared across Claude, ChatGPT, coding agents, and compatible MCP clients.
Related MCP Servers
AlicenseAqualityCmaintenanceSelf-hosted Mem0 MCP server integrating Qdrant, Neo4j, and Ollama for semantic memory search, graph entity relationships, and memory management via OpenMemory API.64MIT- AlicenseAqualityAmaintenanceProvides persistent, graph-based memory for AI agents via MCP, enabling semantic search, wikilink traversal, reminders, and injection protection.934Apache 2.0
- AlicenseCqualityAmaintenanceProvides AI agents with a human-inspired memory layer via MCP, enabling episodic and semantic memory recall, forgetting curves, consolidation, and contradiction detection. It integrates with MCP clients to offer local-first, dependency-free memory management.981MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI coding agents and IDEs to capture conversations, extract structured knowledge into a queryable graph database, and recall past decisions, patterns, files, and errors across all projects and workspaces. Provides persistent memory tools for saving, searching, and cleaning up knowledge via MCP.2-