Graph-Memory
Graph-Memory is an MCP server for a Neo4j-backed personal knowledge graph that lets Claude query, write, maintain, and audit weighted, bi-temporal, semantically searchable memory.
Query entities by canonical name, browse/search the entity catalog, and traverse relationships with filters for type, weight, current facts, and project context.
Run semantic natural-language searches using local embeddings, expand into graph neighborhoods, and build session context bundles.
Create or strengthen entities and relationships in single or atomic batch mode, with aliases, provenance, weights, evidence, and validity dates.
Confirm or correct recalled facts by boosting/weakening edges, or delete erroneous entities.
Detect contradictions and knowledge communities, surface duplicate merge suggestions, and merge or unmerge entities.
Maintain graph health with decay previews/application, pruning, validation, embedding regeneration, and stats dashboards.
Export JSONL backups, ingest documents for asynchronous extraction, and read/parse Claude Code transcripts.
Record structured dream/audit events and run admin-only read-only Cypher queries for custom analysis.
Support OAuth-secured multi-device use across Claude Code, Claude Desktop, and claude.ai web in the documented deployment.
Uses Neo4j as the graph database to store and query entities, relationships, embeddings, and metadata for the knowledge graph.
Graph Memory
A personal knowledge graph for Claude that survives across sessions, devices, and tools. Built on Neo4j with semantic embeddings, OAuth-secured for use from Claude Code, Claude Desktop, and claude.ai web — all hitting the same graph.
https://github.com/user-attachments/assets/826e5f5a-5759-4b31-83dd-6bd7e0e044b8
Asked from my phone. Pulls a decision made days ago on my laptop, citing the commit hash.
No external API keys or per-token costs by default. Entity extraction runs inside your Claude sessions on your Claude plan. Embedding runs locally via bge-small-en. Everything stays on your hardware unless you choose to expose it. If you'd rather pay per token, an optional runner moves the nightly dream and weekly maintenance to an Anthropic API key (see API-key runner).
Why a graph
Built-in memory in Claude Code is "append facts to markdown, grep later." That gets you 80% there but breaks at scale: no relationships, no confidence, no decay, no contradiction detection, no temporal awareness. Two memories that reinforce each other look identical to two memories that contradict each other.
This project replaces flat keyword matching with weighted, relationship-aware retrieval:
Weighted edges with configurable decay — frequently-confirmed knowledge stays strong; stale information fades naturally on per-type half-lives (preferences ~693 days, events ~99 days)
Bi-temporal validity — separate
valid_at(when fact was true),invalid_at(when superseded),ingested_at(when learned). Old facts get marked invalid rather than deletedSemantic + structural search — vector embeddings find conceptually similar entities; graph traversal then expands through real relationships
Project-context affinity — when you're working in a specific project, related entities surface first
Contradiction detection — conflicting facts are flagged, not silently coexisting
Full provenance — every edge traces back to the conversation, transcript, or document that sourced it
Dream process — a scheduled Claude session reviews recent transcripts and ingest documents overnight, extracts new knowledge, applies decay, and writes a changelog
Related MCP server: mem0-mcp-selfhosted
Architecture
Claude Code Claude Desktop claude.ai web
│ │ │
└────────── OAuth 2.1 Bearer ─────────┘
│
https://your-host.example/mcp
│
Cloudflare Tunnel
│
docker-compose
┌────────────┴────────────┐
▼ ▼
graph-memory-mcp graph-memory-neo4j
(Node 22 + jose) (Neo4j 5.20 + APOC)
port 3847 bolt://neo4j:7687
│ │
└─── bolt-internal ───────┘Two Docker services, talking over the compose network (plus an optional third, graph-dream, covered below). The MCP server is the only thing that touches Neo4j directly — it implements OAuth 2.1 itself (RS256 JWTs, public clients with PKCE-S256, RFC 7591 dynamic client registration, RFC 7009 revocation), validates bearer tokens for /mcp calls, and exposes Cloudflare Access only on /oauth/authorize for the actual user login. The Neo4j instance has no external listeners.
The dream process is just another Claude session that runs on a schedule, reads transcripts, and calls the same MCP tools any client would call — there's no separate extraction pipeline.
By default that session is a Claude Code scheduled task on your Claude plan. If you'd rather bill it to an Anthropic API key, the optional dream runner (src/dream-runner/, the graph-dream compose service under the dream profile) runs the same nightly and weekly prompts through the Messages API, with a per-run cost cap and an email summary of each run's cost. The same runner can run your other scheduled prompts on the host with only the commands, URLs and MCP tools you allow (dist/dream-runner/task.js). See API-key runner.
Two more opt-in pieces use TypeSafe's Jev, a model that returns typed judgments for a fraction of a cent each. With JEV_VERB_SELECT=on, an edge that would be stored as RELATED_TO gets a documented verb when Jev is confident, and stays RELATED_TO otherwise. With JEV_DUPLICATE_CHECK=on, the nightly runner judges graph_merge_suggestions candidates and writes them to a log for you to review; it never merges. Both are off by default and capped on cost. See Jev judgments.
Schema
Node types (19): Person, Organization, Project, Feature, Concept, Technology, Decision, Reasoning, Preference, Event, Fact, Artifact, Object, Resource, Infrastructure, Alias, Location, Issue, Task.
Edge verbs (50): grouped into people and roles (WORKS_ON, REPORTS_TO, KNOWS, …), knowledge and decisions (PREFERS, DECIDED_FOR, LED_TO, …), tech and dependencies (USES_TECH, DEPENDS_ON, IMPLEMENTS, …), composition (PART_OF, CONTAINS, INSTANCE_OF, …), reference (ABOUT, DESCRIBES, DOCUMENTS), authorship, lifecycle (SUPERSEDES, REPLACES, BLOCKS, …), place, events, and identity (ALIAS_OF, CONTRADICTS). RELATED_TO is the fallback when no specific verb fits, with a relationship_type subtype property. Writes are checked against this vocabulary; SCHEMA_ENFORCEMENT controls whether unknown verbs are coerced (default) or rejected.
Every node and edge carries:
weight(0.0–1.0) — decays over time on per-type half-livesconfidence— separate from weight, tracks the source's certaintytenant_id— multi-tenant isolation (single-user by default; multi-user-ready via OAuth email claim)embedding(nodes) — 384-dim vector for semantic searchvalid_at/invalid_at/ingested_at(edges) — bi-temporal tracking
Concise vocabulary in GRAPH_SCHEMA.md. Full reference (weights, decay, validity windows, init Cypher) in docs/GRAPH_SCHEMA_REFERENCE.md.
Tools
The MCP server exposes 24 tools across these categories:
Category | Tools |
Query |
|
Write |
|
Maintenance |
|
Operational |
|
Slash-command wrappers (/graph, /graph-ask, /graph-find, /graph-stats, /graph-boost, /graph-briefing, /graph-dream, /graph-backup, /graph-bootstrap, /graph-capture, /ingest, /ingest-audio) install into ~/.claude/skills/. Full reference: docs/SKILLS.md.
/graph-capture is the manual companion to the nightly dream: the dream extracts knowledge from Claude Code transcripts in ~/.claude/projects/, but cannot see claude.ai web conversations or Claude Desktop chats (those live server-side or in Electron app data). Run /graph-capture at the end of a substantive claude.ai or Desktop conversation to commit any new entities, decisions, or facts to the graph. Claude Code cloud sessions are different: a collector prompt (prompts/collect-cloud-sessions.md) queues their text into the ingest backlog through graph_ingest, and the nightly dream extracts it (see Cloud sessions).
Prerequisites
Required:
Node.js 22+ and npm
Docker (Desktop on Windows/macOS, or Docker Engine on Linux) with Docker Compose v2
Claude Code and/or Claude Desktop with a Claude plan that covers Claude Code access — Pro, Max, Team, Enterprise, or Console all work (the free Claude.ai plan does not include Claude Code). Pro is fine for light/exploratory use; Max is recommended for daily-use deployments because the nightly dream process can be transcript-heavy on a busy day, and an unattended run that exhausts Pro's 5-hour window will abort mid-extraction and skip that night. Running the dream on an Anthropic API key instead avoids the plan limits.
A few hundred MB of disk for Neo4j + embeddings model
Optional:
MarkItDown (
pip install "markitdown[pdf,docx,xlsx,pptx]") — enables ingesting binary documents (.pdf,.docx,.xlsx,.pptx,.epub,.msg,.csv,.xml,.png,.jpg). Without it, ingest is limited to.md,.txt,.json,.html,.srt,.vtt.yt-dlp — convenient way to grab YouTube/web video subtitle files for ingestion.
yt-dlp --write-auto-sub --sub-lang en --skip-download <url>writes a.vttyou can drop intoingest/pending/. Not a runtime dependency; just a tool that produces files graph-memory can already eat.cloudflared + a Cloudflare account — only needed for the multi-device / claude.ai web setup described in
docs/REMOTE.md. Local-only deployments don't need it.Anthropic API key — only for the optional API-key runner.
TypeSafe API key — only for the optional Jev judgments (verb selection and the duplicate check).
Python 3.10+ — required only by MarkItDown and by
scripts/sync-dream-skill.py.
Install
graph-memory has exactly one "primary device" — the machine that runs the two Docker containers (Neo4j + the MCP server) and runs the nightly dream + weekly maintenance scheduled tasks. Every other device is a "secondary device" that talks to the primary over HTTPS + OAuth — secondaries don't run their own containers and don't run their own dream process. Pick the install path that matches the role of the device you're sitting at right now.
Install — Primary Device (this device runs the containers)
Use this on the machine that will host Neo4j + the MCP server. This is also where the nightly dream and weekly maintenance scheduled tasks run, so the Claude Code transcripts you want extracted should live on this device.
Linux / macOS / Windows with Git Bash or WSL:
curl -fsSL https://raw.githubusercontent.com/stevepridemore/graph-memory/v0.6.0/scripts/install-primary.sh \
| bash -s v0.6.0
# edit ~/graph-memory/.env (NEO4J_PASSWORD, GRAPH_MEMORY_HOME, CLAUDE_PROJECTS_DIR)
cd ~/graph-memory && docker compose up -dWindows PowerShell (no bash needed):
$v = 'v0.6.0'
iwr "https://raw.githubusercontent.com/stevepridemore/graph-memory/$v/scripts/install-primary.ps1" -UseBasicParsing -OutFile $env:TEMP\gm-install.ps1
& $env:TEMP\gm-install.ps1 -Version $v
# edit $HOME\graph-memory\.env
cd $HOME\graph-memory; docker compose up -dVerify with /graph-stats in any Claude Code session.
Optional: see docs/REMOTE.md for the Cloudflare Tunnel + Access setup that lets secondary devices and claude.ai web reach this graph remotely.
Install — Secondary Device (this device just talks to the primary)
Use this on every additional laptop, work computer, or phone. No Docker, no Neo4j — just the slash commands and an MCP client config pointed at the primary device's Cloudflare Tunnel URL. The primary device must already have the tunnel set up per docs/REMOTE.md.
Linux / macOS / Windows with Git Bash or WSL:
curl -fsSL https://raw.githubusercontent.com/stevepridemore/graph-memory/v0.6.0/scripts/install-secondary.sh \
| bash -s v0.6.0 your-tunnel-host.example.comWindows PowerShell (no bash needed):
$v = 'v0.6.0'
iwr "https://raw.githubusercontent.com/stevepridemore/graph-memory/$v/scripts/install-secondary.ps1" -UseBasicParsing -OutFile $env:TEMP\gm-install.ps1
& $env:TEMP\gm-install.ps1 -Version $v -TunnelHost your-tunnel-host.example.comFirst /graph-stats call triggers the OAuth browser flow once; subsequent calls use the cached bearer token.
Install — Developer (build from source)
Use this if you want to modify graph-memory itself. Requires Node 22+ and Docker.
git clone https://github.com/stevepridemore/graph-memory
cd graph-memory
cp .env.example .env # edit as above
npm install && npm run build
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -dThe docker-compose.dev.yml override switches the MCP service from the published GHCR image to a local build: . so your edits get picked up on rebuild.
Multi-device / claude.ai web access
To use the same graph from claude.ai web, your office laptop, your phone, etc., expose the MCP server through Cloudflare Tunnel + Access. The auth flow is OAuth 2.1 with Cloudflare's IdP doing the actual user login.
Step-by-step in docs/REMOTE.md. The setup is one-time:
Cloudflare Tunnel with
cloudflaredpointing athttps://localhost:3847A single Cloudflare Access application scoped to
/oauth/authorize(everything else is public + bearer-token-protected)Server generates an RSA keypair on first run, persists it, exposes via
/oauth/jwksClaude clients hit
https://your-host.example/mcp, get a 401 with properWWW-Authenticate: Bearer ... resource_metadata="...", walk the OAuth flow, store the bearer token, and call subsequent requests with it
This makes the graph reachable from any device or AI tool that speaks MCP + OAuth 2.1.
For Claude Code on remote machines, .mcp.json.remote.example is the matching client template — copy it to ~/.claude/.mcp.json (or a project-local .mcp.json) and replace your-host.example with your tunnel hostname:
{
"mcpServers": {
"graph-memory": {
"type": "http",
"url": "https://your-host.example/mcp"
}
}
}Claude Code walks the OAuth flow on first call and caches the bearer token. claude.ai web uses its own custom-connector UI — the URL is the same.
If you use Claude Code on more than one PC and want a single dream process to ingest transcripts from all of them, see Multi-PC transcript sharing — that's a separate concern from the OAuth multi-device story above, with a one-time sync setup.
Document ingestion
Drop files into ~/graph-memory/ingest/pending/, or call graph_ingest with a file path or, from a remote caller that can't reach the server's disk, with inline text (content + file_name, up to 2 MB). The next dream run extracts entities and relationships into the graph. Native support for .md, .txt, .json, .html, .srt, .vtt. With MarkItDown installed (pip install "markitdown[pdf,docx,xlsx,pptx]"), also handles .pdf, .docx, .xlsx, .pptx, .epub, .msg, .csv, .xml, .png, .jpg, etc. — converted to Markdown first, then extracted. Original files archive to ingest/originals/<date>/.
Privacy
The graph stores personal information — names of colleagues, decisions, preferences, project details. Treat the database with the same care as a private journal:
Default deployment is local-only (Docker on
localhost); nothing leaves your machineThe optional Cloudflare Tunnel exposure adds OAuth + Cloudflare Access in front
All data lives under a directory you control (default
~/graph-memory/)A
graph_exporttool produces portable JSONL backups;~/graph-memory/backups/is auto-rotatedEmbedding model runs locally — no text leaves the machine for vector search
Entity extraction runs in your Claude sessions; same trust boundary as Claude itself. With the optional API-key runner, transcripts go to the Anthropic API under your API account instead
API keys, passwords, and secrets are explicitly excluded from extraction (see
prompts/dream-nightly.md)
Tech stack
Component | Technology |
Language | TypeScript / Node.js 22 |
Graph DB | Neo4j Community 5.20 (Docker) with APOC |
Embedding model |
|
Driver |
|
MCP framework |
|
Auth |
|
API-key runner (optional) |
|
Typed judgments (optional) | TypeSafe Jev over HTTPS |
Tunnel (optional) | Cloudflare Tunnel ( |
Testing | Vitest |
Status
All planned phases shipped:
✅ Phase 0–3: MCP server, dream process, SessionStart hook, slash commands
✅ Phase 4: Bootstrap complete (graph populated from transcripts and memory files)
✅ Phase 5: bi-temporal modeling, Reasoning entity type, semantic/vector search, community detection, build_context meta-tool
✅ Multi-tenant infrastructure (single-user by design, multi-user-ready)
✅ OAuth 2.1 + Cloudflare Tunnel for multi-device access
✅ Aura → local Neo4j migration with full data preservation
✅ OAuth 2.1 hardening: PKCE-S256 mandatory, public clients only, RFC 7009 revocation, jti tracking, refresh-token TTL 30d, redirect-URI allowlist, optional email allowlist, body-size caps (64 KB OAuth / 4 MB MCP), structured event logging
✅ Internal threat model fully resolved (16 of 16 findings closed)
✅ npm audit clean (0 vulnerabilities)
✅ Pre-built GHCR images + curl-pipeable installers (no clone or local build required for end users)
Current release: v0.6.0.
Currently steady-state. Active development is opportunistic; the system runs unattended via the nightly dream process.
Releases
Newest first. Each tag publishes ghcr.io/stevepridemore/graph-memory-mcp:<tag> and moves :latest.
Version | Date | Summary |
2026-10-27 |
| |
2026-10-27 | Optional API-key runner: the nightly dream and weekly maintenance can run on an Anthropic API key ( | |
2026-10-11 | Security and data-integrity release. Fixes Cypher injection through relation and type names, and a | |
2026-05-17 | Rule subtype for permanent preferences, exempt from decay and pruning. | |
2026-05-10 | Curl-pipeable primary/secondary device installers + pre-built GHCR image. Multi-stage Dockerfile, auto-cert generation on first run, vendored slash commands. End users no longer need to clone or build from source. | |
2026-05-09 | STRIDE threat model fully closed (16 of 16 findings). Hardens OAuth 2.1: PKCE-S256, RFC 7009 revocation, jti tracking, refresh-token TTL, redirect-URI allowlist, email allowlist, body-size caps. | |
2026-05-09 | OAuth 2.1 security hardening pass. Public clients only, mandatory PKCE, body-size caps, structured event logging. | |
2026-05-08 | Decay correctness + test coverage. Vitest in CI, decay function bug fixes. | |
2026-05-07 | Initial public release. MCP server, dream process, slash commands, bi-temporal modeling, semantic search, OAuth multi-device. |
Documentation
docs/ARCHITECTURE.md— system design, data flows, component responsibilitiesGRAPH_SCHEMA.md— concise vocabulary (node types + edge verbs) for both agent and humansdocs/GRAPH_SCHEMA_REFERENCE.md— full reference (decay functions, weight semantics, validity windows, example queries)docs/MCP_SERVER.md— every MCP tool with input/output schemasdocs/DREAM_PROCESS.md— extraction pipeline, manifest format, changelog structure, API-key runnerdocs/BACKUP.md— backups and restoredocs/SKILLS.md— slash command definitionsdocs/REMOTE.md— exposing graph-memory via Cloudflare Tunnel + Accessdocs/MULTI_TENANT.md— tenant isolation modeldocs/TESTING.md— running the test suite locally and in CICLAUDE.md— retrieval and chat-write guidelines for Claude
License
MIT — see LICENSE.
Available Tools
24 toolsgraph_aliasGraph AliasAIdempotent
Add or remove alternate names for an entity, so future writes and lookups using those names resolve to it instead of creating a duplicate node. Use when the user says two names refer to the same person or thing: a nickname, a maiden or married name, a first name used alone. Case-insensitive. An exact entity name always takes precedence over an alias. With neither add nor remove, lists the current aliases.
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | Names to add as aliases | |
| entity | Yes | Entity name or ID to attach the aliases to | |
| remove | No | Aliases to remove |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only idempotentHint in annotations, the description carries most of the burden and does well: case-insensitive matching, exact-name precedence over aliases, and read-mode behavior when neither add nor remove is supplied. It omits conflict/failure behavior (e.g., adding an alias that collides with an existing entity name) and whether removals affect existing edges.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, purpose and effect front-loaded, then usage trigger, then behavioral caveats, then the zero-argument case. No filler and every sentence carries distinct 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?
For a 3-parameter, no-output-schema tool with full schema descriptions, this covers purpose, trigger, precedence, and the list fallback. The main gap is return-shape detail for the list mode, but the description signals that mode exists, which is the important part.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it explains that supplying neither add nor remove turns the call into a list operation and clarifies resolution precedence for the entity parameter. It does not document alias formatting limits or array size constraints.
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 (add/remove) plus resource (alternate names for an entity) and explains the effect: future writes and lookups resolve to it instead of creating a duplicate node. This clearly separates it from graph_merge/graph_unmerge siblings 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 concrete when-to-use trigger: 'when the user says two names refer to the same person or thing: a nickname, a maiden or married name, a first name used alone,' and the duplicate-avoidance rationale implicitly distinguishes it from merge. It stops short of explicitly naming the sibling alternative (e.g., graph_merge) or stating when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_auditDream Audit LogA
Append a structured event to the dream process audit log (logs/dream-audit.jsonl). Call this during the dream process to record run_start, run_end, transcript_start, transcript_end, entity_created, entity_resolved, edge_created, edge_modified, merge_flagged, contradiction_found, ingest_start, ingest_end, decay_applied, format_warning, or error events. entity_resolved is the audit trail for entity-resolution decisions during dream — every time the dream picks between matching an existing entity, creating a new one, or flagging an ambiguous candidate, log it here so a later graph_unmerge can reconstruct why a merge happened.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Event payload — fields vary by event type. Always include relevant names/IDs. | |
| event | Yes | Event type |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations present, so description carries full burden. It discloses the append-only action and log file path. However, it does not mention idempotency, concurrency behavior, or error handling (e.g., what happens on duplicate events). Adequate for a simple logging tool but could be more thorough.
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 dense sentences pack all essential info: action, target file, event types, and data guidance. No filler or 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?
For a logging tool with no output schema, the description is complete: it specifies the action, file location, event types, data expectations. All necessary context for correct invocation is present.
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 covers both parameters fully. Description adds value by explaining that data fields vary by event type and advising 'Always include relevant names/IDs,' which aids correct usage beyond schema definitions.
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?
Description clearly states the tool appends events to a specific audit log, lists 16 event types, and highlights entity_resolved's role. This specificity and verb+resource clarity distinguish it from sibling tools like graph_boost or graph_merge.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Call this during the dream process' and enumerates events. Provides context but no exclusion criteria or alternatives (e.g., when to skip logging). The description implies usage but doesn't fully guide when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_boostGraph BoostAIdempotent
Increase an edge's weight when the user confirms recalled information. Call this when the user says 'yes', 'exactly', or confirms something you retrieved from the graph. Persists immediately; weight clamps at 1.0 so repeated boosts saturate rather than overflow. Returns the previous and new weight.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Boost amount (default: 0.15) | |
| reason | No | Why boosting | |
| to_name | Yes | Target entity name or ID | |
| relation | Yes | Relationship type (e.g. WORKS_ON, PREFERS) | |
| from_name | Yes | Source entity name or ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds key behavioral details beyond annotations: immediate persistence, weight clamping at 1.0 to prevent overflow, saturation on repeated boosts, and return of previous and new weight. No contradiction with idempotentHint.
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 serving a distinct purpose: purpose, usage trigger, and behavioral details. No wasted words, front-loaded with primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, trigger, behavior, and return value. While it lacks explicit mention of error handling (e.g., missing edge), it is largely sufficient for a simple boost tool. No output schema exists, so the return info is valuable.
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% with good parameter descriptions. The tool description adds context about user confirmation and clamping but does not significantly elaborate on individual parameters beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool increases an edge's weight when the user confirms recalled information, which is a specific verb and resource. It distinguishes it from sibling tools like graph_weaken (weight decrease) and others by tying usage to user confirmation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call: when the user says 'yes', 'exactly', or confirms recalled information. However, it does not mention when not to use it or contrast with alternatives like graph_weaken for decreasing weight.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_build_contextBuild Session ContextARead-only
Single tool call that bundles a session's worth of context: graph health, pending work, last dream run summary, recent additions, top knowledge hubs, unresolved contradictions, and (optionally) a topic neighbourhood. Use this at session start instead of running graph_stats / graph_query / graph_contradictions separately. Cuts 4-5 round trips to one.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Optional topic to fetch a neighbourhood for (uses graph_query under the hood). | |
| hub_count | No | Number of top knowledge hubs to include (default 5). | |
| max_recent | No | Max recent entities to list (default 15). | |
| project_cwd | No | Optional project directory for affinity scoring on the topic neighbourhood. | |
| recent_days | No | Window in days for 'recently added' entities (default 7). | |
| include_contradictions | No | Include unresolved contradictions (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the readOnlyHint annotation by detailing the specific data included in the bundled context. However, it does not disclose any additional behavioral traits such as performance implications or return size.
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 three sentences: first states purpose, second gives usage guidance, third quantifies benefit. No redundant information, perfectly 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 complexity (6 optional parameters, no output schema), the description adequately explains what is returned. However, it lacks details on the exact format or structure of the output, which would be helpful for the agent.
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%, providing baseline value. The description adds context by explaining that parameters like topic and project_cwd are for optional neighbourhood fetching and affinity scoring, linking them to the overall bundle purpose. This adds some meaning beyond the schema's descriptions.
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 it bundles a session's worth of context, listing specific items like graph health, pending work, contradictions, etc. It also distinguishes itself from sibling tools by explicitly mentioning the individual tools it replaces (graph_stats, graph_query, graph_contradictions).
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 explicitly instructs to use the tool at session start instead of running separate tools, and quantifies the benefit as reducing round trips from 4-5 to 1. This provides clear when-to-use and alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_communitiesDetect Knowledge CommunitiesARead-only
Find clusters of densely-interconnected entities in the graph. Uses greedy seed-based BFS through edges above the weight threshold — works without GDS or APOC. Each entity is assigned to at most one community (the first that reaches it from a high-degree seed). Useful for understanding knowledge neighbourhoods (e.g. "everything related to infrastructure"). Returns {communities, coverage}. communities holds at most max_communities clusters in seed order (highest-degree seed first), each shaped {id, seed_name, seed_id, member_count, dominant_type, members: [{id, name, type}]} with at most 30 members listed; communities below min_size are left out. coverage is {total_entities, assigned, unassigned}. Use graph_query or graph_search instead when you have a specific entity to start from.
| Name | Required | Description | Default |
|---|---|---|---|
| max_hops | No | BFS depth from each seed (default 3, capped at 4). | |
| min_size | No | Minimum members for a community to be returned (default 2). | |
| max_communities | No | Maximum number of communities to return (default 10). | |
| weight_threshold | No | Only traverse edges with weight strictly greater than this (default 0.4). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds substantial context beyond that — the greedy seed-based BFS algorithm, the fact that no GDS/APOC is required, the exclusive-assignment rule (each entity joins the first community that reaches it from a high-degree seed), the hard cap of 30 listed members, and the exclusion of communities below min_size. These are exactly the behavioral traits an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and algorithm, then the return shape, then the alternative-tool routing — a sensible order. It is dense rather than padded, though the long parenthetical schema sketch of the community object is heavier than strictly necessary and could have been tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full burden of explaining returns and does so precisely: the top-level `{communities, coverage}` shape, each community's fields, the 30-member truncation, and the `{total_entities, assigned, unassigned}` coverage counters. Nothing an agent needs to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains that communities come back 'in seed order (highest-degree seed first)', that communities below min_size are dropped, and that member lists are truncated at 30 regardless of member_count. max_hops and weight_threshold are only lightly echoed beyond the schema, which keeps this short of a 5.
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 ('Find clusters of densely-interconnected entities in the graph') and immediately distinguishes itself from the traversal siblings by naming graph_query and graph_search. An agent can tell this is a whole-graph community-detection tool rather than a lookup tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete use case ('understanding knowledge neighbourhoods, e.g. everything related to infrastructure') and an explicit exclusion rule: use graph_query or graph_search when you already have a specific entity to start from. That is a clear when-to-use and when-not-to-use routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_contradictionsGraph ContradictionsARead-only
Find facts that contradict each other in the memory graph — pairs connected by a CONTRADICTS edge. Use during reviews, before a graph_decay run, or when the user asks about conflicting information. Returns {contradictions: [{node_a, node_b, description, detected_date, resolved}], count} ordered by most-recently detected. By default only unresolved pairs are surfaced; set include_resolved=true to audit historical resolutions. Resolve a contradiction by graph_weaken on the wrong edge or by graph_relate with relation=SUPERSEDES on the new fact.
| Name | Required | Description | Default |
|---|---|---|---|
| include_resolved | No | Include resolved contradictions (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark readOnlyHint=true, and description aligns by specifying it returns contradictions without mutations. Adds details on return format and default filtering of unresolved pairs.
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 well-structured sentences: purpose, usage, return format, parameter guidance. No redundant words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With simple schema (1 param, no output schema), description fully covers purpose, usage, return structure, parameter semantics, and resolution hints.
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 covers parameter with description. Description adds context: explains default behavior and when to use include_resolved=true (historical audits), building on 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?
Clearly states the tool finds contradictory facts via CONTRADICTS edges. Distinct from sibling tools like graph_audit or graph_search by focusing on contradictions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: during reviews, before graph_decay, or when user asks about conflicts. Also suggests resolution tools (graph_weaken, graph_relate) as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_cypherGraph CypherARead-only
Execute a read-only Cypher query against the memory graph. You generate the Cypher — this tool just runs it. Enforced read-only via Neo4j executeRead(). Use for custom queries not covered by other tools. Admin-only (must be the bootstrap tenant) — non-admin tenants would otherwise be able to bypass tenant filtering by writing raw Cypher.
| Name | Required | Description | Default |
|---|---|---|---|
| cypher | Yes | Cypher query to execute (read-only) | |
| params | No | Query parameters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, and the description reinforces it by stating 'Enforced read-only via Neo4j executeRead()'. Adds context about admin-only restriction and security rationale, which goes beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with 4 sentences, front-loading the core purpose. Every sentence adds value: purpose, user responsibility, read-only enforcement, admin-only restriction. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (2 parameters, no output schema), the description covers purpose, usage, constraints (admin-only), safety (read-only), and rationale. It is complete for effective selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description mentions the cypher parameter but does not add significant detail beyond the schema. The params parameter is an object, but no additional explanation is provided.
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 executes a read-only Cypher query against the memory graph, with the user generating the Cypher. It differentiates from siblings by specifying use for custom queries not covered by other 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?
Explicitly states when to use (custom queries not covered by other tools) and when not to use (admin-only bootstrap tenant). Provides rationale for the admin restriction, preventing tenant bypass. Implies alternatives by mentioning other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_decayGraph DecayADestructive
Apply time-based decay to every node confidence and edge weight using per-type half-lives (preferences ~693d, events ~99d, etc.). Called by the dream process during maintenance. Always preview with dry_run=true first — decay is irreversible without restoring from a graph_export backup. Rule-subtype nodes and edges touching them are exempt. Returns totals, not per-type counts: {nodes_decayed, edges_decayed, nodes_flagged_for_pruning} (with dry_run, edges_decayed is always 0).
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview only, don't apply changes (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although the only annotation is destructiveHint=true, the description adds the irreversibility and how to recover, the exemption for rule-subtype nodes and their edges, and a special dry_run behavior where edges_decayed is always 0. These details go well beyond what annotations disclose and directly affect how the agent calls the 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 front-loads what the tool does, then the usage warning, then the exemption, then the return shape. Every sentence carries information the agent needs, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite there being no output schema, the description gives the full return shape inline. Combined with the irreversibility warning and the exemption rule, the agent has everything it needs to call this destructive maintenance tool safely.
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?
There is only one parameter, and the schema already covers dry_run at 100%. The description reinforces its meaning with the warning to preview first and the detail that dry_run reports edges_decayed as 0, which is a meaningful behavior beyond the schema text.
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 gives a specific verb and resource: applying time-based decay to node confidence and edge weights with per-type half-lives, and it illustrates it with concrete examples (~693d for preferences, ~99d for events). That is far more specific than the name alone. However, it never explains how it relates to its close siblings graph_boost and graph_weaken, so the agent must infer which one to use.
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 states the context in which the tool runs ('called by the dream process during maintenance') and gives an explicit precondition: preview with dry_run=true first, and make a graph_export backup because decay is irreversible. This tells the agent exactly how to proceed and which related tool to use first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_deleteGraph DeleteADestructive
Permanently delete an entity node and all its edges by ID. Use for removing duplicate or erroneous nodes. Cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the annotations by explicitly stating 'Cannot be undone' and that deletion includes 'all its edges', which complements the destructiveHint annotation and informs the agent of irreversible cascade effects.
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, consisting of two short sentences that front-load the action and key constraints. Every sentence is meaningful and earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers purpose, usage context, and behavioral transparency completely. No missing information is apparent.
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 100% schema description coverage, the parameter 'id' is already well-documented in the schema. The description adds minimal extra meaning ('by ID') but does not introduce new details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('permanently delete'), the resource ('entity node and all its edges'), and specific use cases ('removing duplicate or erroneous nodes'), which distinguishes it from sibling tools like graph_merge or graph_unmerge.
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 provides a clear context for when to use the tool ('removing duplicate or erroneous nodes') but does not explicitly state when not to use it or mention alternatives, though the destructive hint implies caution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_entitiesGraph EntitiesARead-only
Browse or search the entity catalog. Use to check if an entity exists before creating one with graph_relate, or to list entities of a given type. For relationship-aware lookups (entity + its neighbors) use graph_query instead. Returns up to limit entities ordered by sort_by; pagination is single-page (raise limit if you need more).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by entity type (Person, Project, Concept, etc.) | |
| limit | No | Max results (default: 20) | |
| search | No | Full-text search query | |
| sort_by | No | Sort order (default: confidence) | confidence |
| min_confidence | No | Min confidence threshold |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark readOnlyHint=true. The description adds beyond this: 'Returns up to `limit` entities ordered by `sort_by`; pagination is single-page (raise `limit` if you need more).' This discloses return behavior and pagination constraint. No contradiction with 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?
Three sentences, each purposeful. First sentence states purpose, second gives use cases and alternatives, third explains return behavior and pagination. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description covers return behavior (up to limit entities, ordered) and pagination. Provides enough context for an agent to understand what the tool returns without needing an output schema. Minor omission: doesn't mention if count or metadata is included.
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%, baseline 3. The description adds meaning by explaining `limit` and `sort_by` behavior ('returns up to limit entities ordered by sort_by') and clarifies `search` as full-text. This slightly exceeds 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?
The description clearly states 'Browse or search the entity catalog' and gives specific use cases: checking existence before creation and listing entities by type. It distinguishes from sibling tool graph_query by explicitly stating 'For relationship-aware lookups... use graph_query 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?
Provides explicit when-to-use (checking existence before graph_relate, listing entities) and when-not-to-use (relationship-aware lookups) with a named alternative (graph_query). This gives clear guidance for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_exportExport GraphA
Export all graph nodes and edges to a timestamped JSONL backup file in the backups/ directory. Run this before any risky operation, or on a weekly schedule. Old backups are pruned automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| keep | No | Number of backup files to keep (default 14, ~2 weeks of daily backups). | |
| label | No | Optional label appended to the filename, e.g. 'pre-prune' → backup-2026-05-05-pre-prune.jsonl |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full responsibility. It discloses that the tool creates a timestamped JSONL file in the backups/ directory and that old backups are pruned automatically. It does not specify side effects on the graph itself, but 'export' implies read-only, which is acceptable.
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 three sentences long, front-loaded with the core purpose, followed by usage guidance and behavioral detail. Every sentence adds value with 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?
Given no output schema, the description adequately covers what is exported (all nodes and edges), the format (JSONL), and the destination (backups/ directory). It omits explicit mention of return values, but for a backup tool this is generally acceptable.
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 baseline is 3. The description adds no extra semantics beyond what the schema already provides for the 'keep' and 'label' parameters. It mentions timestamped filenames, but that is output-related rather than parameter-specific.
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 'Export all graph nodes and edges to a timestamped JSONL backup file', specifying the exact verb ('export') and resource ('graph nodes and edges'), which distinguishes it from sibling tools like graph_delete or graph_prune.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly recommends running 'before any risky operation, or on a weekly schedule', providing clear usage guidance. While it does not list alternatives, the context is clear enough for an agent to decide when to invoke.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_ingestGraph IngestAIdempotent
Queue a document for asynchronous extraction into the memory graph (mode='queue'), or check the ingest backlog (mode='status'). Use this when you have a file the user wants summarized into the graph but doesn't need it reflected in the same conversation — the nightly dream process picks queued documents up. For inline assertions during a conversation, call graph_relate directly instead. Idempotent: queueing the same file twice overwrites the prior copy in the pending dir. Remote callers (e.g. a cloud session collecting its own transcripts) can't name a file on this machine, so they pass content + file_name instead of file_path (admin tenant only). status also returns session_cursors: for each cloud session queued with meta.source='claude-code-cloud', the newest meta.through already queued or dreamed.
| Name | Required | Description | Default |
|---|---|---|---|
| meta | No | Optional metadata for the queued document | |
| action | Yes | queue: add file to pending. status: check queue. | |
| content | No | Document text to queue inline, for callers that can't reach the server's filesystem. Requires file_name. Admin tenant only. | |
| file_name | No | Name for inline content in the pending dir: plain basename ending .md, .txt or .json. | |
| file_path | No | Path to a file on the server to queue. For queue, give file_path or content + file_name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare idempotentHint, and the description adds substantial beyond that: async pickup by a nightly dream process, overwrite semantics on duplicate queueing, an admin-tenant restriction on inline content, and a filesystem-reachability constraint for remote callers. It also discloses what status returns (session_cursors), which the agent could not otherwise know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the primary action and mode split, then layers constraints; every sentence carries information. The closing session_cursors sentence is dense and packs several clauses, slightly reducing scannability, but it is not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does describe status output (session_cursors semantics). It stops short of describing what queue returns on success or failure, which would fully close the loop for a tool with five parameters and nested meta.
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 already 100%, so the baseline is 3; the description rises above it by explaining the rationale behind file_path versus content+file_name (remote callers can't reach the server filesystem) and the admin-tenant gating. Minor deduction because it refers to the action parameter as 'mode', which doesn't match the schema's parameter name and could momentarily confuse an agent mapping prose to fields.
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 ('Queue a document for asynchronous extraction into the memory graph') and explicitly covers the second mode ('check the ingest backlog'). The distinction between the two modes and the named sibling graph_relate makes it unambiguous against the many graph_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('file the user wants summarized into the graph but doesn't need reflected in the same conversation') and when-not-to-use with the alternative named ('For inline assertions during a conversation, call graph_relate directly instead'). Nothing is left to inference about routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_mergeGraph MergeADestructive
Consolidate two entities into one — moves source's edges onto target, adopts source properties for keys target doesn't have, then deletes source. Inverse of graph_unmerge. Use after graph_merge_suggestions surfaces a duplicate pair, or whenever you've confirmed two nodes refer to the same thing. Same-tenant only; refuses to merge an entity with itself. Edges directly between source and target are dropped (would become self-loops). When source and target both have the same edge to a third node, the edge is consolidated and the higher weight wins. Target's embedding is cleared so the next graph_reembed will re-derive it from the merged state. Logged to logs/merge-audit.jsonl with reason. DESTRUCTIVE — always preview with dry_run=true first; recovery requires a graph_export backup or graph_unmerge with the original edge layout.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why merging (logged in audit) | |
| dry_run | No | Preview only, don't apply changes (default: false) | |
| source_id | Yes | Entity ID to merge from (will be deleted) | |
| target_id | Yes | Entity ID to merge into (will absorb source) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations providing destructiveHint=true, description adds crucial details: edges between source and target dropped, edge consolidation with higher weight wins, target's embedding cleared, audit logging. No contradiction.
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?
Description is well-structured, front-loaded with key action, then details. It is slightly long but each sentence adds value.
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?
Complex tool with many behaviors; no output schema but description mentions return behavior (dry_run preview, audit logging). Covers edge cases, destructive nature, recovery. Very 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 100%, so baseline 3. Description doesn't add much beyond schema for parameters, but it does mention dry_run for preview and reason for audit. However, the description is more about behavior than parameter-level specifics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool consolidates two entities, moves edges, deletes source, and adopts properties. It clearly distinguishes from siblings like graph_unmerge (inverse) and graph_merge_suggestions (precursor).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use (after graph_merge_suggestions or confirmed duplicates), and what not to do (same-tenant only, refuses self-merge). Mentions preview with dry_run, and alternative graph_unmerge for recovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_merge_suggestionsGraph Merge SuggestionsARead-onlyIdempotent
Surface candidate pairs of entities likely to be duplicates. Read-only — never auto-merges. Combines embedding similarity, shared-neighbor overlap, and name-token Jaccard. Same-type only. Use to triage entity-explosion before running graph_merge (destructive consolidation) or graph_relate with ALIAS_OF (soft alias).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max suggestions to return (default 20, max 100) | |
| weights | No | Override default weights (0.4 / 0.4 / 0.2) | |
| entity_id | No | Scope to one entity's potential duplicates | |
| min_score | No | Combined-score threshold to surface (default 0.8) | |
| entity_type | No | Scope to one entity type (Person, Project, etc.) | |
| log_to_audit | No | Emit merge_flagged audit events for surfaced pairs (default true) | |
| min_embedding_similarity | No | Embedding-similarity floor for candidates (default 0.85) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive. The description adds 'never auto-merges' and details the algorithm (embedding similarity, shared-neighbor overlap, name-token Jaccard). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: purpose, read-only and algorithm, usage guidance. Every sentence provides essential information with no redundancy. Ideal conciseness for an AI agent.
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 suggestion tool without output schema, the description covers purpose, safety, algorithm, and usage. Minor gap: does not describe return format (likely a list of pairs). But given the clarity and annotations, it is nearly 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 100% with detailed descriptions for all 7 parameters. The description provides high-level context (e.g., default weights) but does not add significant meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'surface' and the resource 'candidate pairs of entities likely to be duplicates'. It distinguishes from siblings like graph_merge (destructive) and graph_relate (soft alias) by mentioning alternative uses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using this tool for triaging entity-explosion before other specific operations, naming alternatives (graph_merge, graph_relate). Provides clear when-to-use and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_pruneGraph PruneADestructive
Remove entities and edges that have decayed below threshold. DESTRUCTIVE — always preview first. Requires user confirmation before execute mode.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | preview (default) or execute | preview |
| max_age_days | No | Max age for orphan pruning (default: 30) | |
| edge_threshold | No | Prune edges below this weight (default: 0.05) | |
| node_threshold | No | Prune nodes below this confidence (default: 0.1) | |
| include_orphans | No | Also prune orphaned nodes (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description adds critical behavioral context: 'DESTRUCTIVE — always preview first' and 'Requires user confirmation before execute mode'. This fully discloses the tool's risks and safe usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. Purpose is stated first, followed by crucial safety warnings. Highly efficient.
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 destructiveHint annotation and complete parameter schema, the description sufficiently covers context. No output schema exists but is not critical for this operation. Could marginally improve by explicitly differentiating from graph_delete.
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% (all 5 parameters have descriptions with defaults and types). The description adds no additional parameter information beyond the schema, meeting the baseline expectation.
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 'Remove entities and edges that have decayed below threshold', specifying both the verb (remove) and the resource (decayed entities/edges). This distinguishes it from siblings like graph_delete (generic deletion) and graph_decay (likely calculates decay).
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 provides clear usage guidance: 'always preview first' and 'requires user confirmation before execute mode'. It implies caution but does not explicitly state when not to use or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_queryGraph QueryARead-only
Query the memory graph by canonical entity name. Use when you know the entity name or close-to-canonical form (e.g. "Steve", "graph-memory"); for natural-language phrasing or synonyms (e.g. "the knowledge graph project") prefer graph_search. Returns up to limit matching nodes plus the edges that connect them within max_hops, with per-edge weight and source provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default: 20) | |
| entities | Yes | Entity names to search for | |
| max_hops | No | Max traversal depth (default: 2, capped at 4) | |
| min_weight | No | Min edge weight to traverse (default: 0.3) | |
| current_only | No | Only current facts, exclude superseded (default: true) | |
| entity_types | No | Filter results to these entity types | |
| context_level | No | Response detail level (default: full) | full |
| project_context | No | Project directory or name for affinity scoring |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes this as a safe read, so the description's added value is in return behavior: it discloses that results are up to `limit` nodes plus connecting edges within `max_hops`, each carrying weight and source provenance. That is meaningful context beyond the annotation, though it says nothing about cost, pagination, or missing-entity behavior.
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, zero filler: purpose and scope first, routing decision second, return shape third. Each sentence carries distinct, non-redundant information and the discriminating constraint is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, no output schema, and a graph traversal that could easily be misused, the description is complete enough to call correctly: it covers purpose, routing, and return semantics. The remaining parameters (min_weight, current_only, entity_types, context_level, project_context) are left entirely to the schema, which is acceptable at 100% coverage but leaves the traversal-filtering story thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes slightly further by explaining how `limit` and `max_hops` jointly shape the result (matching nodes plus their within-depth connecting edges) rather than restating field names, which helps an agent reason about traversal depth.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Query the memory graph by canonical entity name") and immediately names the sibling it is not: graph_search. An agent can distinguish this tool from the other 23 graph_* tools without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the selection condition ("when you know the entity name or close-to-canonical form", with examples like "Steve") and routes the other case to the alternative tool ("for natural-language phrasing or synonyms ... prefer graph_search"). When-to-use and the alternative are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_read_transcriptRead TranscriptARead-only
Read and parse a Claude Code JSONL transcript file through the canonical transcript parser. Returns normalized messages with text content extracted. Use this instead of reading raw JSONL directly — if the transcript format changes, only this tool needs updating.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | No | Absolute path to the .jsonl file. Takes precedence over session_id. | |
| text_only | No | If true (default), return only messages that have extractable text content. | |
| session_id | No | Session UUID (filename without .jsonl). Searches ~/.claude/projects/ for a match. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint=true. Description adds that it normalizes and extracts text content, and that it uses a canonical parser. Provides extra context beyond 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: first covers purpose and result, second covers usage guidance. No wasted words, information 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 3 params, no output schema, description covers what the tool does, what it returns, and why to use it. Missing explicit details on error handling, but adequate for a read 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 coverage is 100% (baseline 3). Description adds search location for session_id and precedence for file_path, adding meaning beyond schema. For text_only, schema already describes default and behavior.
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?
Cleary states verb 'read and parse', resource 'Claude Code JSONL transcript file', and what it returns. Distinguishes from sibling graph tools that are about graph operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this instead of reading raw JSONL directly' and explains benefit (format changes only need updating this tool). Gives clear when-to-use and why.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_reembedRe-embed EntitiesAIdempotent
Regenerate semantic-search embeddings for entities. By default only fills missing embeddings (idempotent, fast). With force=true, re-embeds every entity — use after changing the embed-text recipe (e.g. when richer fields are added). At ~10ms per entity, full re-embed of a few hundred nodes finishes in seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Re-embed every entity, even ones that already have an embedding. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the idempotentHint annotation by explaining that the default is idempotent and fast, and providing a time estimate (~10ms per entity). It also clarifies the effect of force=true, giving the agent a clear behavioral model.
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 consists of two concise sentences, front-loading the primary purpose and efficiently conveying the key details about behavior and performance. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with a single parameter and no output schema, the description covers the purpose, default vs. forced behavior, use case, and performance estimate. It is complete and self-contained.
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 input schema already describes the parameter with a default and a brief description. The tool's description adds meaningful context by explaining when to set force=true (after recipe changes), which goes beyond the schema's description.
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's action ('Regenerate semantic-search embeddings for entities') and specifies the default behavior (only missing embeddings) versus the forced re-embed mode. This distinguishes it from other sibling tools by focusing on a specific operation.
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 provides explicit context for when to use force=true ('after changing the embed-text recipe'), indicating a clear usage scenario. However, it does not mention when to avoid the tool or compare it to alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_relateGraph RelateAIdempotent
Create or strengthen a relationship between entities. Creates the endpoint entities if they don't exist, matching existing ones by name, case-insensitive name, or alias first. Use single mode (from_name/to_name/relation) for one fact at a time. Use batch mode when extracting from a transcript or document: it runs in one transaction, so a database failure keeps nothing, while an invalid item is skipped and reported without blocking the rest. Types and relations must use the documented vocabulary (see GRAPH_SCHEMA.md); an unknown relation is stored as RELATED_TO with the original kept in proposed_relations, and an unknown type as Object with proposed_type. Idempotent: re-asserting an existing edge strengthens it (capped at 1.0) and reports action "strengthened".
| Name | Required | Description | Default |
|---|---|---|---|
| batch | No | Batch mode: create multiple entities and relationships atomically | |
| weight | No | Edge weight 0.0-1.0 | |
| to_name | No | Target entity name (single mode) | |
| to_type | No | Target entity type (single mode) | |
| evidence | No | Why this relationship exists | |
| relation | No | Relationship type (single mode) | |
| valid_at | No | ISO-8601 date this fact became true. Also REPLACES the previous value: other edges of this type from the same source are marked invalid as of this date. Omit it for facts that can hold several values at once. FAMILY_OF, KNOWS, COLLABORATES_WITH, MENTOR_OF, ALIAS_OF, CONTRADICTS and RELATED_TO never supersede. | |
| from_name | No | Source entity name (single mode) | |
| from_type | No | Source entity type (single mode) | |
| properties | No | Additional properties | |
| source_type | No | Source type: conversation, ingest, manual, bootstrap | |
| source_session | No | Session ID for provenance | |
| source_transcript | No | Transcript path for provenance |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only idempotentHint available, the description carries real weight and delivers: batch runs in one transaction so a DB failure keeps nothing, an invalid item is skipped and reported without blocking the rest, unknown relations degrade to RELATED_TO with the original preserved in proposed_relations, unknown types to Object with proposed_type, and re-assertion strengthens a capped edge with action 'strengthened'. These are exactly the non-obvious traits an agent needs before firing a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every clause carries information — no filler and no restatement of the title. It is a single dense paragraph with several stacked subordinate clauses (transaction behavior, fallback vocabulary, idempotency), which would scan better as short segments, but nothing is wasted.
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 13-parameter tool with nested batch objects and no output schema, the description covers the decision points that matter: mode selection, endpoint creation/matching, atomicity, per-item error handling, vocabulary fallbacks, and idempotent strengthening with a reported action. Return-value detail is minimized because there is no output schema to defer to, yet the one observable outcome ('strengthened') is named; the remaining batch relation-to-localId linkage stays with the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents weight, relation, valid_at, provenance fields. The description adds meaning on top by grouping from_name/to_name/relation as the 'single mode' parameter set and tying the relation parameter to a required vocabulary with a documented fallback, which is more than the schema alone conveys.
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 opening sentence states a specific verb pair and resource: 'Create or strengthen a relationship between entities.' It goes further by explaining the auto-creation of missing endpoints and the match-by-name/case-insensitive/alias rule, so an agent immediately knows this is the graph write path rather than a read (graph_query) or maintenance (graph_prune) 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?
It explicitly splits usage into 'single mode (from_name/to_name/relation)' versus 'batch mode when extracting from a transcript or document', giving a concrete condition that selects each path. It stops short of naming sibling tools or stating when not to use this tool at all (e.g., deletion via graph_delete), so it is clear context without full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_searchSemantic Graph SearchARead-only
Find entities semantically similar to a natural-language query, then optionally expand via graph traversal. Uses local sentence embeddings (bge-small-en, 384-dim) — no external API. Best when the user's wording doesn't match canonical entity names (e.g. "containers" → Docker, "AI tools" → Claude Code/Anthropic SDK). If the embedder is unavailable it returns an error; use graph_query instead. Expansion follows the top 5 seeds only, capped at 30 edges.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural-language query (any phrasing — synonyms and paraphrases work). | |
| top_k | No | How many semantically similar entities to retrieve as seeds (default 10). | |
| expand | No | If true (default), also return the immediate graph neighbours of each seed. | |
| entity_types | No | Restrict results to these entity types. | |
| min_similarity | No | Minimum cosine similarity threshold (default 0.5). | |
| expand_min_weight | No | Min edge weight when expanding (default 0.3). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuinely non-obvious behavior: local bge-small-en 384-dim embeddings with no external API call, a hard failure mode when the embedder is missing, and expansion limits (top 5 seeds, 30-edge cap). It stops short of describing output shape or whether similarity scores are returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with zero filler: capability first, then the discriminating use case, then the failure mode with an alternative, then the expansion caps. Every sentence carries distinct information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description only loosely implies the return is seed entities plus neighbours, without stating fields such as similarity values or entity identifiers. Given six parameters and a dual-mode operation, that is the one meaningful hole; everything else an agent needs to call it correctly is present.
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 baseline is 3. The description goes past the schema by clarifying that expansion is anchored to only the top 5 seeds and capped at 30 edges — a constraint not derivable from the top_k, expand, or expand_min_weight fields themselves — which materially affects how an agent should size top_k.
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: find entities semantically similar to a natural-language query, with optional graph expansion. The dual mode (semantic seed retrieval + traversal) is named up front, and the concrete examples ("containers" → Docker, "AI tools" → Claude Code/Anthropic SDK) pin down what "semantically similar" means in practice, distinguishing it from graph_query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the selection condition: "Best when the user's wording doesn't match canonical entity names." It also names the fallback path — if the embedder is unavailable it errors and the agent should use graph_query — which is exactly the when-not guidance an agent needs to route between siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_statsGraph StatsARead-only
Graph health dashboard — node/edge counts by type, average weight, orphan count, unresolved contradictions, stale entries, schema version, and pending ingest backlog. Returns aggregate counts only; for individual entities use graph_entities. Call at session start to size up the graph before deeper queries, after graph_decay or graph_prune to verify the result, or when debugging unexpected query output. No parameters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the tool is safe. The description adds behavioral context by specifying it returns aggregate counts only and has no side effects. It does not mention any additional behaviors (e.g., rate limits), but for a simple stats tool, this is sufficient. Slight deduction for not elaborating on output structure beyond listing stats.
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 two concise sentences. The first sentence immediately states the purpose and what it returns, while the second provides usage guidance and confirms no parameters. Every word adds value, and it is front-loaded with the most critical 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?
Given the tool's simplicity (no params, no output schema) and the richness of sibling tools, the description is fully complete. It explains what the tool returns, when to use it, and what it does not do (aggregates only). The agent can make an informed decision without needing additional context.
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 has no parameters, and the input schema is empty. The description explicitly confirms 'No parameters,' which is clear and accurate. With schema coverage at 100% and no params, no additional detail is needed.
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 explicitly states it returns aggregate graph health statistics (node/edge counts, average weight, etc.), using a specific verb+resource ('Graph health dashboard'). It clearly distinguishes itself from sibling tool graph_entities by noting it returns aggregates only, not individual entities.
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 provides clear guidance on when to use the tool: at session start, after graph_decay or graph_prune, or when debugging query output. It also explicitly excludes usage for individual entity lookup, directing users to graph_entities. This covers when-to-use and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_unmergeGraph UnmergeADestructive
Split a falsely merged entity back into two separate entities, redistributing specified edges. Use when entity resolution made a mistake (e.g. merged 'Anna' and 'Anne'). The original entity keeps every edge not listed in edges_to_move; the new entity gets the listed edges plus a fresh embedding stub (re-derive with graph_reembed). Logged to the audit trail with reason. Returns the IDs of both entities.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why splitting (logged in audit) | |
| entity_id | Yes | The merged entity ID to split | |
| edges_to_move | Yes | Edges to move to the new entity | |
| new_entity_name | Yes | Name for the split-off entity | |
| new_entity_type | Yes | Type label for the split-off entity |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral detail beyond the destructiveHint annotation: it explains that edges are redistributed, the original entity keeps unmoved edges, the new entity gets a stub embedding, and the action is logged to an audit trail with a reason. No contradictions with 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 two sentences, front-loaded with the main action and purpose. Every sentence adds value: the first defines the operation and usage context, the second provides critical details about edge redistribution, embedding, audit logging, and return value.
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 complexity of a destructive graph operation with 5 parameters and no output schema, the description is remarkably complete. It explains the behavior, side effects, return value (IDs of both entities), and follow-up action (re-embedding). No critical 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?
All 5 parameters have schema descriptions (100% coverage), so baseline is 3. The description adds value by explaining that edges_to_move specifies which edges to move and that the original entity keeps the rest. It also notes that reason is logged to audit, which is not clear from schema. However, new_entity_name and new_entity_type parameters are not elaborated beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'split' and the resource 'falsely merged entity'. It distinguishes from sibling tools like graph_merge and graph_delete by specifying it's for undoing a mistaken merge. The example with 'Anna' and 'Anne' reinforces 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?
Explicitly says 'Use when entity resolution made a mistake', providing clear guidance on when to use. It also advises re-deriving embeddings with graph_reembed after splitting, which is a helpful follow-up step. Implicitly, it should not be used for correct merges.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_validateValidate Graph EntitiesARead-only
Scan recently extracted entities and edges for quality issues: generic names, reference language, isolated low-confidence entities, and near-duplicate names. Call this after a dream process extraction batch to catch bad data before it settles into the graph. Returns {total_issues, by_severity, scope, issues}, where issues holds up to max_issues records of shape {entity_id, name, type, issue, severity} and severity is high/medium/low. Read-only — pair with graph_delete or graph_unmerge to act on flagged items.
| Name | Required | Description | Default |
|---|---|---|---|
| max_issues | No | Maximum number of issues to return (default 50). | |
| source_session | No | Limit checks to entities extracted in this session. Omit to scan the whole graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the sole readOnlyHint annotation: it discloses the return shape {total_issues, by_severity, scope, issues}, the per-issue record fields, the severity taxonomy, and the max_issues cap on result size. It also clarifies scoping semantics (omit source_session to scan the whole graph) and marks the operation as read-only with suggested remediation tools.
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 purpose, then timing, then return contract and remediation. Every clause carries information an agent needs; there is no restatement of the title or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates fully by documenting the response structure, severity levels, and truncation behavior. Combined with the scoping note and remediation pairing, an agent has everything needed to call it and act on the results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description still adds meaning by tying max_issues to the returned issues array ('up to max_issues records') and by restating the source_session scoping rule in terms of the scan's coverage, which helps an agent reason about results rather than just pass values.
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 (scan) and resource (recently extracted entities and edges) and enumerates the exact defect classes it looks for: generic names, reference language, isolated low-confidence entities, near-duplicates. This distinguishes it from sibling diagnostics like graph_contradictions or graph_audit without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ('after a dream process extraction batch') and a rationale ('before it settles into the graph'), plus explicit follow-up routing to graph_delete/graph_unmerge. It stops short of naming the other read-only diagnostics (graph_audit, graph_contradictions) as alternatives to prefer when the concern is different, so the when-not-to-use side is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_weakenGraph WeakenAIdempotent
Decrease an edge's weight when the user corrects a recalled fact. Call this when the user says 'no', 'that's wrong', or corrects something from the graph. Persists immediately; weight clamps at 0.0. Returns an error if the edge doesn't exist — use graph_delete to remove an entity outright. To replace a fact rather than weaken it, prefer graph_relate with the new fact and SUPERSEDES.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Weaken amount (default: 0.3) | |
| reason | No | Why weakening | |
| to_name | Yes | Target entity name or ID | |
| relation | Yes | Relationship type | |
| from_name | Yes | Source entity name or ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes persistence, clamping at 0.0, and error if edge doesn't exist. Adds value beyond annotations (idempotentHint) with concrete behavioral details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each essential and front-loaded. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, behavior, and alternatives. Missing output schema but tool's effect is straightforward; description suffices for correct use.
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 covers all parameters with descriptions; description does not add significant new meaning beyond schema. Baseline 3 due to high 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?
Clearly states the action (decrease edge weight) and context (user correction of recalled fact). Distinguishes from siblings like graph_delete and graph_relate with SUPERSEDES.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call (user says 'no', 'that's wrong') and when not to (use graph_delete for removal, graph_relate for replacement). Provides clear alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.6.0- Changed
graph_ingest6 fields changed- added
Input schema / properties / contentAdded value: +{ + "description": "Document text to queue inline, for callers that can't reach the server's filesystem. Requires file_name. Admin tenant only.", + "type": "string" +} - added
Input schema / properties / file_nameAdded value: +{ + "description": "Name for inline content in the pending dir: plain basename ending .md, .txt or .json.", + "type": "string" +} - changed
Input schema / properties / file_path / descriptionPrevious value: -"Path to file to queue (required for queue action)"New value: +"Path to a file on the server to queue. For queue, give file_path or content + file_name." - added
Input schema / properties / meta / properties / last_event_idAdded value: +{ + "description": "ID of the newest session event included in this document", + "type": "string" +} - added
Input schema / properties / meta / properties / session_idAdded value: +{ + "description": "Cloud session this document came from (with source='claude-code-cloud')", + "type": "string" +} - added
Input schema / properties / meta / properties / throughAdded value: +{ + "description": "ISO timestamp of the newest session event included in this document", + "type": "string" +}
4 tool updates
v0.4.0- Added
graph_alias - Changed
graph_query1 field changed- changed
Input schema / properties / max_hops / descriptionPrevious value: -"Max traversal depth (default: 2)"New value: +"Max traversal depth (default: 2, capped at 4)"
- Changed
graph_relate1 field changed- changed
Input schema / properties / valid_at / descriptionPrevious value: -"When this fact became true"New value: +"ISO-8601 date this fact became true. Also REPLACES the previous value: other edges of this type from the same source are marked invalid as of this date. Omit it for facts that can hold several values at once. FAMILY_OF, KNOWS, COLLABORATES_WITH, MENTOR_OF, ALIAS_OF, CONTRADICTS and RELATED_TO never supersede."
- Changed
graph_search1 field changed- changed
Input schema / properties / entity_types / items / enumPrevious value: -[ - "Person", - "Project", - "Preference", - "Concept", - "Decision", - "Fact", - "Event", - "Object", - "Reasoning" -]New value: +[ + "Person", + "Organization", + "Project", + "Feature", + "Concept", + "Technology", + "Decision", + "Reasoning", + "Preference", + "Event", + "Fact", + "Artifact", + "Object", + "Resource", + "Infrastructure", + "Alias", + "Location", + "Issue", + "Task" +]
23 tool updates
v0.2.2- Added
graph_audit - Added
graph_boost - Added
graph_build_context - Added
graph_communities - Added
graph_contradictions - Added
graph_cypher - Added
graph_decay - Added
graph_delete - Added
graph_entities - Added
graph_export - Added
graph_ingest - Added
graph_merge - Added
graph_merge_suggestions - Added
graph_prune - Added
graph_query - Added
graph_read_transcript - Added
graph_reembed - Added
graph_relate - Added
graph_search - Added
graph_stats - Added
graph_unmerge - Added
graph_validate - Added
graph_weaken
23 tool updates
v0.1.4- Removed
graph_audit - Removed
graph_boost - Removed
graph_build_context - Removed
graph_communities - Removed
graph_contradictions - Removed
graph_cypher - Removed
graph_decay - Removed
graph_delete - Removed
graph_entities - Removed
graph_export - Removed
graph_ingest - Removed
graph_merge - Removed
graph_merge_suggestions - Removed
graph_prune - Removed
graph_query - Removed
graph_read_transcript - Removed
graph_reembed - Removed
graph_relate - Removed
graph_search - Removed
graph_stats - Removed
graph_unmerge - Removed
graph_validate - Removed
graph_weaken
1 tool update
v1.0.3- Changed
graph_audit1 field changed- changed
Input schema / properties / event / enumPrevious value: -[ - "run_start", - "run_end", - "transcript_start", - "transcript_end", - "transcript_skipped", - "entity_created", - "edge_created", - "edge_modified", - "merge_flagged", - "contradiction_found", - "ingest_start", - "ingest_end", - "decay_applied", - "format_warning", - "error" -]New value: +[ + "run_start", + "run_end", + "transcript_start", + "transcript_end", + "transcript_skipped", + "entity_created", + "entity_resolved", + "edge_created", + "edge_modified", + "merge_flagged", + "contradiction_found", + "ingest_start", + "ingest_end", + "decay_applied", + "format_warning", + "error" +]
1 tool update
v1.0.2- Added
graph_merge
7 tool updates
v1.0.1- Changed
graph_boost1 field changed- added
Input schema / properties / amount / defaultAdded value: +0.15
- Changed
graph_contradictions1 field changed- added
Input schema / properties / include_resolved / defaultAdded value: +false
- Changed
graph_decay1 field changed- added
Input schema / properties / dry_run / defaultAdded value: +false
- Changed
graph_entities2 fields changed- added
Input schema / properties / limit / defaultAdded value: +20 - added
Input schema / properties / sort_by / defaultAdded value: +"confidence"
- Changed
graph_prune5 fields changed- added
Input schema / properties / edge_threshold / defaultAdded value: +0.05 - added
Input schema / properties / include_orphans / defaultAdded value: +true - added
Input schema / properties / max_age_days / defaultAdded value: +30 - added
Input schema / properties / mode / defaultAdded value: +"preview" - added
Input schema / properties / node_threshold / defaultAdded value: +0.1
- Changed
graph_query5 fields changed- added
Input schema / properties / context_level / defaultAdded value: +"full" - added
Input schema / properties / current_only / defaultAdded value: +true - added
Input schema / properties / limit / defaultAdded value: +20 - added
Input schema / properties / max_hops / defaultAdded value: +2 - added
Input schema / properties / min_weight / defaultAdded value: +0.3
- Changed
graph_weaken1 field changed- added
Input schema / properties / amount / defaultAdded value: +0.3
22 tool updates
v1.0.0- First observed
graph_audit - First observed
graph_boost - First observed
graph_build_context - First observed
graph_communities - First observed
graph_contradictions - First observed
graph_cypher - First observed
graph_decay - First observed
graph_delete - First observed
graph_entities - First observed
graph_export - First observed
graph_ingest - First observed
graph_merge_suggestions - First observed
graph_prune - First observed
graph_query - First observed
graph_read_transcript - First observed
graph_reembed - First observed
graph_relate - First observed
graph_search - First observed
graph_stats - First observed
graph_unmerge - First observed
graph_validate - First observed
graph_weaken
TDQS
Scored across 24 tools
Most tools are cleanly distinct, and the descriptions actively steer between the few lookalikes (graph_query for canonical names vs graph_search for natural language vs graph_entities for catalog browsing vs graph_cypher for raw queries). The main residual overlaps are graph_stats versus graph_build_context (which explicitly bundles stats) and the decay/prune/delete trio, but in each case the docs spell out when to use which.
Every tool is snake_case with the same graph_ prefix, and nearly all are verb-led (graph_query, graph_merge, graph_reembed, graph_build_context). No camelCase or style mixing anywhere in the set.
24 tools is at the heavy end for this surface, but the domain genuinely spans CRUD, entity resolution, decay/pruning, ingest, and dream-process maintenance, and each tool maps to a real operation rather than a convenience duplicate. A few specialist tools (graph_audit, graph_read_transcript, graph_cypher) are narrow but justified by admin/maintenance workflows.
Lifecycle coverage is strong: create/strengthen (graph_relate), read (query/search/entities/cypher), modify (boost/weaken/alias/merge/unmerge), delete (graph_delete/graph_prune), plus maintenance (decay/validate/reembed/export/stats) and ingest. Minor gaps: no direct delete-single-edge-by-id operation (weakening to 0.0 or deleting the entity is the workaround) and no in-band schema/type listing, which is deferred to an external GRAPH_SCHEMA.md.
Maintenance
Related MCP Connectors
Memory for Claude, ChatGPT and other AI apps: notes and docs as a searchable graph, EU-hosted.
Persistent knowledge graph for AI-augmented teams. Store decisions, findings, and standing rules across agent sessions with semantic search and typed connections. Includes cross-session memory, audit trail, workspace isolation, and secret detection. Built for teams running agents that need to remember. Free until launch with team tier as default, anon trial available.
Personal wiki and memory layer for AI assistants. Persistent, structured memory across sessions.
Persistent, outcome-grounded episodic memory for Claude. 14ms CPU retrieval, no GPU, no vector DB.
Related MCP Servers
- AlicenseAqualityBmaintenanceGives your AI persistent memory across conversations. Stores facts automatically, finds them by meaning using hybrid search with query expansion, and organizes everything into topics without manual tagging.291MIT
- FlicenseNot gradedqualityAmaintenanceEnables Claude Code to persist, semantically search, update, and delete memories across sessions, plus explore knowledge-graph entities and their relationships, backed by self-hosted Qdrant, Neo4j, and Ollama. Session hooks and prompts automate context injection and summarization, with fact extraction handled by either the Claude Code session or a fully local Ollama model.-
- FlicenseNot gradedqualityAmaintenanceEnables Claude Code to store and recall persistent cross-session memory backed by self-hosted Qdrant, Neo4j, and Ollama, using Anthropic or fully local Ollama as the LLM. Exposes tools for adding, searching, listing, updating, and deleting memories plus querying knowledge-graph entities and relationships, with optional session hooks for automatic context injection and saving.-
- FlicenseNot gradedqualityAmaintenanceEnables Claude Code to maintain persistent memory across sessions through semantic search, memory CRUD, entity listing, and knowledge graph queries against self-hosted Qdrant, Neo4j, and Ollama, while supporting Anthropic or fully local LLM providers.-