zme-mcp
Click 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., "@zme-mcprecall why we chose Supabase"
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.
zme-mcp
Zeug Memory Engine as an MCP server. Hybrid retrieval (vector + lexical, RRF-fused) and a bitemporal knowledge graph over Zeug's collected knowledge — 15k+ chunks of research, notes, articles and transcripts — exposed to any MCP client: Claude, Cursor, Codex, Hermes, and ChatGPT (deep research + company knowledge compatible).
Measured on the Zeug corpus: hybrid R@5 0.800 · MRR 0.562 · source-recall@10 0.900 — +18.1% MRR over vector-only.
Tools
Tool | What it does | Write? |
| One query string → | no |
|
| no |
| Zeug's own notes/analysis/research only — "why did we decide X" | no |
| Causal chain between two knowledge-graph entities | no |
| Facts around one entity, with evidence quotes | no |
| Record a durable note (pitfall, decision, incident). The only write path — backed by a | creates one note |
Related MCP server: LLM Second Brain
Authentication — the zeuglab → ClawPanel auth model (alpha)
This server is the alpha ring of the ecosystem auth design:
Ring | Where | Auth |
alpha | zeuglab ecosystem (this server) | OAuth 2.1 + optional legacy token |
beta | ClawPanel | OAuth only; stores move from memory to Postgres |
prod | ClawPanel multi-tenant | OAuth + per-profile labels, RLS-backed |
OAuth 2.1, self-contained (no external IdP): DCR, PKCE, authorization codes,
refresh tokens, revocation — the full flow ChatGPT performs. /authorize shows a
zeuglab login form; profiles are configured server-side:
ZME_AUTH=oauth
ZME_BASE_URL=https://zme-mcp.fly.dev
ZME_OAUTH_PROFILES='{"alex":{"secret":"…","level":"owner"},
"guest":{"secret":"…","level":"viewer"}}'Profile levels → scopes: owner/operator get zme:read + zme:write;
viewer gets zme:read. The server forces scopes from the profile — client
requests are never trusted. A viewer's tools/list doesn't even contain
remember. In beta the in-memory stores become tables and passphrases become
Supabase sessions; the scope contract stays identical, so alpha clients keep working.
Legacy token mode (ZME_AUTH=token + ZME_MCP_TOKEN) still works in the alpha
ring for stdio-style clients that can't do OAuth; it is a startup error from
ring beta onwards.
Configuration
Variable | Required | Purpose |
| yes | Supabase key for the ZME project. The anon key is enough (SELECT-only + |
| no | Defaults to Zeug's own memory project. Point at another ZME deployment (e.g. a ClawPanel tenant DB) to serve that instead. |
| no | Enables the vector arm of hybrid search. Without it, everything still works in lexical mode (which is the arm that catches exact identifiers). |
| no |
|
| oauth | JSON map of profile name → |
| oauth | Public URL of the server (for OAuth metadata + redirects). |
| no |
|
| token mode | Shared bearer for the HTTP endpoint. |
On macOS, keys are also auto-resolved from the NoxKey keychain (one Touch ID prompt per session) when the env vars are absent.
Install & run — local agents (stdio)
No install needed with uv (any machine with Python):
uvx --from git+https://github.com/Sidarau/zme-mcp zme-mcpor pipx: pipx install git+https://github.com/Sidarau/zme-mcp ·
PyPI (uvx zme-mcp) once the package is published there.
Claude Code — claude mcp add zme -- uvx --from git+https://github.com/Sidarau/zme-mcp zme-mcp
Claude Desktop / Cursor (mcpServers JSON):
{
"zme": {
"command": "uvx",
"args": ["--from", "git+https://github.com/Sidarau/zme-mcp", "zme-mcp"],
"env": { "ZME_SUPABASE_KEY": "…", "NVIDIA_API_KEY": "…" }
}
}Run as a service (HTTP) — for ChatGPT
zme-mcp --http --host 0.0.0.0 --port 8000
# streamable HTTP endpoint: POST /mcp · health: GET /healthzConnect from ChatGPT (OAuth)
Server is live at
https://zme-mcp.fly.dev(this repo shipsDockerfile+fly.toml:flyctl deploy).In ChatGPT: Settings → Security and login → Developer mode → on.
Go to chatgpt.com/plugins → + → enter
https://zme-mcp.fly.dev/mcp.ChatGPT discovers the OAuth metadata, registers itself via DCR, and opens the zeuglab login form — sign in with your profile (
alex+ passphrase). The token it gets back carries your level's scopes.Use it in chat — and in deep research, where the
search/fetchpair makes ZME a citable knowledge source.
Security model
Read path is plain
SELECTthrough PostgREST with whatever key you configure — use the anon key anywhere shared.The only write is
remember, which callszme_remember(): aSECURITY DEFINERfunction whose entire capability is "create one note". No UPDATE, no DELETE, no schema access.The HTTP layer never logs keys; the token is compared, not echoed.
Client workspaces (ZEUG-795)
Each cmd.zeuglab.com project can get its own memory on omarchy ZME, separate from Zeug's memory and from every other client. The MCP endpoint that serves them is ZEUG-796; this is the database layer and an admin CLI.
Layout. Project ecis lives in schema ws_ecis (hyphens become underscores) with sources and chunks tables, the same hybrid search as ZME (HNSW cosine + RUM lexical, fused with RRF), and two roles: zme_ws_ecis_read and zme_ws_ecis_write (add-only: no update, no delete). Control functions live in schema zme_ws, which PostgREST does not expose.
Two locks.
Privileges. Only a workspace's own roles can use its schema. No workspace role holds any privilege on Zeug's memory in
public, on pg_net, or on another workspace.Row-level security, forced, keyed to the workspace the session declares (
zme.workspace). A wrongly granted role still sees no rows unless the session also declares that workspace.
Services do not log in as workspace roles. cmd (and, later, the MCP server in ZEUG-796) call the narrow API in migrations/003_cmd_gateway.sql: one call names one workspace and one level, and the database keeps it inside that workspace. zme_ws_gateway is reserved and holds no memberships. The CLI and Workspaces in src/zme_mcp/workspace.py connect as postgres for administration: per call they switch to one workspace role (set local role) and declare that workspace (set_config('zme.workspace', …, true)).
Trust boundary. cmd is the authority on who is on which project. A leaked cmd key or a compromised cmd reaches client workspaces at the levels cmd could use, never Zeug's memory.
Setup and checks (as postgres unless noted):
psql "$ZME_DB" -f migrations/001_workspaces.sql # idempotent; re-run after changing provision()
psql "$ZME_DB_SUPERUSER" -f migrations/002_net_hardening.sql # once, as supabase_admin
psql "$ZME_DB" -f migrations/003_cmd_gateway.sql # cmd gateway (zme_ws_caller); idempotent
psql "$ZME_DB" -X -v ON_ERROR_STOP=1 -f tests/workspace_isolation.sql # 59 checks, rolls back; exits non-zero on any failureCLI (ZME_WS_DSN is a libpq string; the password is injected per call):
export ZME_WS_DSN="host=100.118.214.24 port=54322 dbname=postgres user=postgres sslmode=disable"
zk() { ~/.local/bin/zeug-key run PGPASSWORD=zeuglab/zme/DB_PASSWORD -- python3 scripts/zme_ws.py "$@"; }
zk create ecis --title "ECIS"
zk add ecis --file kickoff.md --as alex@zeuglab.com
zk search ecis "who owns the Xactimate export"
zk copy ecis <zeug-source-id> # owner copies one Zeug source in, vectors included
zk drop ecis --confirm ecis # deletes the workspace and everything in itNotes are chunked and embedded on write (ollama snowflake-arctic-embed:335m, the arctic-l space Zeug's memory uses), so they are searchable as soon as add returns. Without an embedding service, notes are stored without vectors and search uses the lexical arm.
cmd.zeuglab.com reaches workspaces through the public ZME front door (PostgREST) with one JWT for role zme_ws_caller (migrations/003_cmd_gateway.sql, Zeug Keys zeuglab/zeug-cmd/ZME_WS_JWT, minted with the PostgREST secret, valid a year). That role can execute public.zme_ws_call (status, search, sources, fetch, add) and public.zme_ws_setup and nothing else; cmd passes the project, the access level and the person's email. Notes added from cmd have no vectors until zme_ws.py embed-pending runs on the tailnet; until then they are found by the lexical arm.
Every role can read the catalog (table names, function bodies), so never put a secret in a function body.
Sharing from Zeug's memory (explicit only). Zeug's memory is internal by default; nothing reaches a client workspace unless someone runs share for named sources and a named project:
zk share ecis <zeug-source-id> ... --as alex@zeuglab.com # dry run: flags per source, nothing written
zk share ecis <ids> --redact ID --accept ID2 --preview --as alex@zeuglab.com # every outgoing field + a digest per source
zk share ecis <ids> --redact ID --accept ID2 --publish --approve ID=<digest> ID2=<digest> [--mask WORD ...] [--title ID=New title] --as alex@zeuglab.com
zk shares ecis # audit: what was shared, how, by whomEach source is read once into a snapshot; that snapshot is what is scanned (title, text, and every chunk's content, prefix and heading) and what is published, in one transaction with its audit row. A source already shared into the workspace is skipped. The scan (src/zme_mcp/share.py, regression cases in tests/test_share.py) flags other clients' names, negotiating positions, ownership and Zeug-finance talk, assessments of people, personal data, secrets and access codes, contact details and local paths. A run that asked to publish exits non-zero if any named source was refused or held. Nothing publishes on a clean scan: each source must be named in --accept (copied as is, vectors included) or --redact, and approved with the digest its preview printed. A payload that changed after its preview is refused. Redacting replaces spans with a known extent (tokens, emails, phone numbers, paths, masked literals, parenthesised access codes) in place and drops every other flagged line, including credential assignments, then re-chunks and re-embeds. A flagged title needs --title. URLs cross only as plain http(s) without credentials, query or fragment. Every publish is recorded in zme_ws.shares. --preview prints every outgoing field: URL, type, title, text, and each chunk's heading, prefix and content. The scan is a tripwire, not a judge: read what you publish.
Development
Quick project references
Owner tooling: scripts/zme-project sync, scripts/zme-project alias oc opencollective, then
scripts/zme-project ref @oc or scripts/zme-project search @oc 'question'.
New collaborator notes use a local draft, full preview and explicit digest approval before publishing.
See the project memory workflow for setup, limits and collaborator connections.
Offline checks: python3 -m unittest discover -s tests -p 'test_project*.py' and python3 tests/test_share.py.
python3 -m venv .venv && .venv/bin/pip install -e .
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"x","version":"0"}}}' | .venv/bin/zme-mcpAvailable Tools
6 toolsfetchARead-onlyIdempotent
Fetch the full content of one search result by its id (a chunk UUID returned by search).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds the useful context that the id is a chunk UUID from search and that full content is returned, but it does not disclose other traits like error behavior or pagination. This is adequate given the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. It efficiently conveys the action, target, and key parameter context.
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 only one parameter, an output schema, and strong annotations, the description covers the essential workflow (post-search retrieval by id). It could mention edge cases or prerequisites, but the simplicity and structured data make it reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It does by explaining that the 'id' parameter is a chunk UUID returned by search, giving semantic meaning beyond the schema's bare 'string' type. This is sufficient for a single parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') and identifies the exact resource ('full content of one search result') and the id's origin ('chunk UUID returned by search'). This clearly differentiates it from sibling tools like search and recall.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'returned by search' implies the intended workflow: perform a search first, then use fetch with a result id. This provides clear context, though it does not explicitly state when *not* to use the tool or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nearBRead-onlyIdempotent
Facts around one entity in the knowledge graph, with evidence quotes.
| Name | Required | Description | Default |
|---|---|---|---|
| hops | No | ||
| entity | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent behavior. The description adds the useful detail that evidence quotes are included, but does not explain how the 'hops' parameter affects traversal or mention any other behavioral caveats. This is adequate but not rich.
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 one-sentence description is extremely concise and front-loaded, containing no fluff. While it sacrifices detail, it is perfectly sized for a simple tool description.
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?
Despite the output schema, the description is incomplete: it omits the meaning of 'hops', provides no context for when to use the tool, and does not clarify its relationship to sibling tools. A brief usage example or parameter explanation would make it more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate. It implies 'entity' is the target entity, but 'hops' is entirely unexplained. This is a significant gap for a knowledge graph traversal tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly indicates the tool returns facts about a single entity, with evidence quotes. It identifies the resource (knowledge graph) and scope (one entity), but uses no explicit verb and does not explicitly differentiate from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus search, fetch, recall, why, or remember. The description only says what it does, leaving the agent to infer its place among alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallARead-onlyIdempotent
Recall what Zeug itself wrote down — notes, analysis, compiled research. Use this (not search) for 'why did we decide X' questions. Set wide=true to also include articles and social posts.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | ||
| wide | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, and idempotent behavior, so the description need not repeat that. It adds valuable context about content scope (notes, analysis, compiled research, and wider articles/social posts with wide=true). It doesn't detail return format, but an output schema exists, so that is covered elsewhere.
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 concise sentences deliver purpose, usage context, and parameter guidance without any fluff. The description is front-loaded and each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple retrieval tool with annotations and an output schema, the description covers the primary use case and content scope. However, it omits the 'k' parameter and does not mention alternative siblings other than 'search', leaving some ambiguity for distinguishing from tools like 'remember' or 'why'. Overall adequate but with clear gaps.
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 0%, so the description must carry the burden of explaining parameters. It only explains 'wide' (broaden to articles/social posts), but does not describe 'query' or 'k'. The meaning of 'query' is implicit, but 'k' (result count) is left unexplained, which is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool recalls Zeug's internal writings (notes, analysis, compiled research) and explicitly contrasts this with search for 'why did we decide X' questions, effectively distinguishing it from a key sibling. The verb 'Recall' and resource are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Use this (not search) for "why did we decide X" questions.' Also includes a parameter-based guidance ('Set wide=true to also include articles and social posts'). This is clear and actionable for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rememberA
Record a durable fact — a pitfall, decision, or incident — so it survives the session. Becomes searchable after the next ingest run. Never store secrets. Requires the zme:write scope in OAuth mode.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| agent | No | zme-mcp | |
| title | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (all false, providing no safety profile), the description discloses meaningful behavior: the fact survives the session, becomes searchable only after the next ingest run (eventual consistency), and requires OAuth zme:write scope. It also adds a security rule (never store secrets). This is rich, non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each adding distinct value: what it records, when it becomes searchable, and security/auth constraints. No redundant wording, and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 scalar params) and the presence of an output schema, the description covers all essential aspects: purpose, durability, indexing behavior, security caveat, and auth requirement. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain any of the three parameters. The text parameter is somewhat inferable from 'Record a durable fact,' but agent and title have no semantic guidance, so the description fails to compensate for the schema's lack of detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses 'Record a durable fact' — a specific verb and resource — and clearly distinguishes this write tool from the retrieval siblings (search, fetch, near, recall, why). The types of facts (pitfall, decision, incident) further refine the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context for when to use the tool (recording durable facts rather than ephemeral ones) and includes important constraints (never store secrets, requires zme:write scope). It does not explicitly name an alternative for retrieval, but the mention of searchability after ingest implies that search is for later use, which is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchARead-onlyIdempotent
Search Zeug's knowledge base. Returns {results: [{id, title, url}]} — call fetch(id) for full content. Natural-language questions work best.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds value by disclosing the return format ({results: [{id, title, url}]}) and that only summaries are returned, implying the need for a separate fetch call. This is useful behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: the first states purpose and return format, the second gives a usage tip and directs to fetch. Every word earns its place; no filler or repetition of schema/annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple search tool with one parameter and an output schema, the description is complete. It covers what the tool does, what it returns, how to proceed for more detail, and how to formulate queries. No essential guidance is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines 'query' as a string with no description (0% coverage). The description compensates by stating 'Natural-language questions work best', implying the query is a natural-language search phrase rather than a structured keyword. This gives meaningful semantic guidance absent from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Search Zeug's knowledge base' with a specific resource. It also distinguishes from siblings by noting that results are summaries and that 'call fetch(id) for full content' — a direct pointer to the appropriate sibling.
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 clear context: use this to search, then use fetch for full content. It also advises that natural-language questions work best, which guides how to phrase the query. However, it does not explicitly mention when not to use it or compare with other siblings like near/recall/why.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whyARead-onlyIdempotent
Causal chain between two entities in the knowledge graph, e.g. why('kimi CLI 0.27.0', 'loop.ts CLI_COMMANDS fix'). Use canonical names.
| Name | Required | Description | Default |
|---|---|---|---|
| max_hops | No | ||
| to_entity | Yes | ||
| from_entity | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds the requirement for canonical names but does not disclose behaviors like return format (though output schema exists) or handling of missing entities. Adequate disclosure for a safe, read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, with a useful example and clear instruction. Every word contributes to understanding, and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema and annotations, but the description omits semantics for the optional max_hops parameter and lacks explicit guidance on when to use 'why' versus siblings. The example is helpful but the overall picture is incomplete for a three-parameter tool.
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 0%, and the description only clarifies from_entity and to_entity via the example. The max_hops parameter is completely unaddressed, leaving its purpose and effect undocumented. This is a notable gap given the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a causal chain between two entities in the knowledge graph, with a concrete example. This distinguishes it from sibling tools like search or fetch by focusing on causal relationships.
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 instruction to use canonical names is explicit and aids correct invocation. The example demonstrates the intended argument order. However, it does not explicitly state when to use 'why' over siblings or mention any exclusions, but the context is clear enough.
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.
6 tool updates
v1.1.0- First observed
fetch - First observed
near - First observed
recall - First observed
remember - First observed
search - First observed
why
TDQS
Scored across 6 tools
Each tool targets a distinct operation: search is for broad knowledge base lookup, recall is specifically for Zeug's own notes, near and why explore the knowledge graph from different angles (neighborhood vs. causal paths), fetch retrieves full content for search hits, and remember writes new facts. Minor overlap exists between search and recall, but the descriptions clearly partition them.
All tool names are single lowercase words, giving a clean, consistent visual style. However, the names mix verbs (search, fetch, recall, remember) with non-verbs (near, why), which slightly weakens the semantic consistency of the naming convention.
With 6 tools, the set is well-scoped for a knowledge management server. Each tool addresses a distinct need (lookup, detail retrieval, graph exploration, self-notes, causal analysis, and memory writing), with no apparent redundancy.
The main workflows are covered: searching and retrieving content, exploring entity relations, recalling internal notes, tracing causality, and recording durable facts. Missing capabilities like updating or deleting existing facts are minor and don't block primary use cases.
Maintenance
Related MCP Connectors
Private persistent memory for Claude, ChatGPT & Gemini via MCP - semantic search, zero-code setup.
MCP-native notes and memory for ChatGPT, Claude, and other AI tools.
- TaprootOAuthcom.taproothq
Persistent memory layer for AI tools. Save and recall notes across Claude and other MCP clients.
Persistent personal memory for AI assistants — save, search, and recall across every MCP client.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI tools to query a user's private, locally stored memories (notes, documents) with source citations, using the MCP protocol.29 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables LLM clients to read, search, create, update, and delete notes in a self-hosted shared memory bank over MCP, using hybrid vector and full-text search with optional summarization.4MIT
- AlicenseAqualityAmaintenanceEnables personal AI memory management through MCP tools for adding, searching, exporting, and deleting memories, with knowledge-graph retrieval and multi-hop association for clients like Claude Desktop and Cursor.61Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to share persistent, self-improving memory by ingesting, classifying, synthesizing, and retrieving knowledge from Obsidian vaults, code, documents, transcripts, bookmarks, and sessions through MCP and REST interfaces with token-optimized search.14 npmMIT