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: Cairn
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.
Development
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
- AlicenseAqualityAmaintenanceProvides persistent, searchable structured memory management for AI agents, with keyword matching, bidirectional Zettelkasten sync, and six MCP tools.6MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI tools to query a user's private, locally stored memories (notes, documents) with source citations, using the MCP protocol.10 npmMIT
- AlicenseAqualityBmaintenanceProvides persistent, multi-tenant knowledge graph memory for MCP-capable AI tools, allowing them to recall and store entities, observations, and relations across sessions with keyword search.1033 npm3MIT
- AlicenseAqualityBmaintenanceProvides cross-session persistent memory for coding agents via MCP tools to store, retrieve, and manage notes with hybrid keyword/semantic search and automatic deduplication.8211 npmMIT