memora
Memora is a lightweight MCP server that gives AI agents persistent memory with semantic search, knowledge graphs, document storage, and LLM-powered analysis across sessions.
Core Memory Management
Create, retrieve, update, and delete individual or batches of memories with rich metadata and tags
Specialized memory types: TODOs (with priority/status), issues (with severity/component), and section/subsection placeholders
Import/export memories to JSON with replace/merge/append strategies
Search & Discovery
Full-text search with filters for tags (AND/OR/NOT), date ranges, and metadata
Semantic vector search using configurable backends (OpenAI, sentence-transformers, TF-IDF)
Hybrid keyword + semantic search with Reciprocal Rank Fusion
Hierarchical memory browsing
Knowledge Graph & Relationships
Auto-generated cross-references and typed explicit links (
implements,supersedes,contradicts,references,extends,related_to)Cluster detection and importance boosting
Export as interactive HTML or serve via live HTTP server with real-time SSE updates and a graph UI (timeline, history, filters, Mermaid rendering, chat panel)
Document Storage
Store structured markdown documents as searchable fragment trees (claims, plan items, references, risks) with integrity guards
AI-Powered Features
LLM-based semantic deduplication and memory merging
Memory insights: activity summaries, stale detection, consolidation suggestions, pattern analysis
RAG-powered conversational interface with LLM tool calling to search/create/update/delete memories
Analytics & Tags
Memory statistics, tag hierarchy, allowlist validation, and importance-based ranking
Storage & Sync
SQLite backend with optional cloud sync to S3/R2/D1, with encryption and compression
Image upload and base64-to-R2 migration
Event System
Poll-based inter-agent communication for tracking memory operations across agents
Supports cloud storage sync via Cloudflare R2 for storing and syncing the SQLite database, with support for encryption and compression.
Renders Mermaid diagrams within the interactive knowledge graph visualization when viewing memory content.
Supports S3-compatible storage sync via MinIO for storing and syncing the SQLite database.
Provides a Telescope plugin for browsing and searching memories directly in Neovim with fuzzy search and preview capabilities.
Supports OpenAI embeddings for high-quality semantic search and cross-referencing of memories using text-embedding models.
Uses SQLite as the persistent storage backend for memories, with support for local storage and cloud sync.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@memorasearch for meeting notes about the Q3 project using semantic search"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Features
Core Storage
πΎ Persistent Storage - SQLite with optional cloud sync (S3, R2, D1)
ποΈ Multi-database routing - One process serves many stores; a workspace reaches its own at
/mcp/<name>(see Multi-database routing)π Hierarchical Organization - Section/subsection structure with auto-hierarchy assignment
π¦ Export/Import - Backup and restore with merge strategies
Absorb & Lineage
𧬠Absorb - Feed facts in; an LLM classifies each against the store (duplicate / update / contradiction / related / new), skips duplicates, links relations, and consolidates related facts β with
dry_runpreviewπ± Supersession Lineage - Updates supersede old knowledge instead of deleting it; retrieval follows the chain to the current version by default (
followmodes:active,latest,full_history)ποΈ Topic Digest -
memory_digest(topic)bundles relevant memories, open TODOs/issues, related edges, and source IDs into one retrieval
Search & Intelligence
π Semantic Search - Vector embeddings (TF-IDF, sentence-transformers, OpenAI)
π― Advanced Queries - Full-text, date ranges, tag filters (AND/OR/NOT), hybrid search
π Cross-references - Auto-linked related memories based on similarity
π€ LLM Deduplication - Find and merge duplicates with AI-powered comparison
π Memory Linking - Typed edges, importance boosting, and cluster detection
Document Storage
π Structured Documents - Store markdown documents as searchable fragment trees (claims, plan items, references, risks)
π Fragment Integrity - Guards against accidental delete/merge/absorb of document fragments
π Granular Search - Individual claims and findings are semantically searchable while the full document remains retrievable as a unit
Tools & Visualization
β‘ Memory Automation - Structured tools for TODOs, issues, and sections
πΈοΈ Knowledge Graph - Interactive visualization with Mermaid rendering and cluster overlays
π Live Graph Server - Built-in HTTP server with cloud-hosted option (D1/Pages)
π¬ Chat with Memories - RAG-powered chat panel with LLM tool calling to search, create, update, and delete memories via streaming chat
π‘ Event Notifications - Poll-based system for inter-agent communication
π Statistics & Analytics - Tag usage, trends, and connection insights
π§ Memory Insights - Activity summary, stale detection, consolidation suggestions, and LLM-powered pattern analysis
π Action History - Track all memory operations (create, update, delete, merge, boost, link) with grouped timeline view
Related MCP server: Mnemo MCP
Preview
Install
Two paths. pip is a local stdio child the client spawns. A container is a detached HTTP service you start with up; with MEMORA_DATABASES it serves multiple stores from one process. The LaunchAgent supervises the proxy, not the container β after a host restart the listener can come back while its upstream is still stopped. If you are running memora as a service, the container path is the install.
pip (local / stdio)
pip install memora-mcpThe PyPI package is memora-mcp (bare memora on PyPI is an unrelated project). Includes cloud storage (S3/R2) and OpenAI embeddings out of the box.
# Optional: local embeddings (offline, ~2GB for PyTorch)
pip install "memora-mcp[local]"
# Latest development version straight from git
pip install "git+https://github.com/agentic-box/memora.git"Then spawn it from .mcp.json with "command": "memora-server" (see Configuration).
Container (HTTP service)
Default runtime is Apple's container CLI. Every container operation scripts/memora-instance.sh performs (build, up, status, logs, down) uses $MEMORA_CONTAINER_BIN (default container). The generated proxy process does not; it hardcodes container list.
Before the first build:
Install Apple's
containerCLI (signed pkg from its GitHub releases). It needs a Mac with Apple silicon running macOS 26 β Apple does not support older macOS versions forcontainer.Start the runtime β Apple's documented first command, which also installs a kernel if none is configured:
container system startClone this repo and
cdinto it:git clone https://github.com/agentic-box/memora.git cd memoraCopy the instance template. It ships with
INSTANCE=myinstanceso the laterbuild/up/proxylines match without renaming. EditPORTand a backend (STORAGE_URI,VOLUME, orMEMORA_DATABASES):cp instances/example.env instances/myinstance.envCreate the credential file and install the proxy the LaunchAgent will run.
cred_args()requires a.mcp.jsonwhosemcpServers.memora.envholdsCLOUDFLARE_API_TOKEN(D1 access) and the embedding/LLM keys βupdies if that file is missing. The script looks for~/.config/memora/credentials.mcp.jsonif that file exists, otherwise~/repos/agentic-box/.mcp.json. SetCRED_SOURCEin the instance file to pick a path. Separately,proxyrenders a plist whose executable is$MEMORA_PROXY_BIN(default~/.local/libexec/memora/memora_proxy.py) and whose logs live in$MEMORA_LOG_DIR(default~/.local/var/log) β nothing creates either on a fresh clone.mkdir -p ~/.config/memora ~/.local/libexec/memora ~/.local/var/log cp scripts/memora_proxy.py ~/.local/libexec/memora/ # real values; any key is fine, an absent file is not # the default umask is permissive -- chmod 600 keeps other local accounts out cat > ~/.config/memora/credentials.mcp.json <<'JSON' {"mcpServers":{"memora":{"env":{"CLOUDFLARE_API_TOKEN":"REPLACE","OPENAI_API_KEY":"REPLACE"}}}} JSON chmod 600 ~/.config/memora/credentials.mcp.jsonThat JSON is the minimal correct config: both the LLM and embeddings use the default OpenAI host with a real OpenAI key. Do not add
OPENAI_BASE_URLpointing at OpenRouter without the embedding pair from Embeddings β OpenRouter has no embeddings endpoint, every embed call 404s, and memora silently falls back to TF-IDF keyword bags while looking healthy.
Then:
./scripts/memora-instance.sh build myinstance # tags IMAGE from myinstance.env (memora-pilot if IMAGE is unset)
./scripts/memora-instance.sh up myinstance # runs that same IMAGE
./scripts/memora-instance.sh proxy myinstance # render the LaunchAgent; run the printed launchctlup does not publish a host port. The listener the workspace connects to is the proxy. proxy only renders a macOS LaunchAgent and prints the launchctl commands β it does not load the service. Run those printed commands.
The printed workspace URL is always http://127.0.0.1:<PORT>/mcp (the registry default). For a non-default store, append /<name> yourself β a bare /mcp on a registry silently binds MEMORA_DEFAULT_DB:
{"mcpServers": {"memora": {"type": "http", "url": "http://127.0.0.1:<PORT>/mcp/<store>"}}}Proxy rationale, credentials, instance files, and MEMORA_CONTAINER_BIN: Container Deployment.
The server runs automatically when configured in Claude Code. Manual invocation:
# Default (stdio mode for MCP)
memora-server
# With graph visualization server
memora-server --graph-port 8765
# HTTP transport (alternative to stdio)
memora-server --transport streamable-http --host 127.0.0.1 --port 8080Claude Code
Add to .mcp.json in your project root:
Local DB:
{
"mcpServers": {
"memora": {
"command": "memora-server",
"args": [],
"env": {
"MEMORA_DB_PATH": "~/.local/share/memora/memories.db",
"MEMORA_ALLOW_ANY_TAG": "1",
"MEMORA_GRAPH_PORT": "8765"
}
}
}
}Cloud DB (Cloudflare D1) - Recommended:
{
"mcpServers": {
"memora": {
"command": "memora-server",
"args": ["--no-graph"],
"env": {
"MEMORA_STORAGE_URI": "d1://<account-id>/<database-id>",
"CLOUDFLARE_API_TOKEN": "<your-api-token>",
"MEMORA_ALLOW_ANY_TAG": "1"
}
}
}
}With D1, use --no-graph to disable the local visualization server. Instead, use the hosted graph at your Cloudflare Pages URL (see Cloud Graph).
Cloud DB (S3/R2) - Sync mode:
{
"mcpServers": {
"memora": {
"command": "memora-server",
"args": [],
"env": {
"AWS_PROFILE": "memora",
"AWS_ENDPOINT_URL": "https://<account-id>.r2.cloudflarestorage.com",
"MEMORA_STORAGE_URI": "s3://memories/memories.db",
"MEMORA_CLOUD_ENCRYPT": "true",
"MEMORA_ALLOW_ANY_TAG": "1",
"MEMORA_GRAPH_PORT": "8765"
}
}
}
}Codex CLI
Add to ~/.codex/config.toml:
[mcp_servers.memora]
command = "memora-server" # or full path: /path/to/bin/memora-server
args = ["--no-graph"]
env = {
AWS_PROFILE = "memora",
AWS_ENDPOINT_URL = "https://<account-id>.r2.cloudflarestorage.com",
MEMORA_STORAGE_URI = "s3://memories/memories.db",
MEMORA_CLOUD_ENCRYPT = "true",
MEMORA_ALLOW_ANY_TAG = "1",
}Variable | Description |
| Local SQLite database path (default: |
| Storage URI: |
| JSON object |
| Registry name a bare |
| API token for D1 ( |
| Encrypt the local file before uploading to S3/R2. Unset/ |
| Compress the local file before uploading to S3/R2. Unset/ |
| Local cache directory for an S3/R2-synced database. Unset: the backend picks a cache path. |
| Allow any tag without validation against allowlist ( |
| Path to a JSON file containing an array of allowed tags, e.g. |
| Comma-separated list of allowed tags |
| Bind address for HTTP transports (default |
| Bind port for HTTP transports (default |
| Port for the knowledge graph visualization server (default: |
|
|
| Tool subset exposed to clients: |
| Hard ceiling on concurrent MCP sessions (default |
| New sessions admitted per minute (default |
| Maximum initialize request body accepted/buffered (default |
| Seconds before an abandoned valid session is reaped (default |
| Bearer token for detailed |
| Seconds a readiness snapshot may be served before a refresh is due (default |
| Bound on one refresh pass and on each store probe (default |
| How often the server refreshes readiness on its own (default |
| Age after which a cached per-database result may no longer be reported ready (default |
| Two consumers, two defaults, same name: |
| Embedding backend: |
| Model for sentence-transformers (default: |
| Embedding provider API key (atomic with base URL β see below) |
| Embedding provider base URL (atomic with API key β see below) |
| Recommend |
| LLM only (dedup/chat) when |
| LLM base URL (OpenRouter, Azure, etc.). Same atomic fallback rule as the key β not an embeddings URL when you use a split config |
| Model id for the openai embedding backend. Must exist on the embedding host (default |
| Enable LLM-powered deduplication comparison ( |
| Model for deduplication comparison and, if unset, for query rewrite and local chat (default: |
| Seconds the OpenAI client waits (default |
| Model for RAG query rewriting in the graph chat panel. Unset/empty uses |
| Rows per page when loading embeddings from D1 (default |
| Model for the local graph chat panel. Unset/empty falls back to |
|
|
| Worker base URL for those broadcasts ( |
| Seconds to batch rapid writes before broadcasting (default |
| Path captured at startup (default: |
| AWS credentials profile from |
| S3-compatible endpoint for R2/MinIO |
| Public domain for R2 image URLs |
All 43 MCP tools register unconditionally, so every agent session is injected with the full ~12,700-token tool schema even when most tools are never called. MEMORA_TOOL_PROFILE exposes a subset per deployment so a gated tool is genuinely absent β missing from tools/list AND undispatchable (call_tool returns unknown-tool, not a hidden execution). The profile is applied and attested at startup; the active profile and exposed tool count are logged to stderr.
Value | Tools | Use |
| all 43 | Direct stdio use; every existing deployment is byte-for-byte unchanged |
| 19 | The agent set plus |
| 12 | The read/create surface a worker agent needs: |
Unset / empty =
full. No existing deployment changes behaviour.An unknown value aborts startup with a message naming the valid values. It never silently falls back to
fullβ a typo must not re-expose destructive maintenance tools (memory_rebuild_embeddings,memory_delete_batch) to every worker. Fail closed.memory_listis inleaderbut notagent. It was excluded from both while it cost 163-174s on a D1 store againstmemory_list_compact's 0.22s; #973 fixed that (now ~1.1s). It stays out ofagentbecause a worker's read surface is deliberately narrow, not for speed.The leader/agent boundary is data in
memora/tool_profile.py(two frozensets). Editing it is one line, not a sweep of 43 decorators.The prune deletes from FastMCP's private
_tool_manager._toolsdict, somemorapinsmcp>=1.27,<1.28(the audited minor) and runs a startup attestation through the low-level registered MCP request handlers (_mcp_server.request_handlers[ListToolsRequest]/[CallToolRequest]β the actual dispatch callable real client requests use, not theFastMCP.list_tools/call_toolPython helpers) that refuses to start if the installed SDK routes listing/dispatch elsewhere (private-implementation drift). The pin is the static guard; the attestation is the runtime backstop. Bumping the upper bound requires re-runningtests/test_tool_profile.py.Under container deployment the profile is per container while roles are per agent. One container serving a workspace's leader and its workers needs the leader superset;
agentwould stripcreate_section/store_document/delete/digest/tagsfrom the leader.memora-server(i.e.memora.server.main()) is the sole supported profiled serving path. A direct embedder that importsmemora.server.mcpand callsmcp.run()themselves bypasses profiling entirely (the globalmcpstill holds all 43 tools); embedders who want profiling must callapply_tool_profilethemselves or usemain().
# Leader deployment β exposes 19 tools
MEMORA_TOOL_PROFILE=leader memora-server
# Agent worker β exposes 12 tools
MEMORA_TOOL_PROFILE=agent memora-server
# Full (default) β all 43 tools, existing behaviour
memora-server
# Typo refuses to start:
# MEMORA_TOOL_PROFILE=agnt memora-server
# Error: unknown MEMORA_TOOL_PROFILE='agnt'; valid values: full, leader, agentOne memora process can serve every workspace. MEMORA_DATABASES is a JSON
registry of {name: storage URI}; a client reaches its store at /mcp/<name>.
The selector is the URL already in .mcp.json, not a tool argument β an optional
db on every tool is 43 chances to forget one, and every miss would write into
someone else's store.
Unset MEMORA_DATABASES is the old shape: one backend from MEMORA_STORAGE_URI
/ MEMORA_DB_PATH, one /mcp. Existing stdio deployments do not change.
Routing (streamable-http only):
URL | Resolves to |
| That registry entry. Unknown names return |
|
|
The binding is sticky per MCP session, not per request. A session opened on
/mcp/alpha and reused against /mcp/beta still resolves to alpha. A client
cannot half-switch databases mid-conversation.
Malformed configuration refuses to start (it does not fall through to the
legacy database): bad JSON, a non-object, duplicate keys, an empty URI, a name
that is not one URL path segment, or MEMORA_DEFAULT_DB missing/unknown when
more than one database is listed.
Worked pair β run this, connect to this. A streamable-HTTP listener, not
an MCP command entry (that would spawn a stdio child that never speaks MCP
on stdio). Credentials live on the server process.
MEMORA_DATABASES='{"memora":"d1://<account-id>/<memora-db-id>","ob1":"d1://<account-id>/<ob1-db-id>"}' \
MEMORA_DEFAULT_DB=memora \
CLOUDFLARE_API_TOKEN='<token>' \
MEMORA_VECTOR_SCAN_PAGE_SIZE=100 \
memora-server --transport streamable-http --host 127.0.0.1 --port 8000 --no-graph{
"mcpServers": {
"memora": {
"type": "http",
"url": "http://127.0.0.1:8000/mcp/ob1"
}
}
}Container / proxy variant (this host's usual launcher, not the command
above): scripts/memora-instance.sh up myinstance starts the same HTTP server
inside a container and puts scripts/memora_proxy.py on 127.0.0.1:<PORT>
(8910 for the memora instance). The workspace URL is then
http://127.0.0.1:8910/mcp/ob1. See Container Deployment.
A registry may mix d1://, s3://, and local paths; parse_backend_uri
dispatches on the scheme.
memory_stats reports the bound database. It returns database (the name
this session actually resolved) and database_source (path,
registry_default, or unconfigured). A valid-but-wrong name in .mcp.json
is otherwise undetectable: every tool works, reads succeed, and writes land
silently in another project's store. Call memory_stats and check database
against the workspace you meant.
Health of a multi-database process: GET /health is liveness (no database I/O
β the only signal a supervisor may restart on). GET /health/db is an alert
surface (always HTTP 200; status is ok, degraded, unknown β no
snapshot yet, a refresh timed out, or evidence older than max staleness β or
error if the registry itself is unusable). GET /health/db/{name} is the
workspace-specific probe (200 or 503). Withdrawing the whole process because
one store is degraded takes the healthy ones down with it.
With MEMORA_DATABASES unset, a process still binds one database for its
lifetime (MEMORA_STORAGE_URI / MEMORA_DB_PATH). That is the original
one-store-one-container-one-port shape.
With MEMORA_DATABASES set, one container serves every workspace and
clients select a store by URL path (/mcp/<name>). See
Multi-database routing. scripts/memora-instance.sh
wants one of STORAGE_URI, VOLUME, or MEMORA_DATABASES per instance file
(load() requires at least one). If more than one is set, cmd_up uses
MEMORA_DATABASES, then STORAGE_URI, then VOLUME.
Dockerfile builds a credential-free image; scripts/memora-instance.sh deploys one
instance from instances/myinstance.env (or another named file). The script's runtime CLI is
$MEMORA_CONTAINER_BIN (default container β Apple's CLI). Every container
operation the script performs honours that override (build, up, status,
logs, down). The generated memora_proxy.py process hardcodes
container list, which is also why the proxy exists: that runtime reassigns
the container's IP on every start.
./scripts/memora-instance.sh build myinstance # build the image
./scripts/memora-instance.sh up myinstance # run the container
./scripts/memora-instance.sh proxy myinstance # render a LaunchAgent + print install commands
./scripts/memora-instance.sh status # every instance at a glanceThen point the workspace at it β the whole client config, with no secrets in it.
A registry instance needs the store in the path (/mcp/<name>); bare /mcp is
the registry default:
{"mcpServers": {"memora": {"type": "http", "url": "http://127.0.0.1:8910/mcp/ob1"}}}Credentials never enter the image, the instance file, or the workspace's HTTP
config. They are read at run time from a separate credential config
($CRED_SOURCE β itself a .mcp.json holding only the mcpServers.memora.env
block) and injected with -e. If the instance file does not set
CRED_SOURCE, the script uses ~/.config/memora/credentials.mcp.json when that
file exists, otherwise ~/repos/agentic-box/.mcp.json. Pass through every
variable that file defines, not a hand-picked few: a container started with only
the embedding keys silently loses memory_absorb's LLM consolidation instead of
failing loudly.
Why the proxy exists β read this before deciding you do not need it. The
default runtime (Apple's container) reassigns a container's IP on every start, not just on recreate.
An MCP client reads its config once at startup, so a moved address does not produce an
error: it produces a permanent silent hang. scripts/memora_proxy.py holds a stable
127.0.0.1:<PORT> in front of the moving address and re-resolves per connection.
Two failure modes it distinguishes, which cost an outage to learn:
The lookup ran and the container is not listed β it really is gone. Refuse.
The lookup could not run (timeout under host memory pressure) β nothing new is known. Keep serving the last known good address, bounded by
MEMORA_PROXY_STALE_GRACE(300s). Conflating the two took every workspace offline while the containers were answering normally on unchanged addresses.
Set MEMORA_TOOL_PROFILE per instance (see Tool Profiles). Note the profile is
per container while roles are per agent: if one container serves a workspace's
leader and its workers, it needs the leader superset.
Deploy-time script variable (not a memora-server env var β it never reaches the process inside the container):
Variable | Meaning |
| CLI every |
instances/README.md covers the config fields and launchd/README.md the supervised
proxy. REVERT.md documents restoring a workspace to the direct stdio server.
Memora supports three embedding backends:
Backend | Install | Quality | Speed |
| Included | High quality | API latency |
|
| Good, runs offline | Medium |
| Included | Basic keyword matching | Fast |
Embeddings and the LLM are configured separately.
Role | Variables |
LLM (dedup, chat) |
|
Embeddings |
|
Fallback | If both |
A partial split (only one MEMORA_EMBEDDING_* set) is rejected so one providerβs secret is never sent to another host.
Trap β OpenRouter has no embeddings endpoint. OpenRouterβs catalogue is chat/multimodal only (no embedding models). Do not point the embedding path at OpenRouter via OPENAI_BASE_URL (or a MEMORA base URL). That combination 404s every embed call; without MEMORA_EMBEDDING_STRICT=1 Memora falls back to TF-IDF and keeps answering, so the store fills with keyword bags while looking healthy. OpenRouter remains fine for the LLM only.
Worked example (LLM via OpenRouter, embeddings via Cloudflare Workers AI):
@cf/baai/bge-m3 is 1024-dimensional. Token needs Workers AI permission. Endpoint shape:
https://api.cloudflare.com/client/v4/accounts/<account_id>/ai/v1
{
"env": {
"MEMORA_EMBEDDING_MODEL": "openai",
"OPENAI_API_KEY": "<openrouter-key>",
"OPENAI_BASE_URL": "https://openrouter.ai/api/v1",
"MEMORA_LLM_MODEL": "deepseek/deepseek-chat",
"MEMORA_EMBEDDING_API_KEY": "<cloudflare-api-token-with-workers-ai>",
"MEMORA_EMBEDDING_BASE_URL": "https://api.cloudflare.com/client/v4/accounts/<account_id>/ai/v1",
"OPENAI_EMBEDDING_MODEL": "@cf/baai/bge-m3",
"MEMORA_EMBEDDING_STRICT": "1"
}
}What this fix does (no oversell): embeddings and LLM can use different providers; a partial split is rejected; strict mode turns silent degradation into a hard, named failure.
Automatic: Embeddings and cross-references are computed automatically when you memory_create, memory_update, or memory_create_batch.
Manual rebuild required when the store fingerprint changes β not only MEMORA_EMBEDDING_MODEL, but also:
Embedding endpoint (
MEMORA_EMBEDDING_BASE_URL/ host)Actual model id (
OPENAI_EMBEDDING_MODEL, e.g. switching to@cf/baai/bge-m3)Vector kind or dimensions (word-key TF-IDF bags vs dense 1024-d; or 384 vs 1024)
Mixed store (some rows dense, some sparse) β cosine similarity only shares keys, so mixed kinds yield 0.0 recall for old rows
Fingerprint form: backend|model|repr (e.g. openai|@cf/baai/bge-m3|dense:1024). Legacy meta value openai alone is treated as a mismatch.
# After changing embedding model/endpoint, rebuild all embeddings
memory_rebuild_embeddings
# Then rebuild cross-references to update the knowledge graph
memory_rebuild_crossrefsA built-in HTTP server starts automatically with the MCP server, serving an interactive knowledge graph visualization.
Access locally:
http://localhost:8765/graphRemote access via SSH:
ssh -L 8765:localhost:8765 user@remote
# Then open http://localhost:8765/graph in your browserConfiguration:
{
"env": {
"MEMORA_GRAPH_PORT": "8765"
}
}To disable: add "--no-graph" to args in your MCP config.
Graph UI Features
Details Panel - View memory content, metadata, tags, and related memories
Timeline Panel - Browse memories chronologically, click to highlight in graph
History Panel - Action log of all operations with grouped consecutive entries and clickable memory references (deleted memories shown as strikethrough)
Chat Panel - Ask questions about your memories using RAG-powered LLM chat with streaming responses and clickable
[Memory #ID]referencesTime Slider - Filter memories by date range, drag to explore history
Real-time Updates - Graph, timeline, and history update via SSE when memories change
Filters - Tag/section dropdowns, zoom controls
Mermaid Rendering - Code blocks render as diagrams
Node Colors
π£ Tags - Purple shades by tag
π΄ Issues - Red (open), Orange (in progress), Green (resolved), Gray (won't fix)
π΅ TODOs - Blue (open), Orange (in progress), Green (completed), Red (blocked)
Node size reflects connection count.
When using Cloudflare D1 as your database, the graph visualization is hosted on Cloudflare Pages - no local server needed.
Benefits:
Access from anywhere (no SSH tunneling)
Real-time updates via WebSocket
Multi-database support via
?db=parameterSecure access with Cloudflare Zero Trust
Setup:
Create D1 database:
npx wrangler d1 create memora-graph npx wrangler d1 execute memora-graph --file=memora-graph/schema.sqlDeploy Pages:
cd memora-graph npx wrangler pages deploy ./public --project-name=memora-graphConfigure bindings in Cloudflare Dashboard:
Pages β memora-graph β Settings β Bindings
Add D1:
DB_MEMORAβ your databaseAdd R2:
R2_MEMORAβ your bucket (for images)
Configure MCP with D1 URI:
{ "env": { "MEMORA_STORAGE_URI": "d1://<account-id>/<database-id>", "CLOUDFLARE_API_TOKEN": "<your-token>" } }
Access: https://memora-graph.pages.dev
Secure with Zero Trust:
Cloudflare Dashboard β Zero Trust β Access β Applications
Add application for
memora-graph.pages.devCreate policy with allowed emails
Pages β Settings β Enable Access Policy
See memora-graph/ for detailed setup and multi-database configuration.
Ask questions about your knowledge base directly from the graph UI. The chat panel uses RAG (Retrieval-Augmented Generation) to search relevant memories and stream LLM responses with tool calling support.
Toggle via the floating chat icon at bottom-right
Semantic search finds the most relevant memories as context
Streaming responses with clickable
[Memory #ID]references that focus the graph nodeTool calling β the LLM can create, update, and delete memories directly from chat (e.g., "save this as a memory", "delete memory #42", "update memory #10 with...")
Works on both the local server and Cloudflare Pages deployment
Configure the chat model:
Backend | Variable | Default |
Local server |
| Falls back to |
Cloudflare Pages |
|
|
Requires an OpenAI-compatible API (OPENAI_API_KEY + OPENAI_BASE_URL for local, OPENROUTER_API_KEY secret for Cloudflare). The chat model must support tool use (function calling).
Find and merge duplicate memories using AI-powered semantic comparison:
# Find potential duplicates (uses cross-refs + optional LLM analysis)
memory_find_duplicates(min_similarity=0.7, max_similarity=0.95, limit=10, use_llm=True)
# Merge duplicates (append, prepend, or replace strategies)
memory_merge(source_id=123, target_id=456, merge_strategy="append")LLM Comparison analyzes memory pairs and returns:
verdict: "duplicate", "similar", or "different"confidence: 0.0-1.0 scorereasoning: Brief explanationsuggested_action: "merge", "keep_both", or "review"
Works with any OpenAI-compatible chat API (OpenAI, OpenRouter, Azure, etc.) via OPENAI_BASE_URL. OpenRouter is fine for this LLM path; it does not provide embeddings β configure embeddings separately (see Semantic Search & Embeddings).
Store structured documents (research reports, architecture decisions, post-mortems) as searchable fragment trees:
# Store a markdown document β auto-parsed into typed fragments
memory_store_document(
content="# Research Report\n\n## Evidence Table\n| Claim | Confidence |\n...",
document_key="research/memora-enhancements-2026-04-08",
tags=["memora/research"]
)
# Returns: {root_id: 230, fragment_count: 100, node_map: {claim: [...], plan_item: [...], ...}}
# Retrieve the full document or specific fragment types
memory_get_document(document_key="research/memora-enhancements-2026-04-08")
memory_get_document(document_key="...", node_kinds=["claim"], content_mode="full")
# Delete a document and all its fragments
memory_delete_document(document_key="research/memora-enhancements-2026-04-08")How it works: The parser splits markdown by structure β tables become individual claims, numbered lists become plan items, URL lists become references, and risk sections become risk fragments. Each fragment is independently searchable via memory_semantic_search while the full document is retrievable as a unit.
Fragment types: claim, plan_item, reference, section_chunk, risk
Integrity guards: Document fragments are protected from accidental modification:
memory_deleterequiresforce=Truefor fragmentsmemory_mergerefuses to merge fragmentsmemory_absorbexcludes fragments from similarity matchingmemory_find_duplicatesandmemory_detect_supersessionsskip fragmentsGraph UI hides fragments, shows only the document root node
Structured tools for common memory types:
# Create a TODO with status and priority
memory_create_todo(content="Implement feature X", status="open", priority="high", category="backend")
# Create an issue with severity
memory_create_issue(content="Bug in login flow", status="open", severity="major", component="auth")
# Create a section placeholder (hidden from graph)
memory_create_section(content="Architecture", section="docs", subsection="api")Analyze stored memories and surface actionable insights:
# Full analysis with LLM-powered pattern detection
memory_insights(period="7d", include_llm_analysis=True)
# Quick summary without LLM (faster, no API key needed)
memory_insights(period="1m", include_llm_analysis=False)Returns:
Activity summary β memories created in the period, grouped by type and tag
Open items β open TODOs and issues with stale detection (configurable via
MEMORA_STALE_DAYS;memory_insightsdefault 14, graph UI default 30 β same variable, two consumers)Consolidation candidates β similar memory pairs that could be merged
LLM analysis β themes, focus areas, knowledge gaps, and a summary (requires
OPENAI_API_KEY)
Manage relationships between memories:
# Create typed edges between memories
memory_link(from_id=1, to_id=2, edge_type="implements", bidirectional=True)
# Edge types: references, implements, supersedes, extends, contradicts, related_to
# Remove links
memory_unlink(from_id=1, to_id=2)
# Boost memory importance for ranking
memory_boost(memory_id=42, boost_amount=0.5)
# Detect clusters of related memories
memory_clusters(min_cluster_size=2, min_score=0.3)For offline viewing, export memories as a static HTML file:
memory_export_graph(output_path="~/memories_graph.html", min_score=0.25)This is optional - the Live Graph Server provides the same visualization with real-time updates.
Browse memories directly in Neovim with Telescope. Copy the plugin to your config:
# For kickstart.nvim / lazy.nvim
cp nvim/memora.lua ~/.config/nvim/lua/kickstart/plugins/Usage: Press <leader>sm to open the memory browser with fuzzy search and preview.
Requires: telescope.nvim, plenary.nvim, and memora installed in your Python environment.
Available Tools
43 toolsmemory_absorbA
Intelligently absorb facts into memory with dedup and consolidation.
For each fact: searches for similar existing memories, classifies the relationship via LLM (duplicate/update/contradict/related/new), then takes the appropriate action. Related new facts are automatically consolidated into single, richer memories via LLM synthesis.
Args: facts: List of fact strings to absorb (can be granular β related ones get merged) source: Origin of facts β "manual", "session_end", "post_tool", "import" confidence: Caller's certainty about these facts (0.0-1.0, default: 0.8) context: Optional surrounding context to help disambiguate facts metadata: Optional metadata to attach to created memories tags: Optional tags to attach to created memories dry_run: If True, preview what would happen without writing anything
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| facts | Yes | ||
| source | No | manual | |
| context | No | ||
| dry_run | No | ||
| metadata | No | ||
| confidence | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It details the step-by-step process including LLM classification and consolidation, and mentions dry_run for preview. However, it does not specify the exact actions taken for each relationship type (e.g., what 'update' entails) or potential side effects like overwriting existing memories.
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 and well-structured: a brief summary, followed by a process explanation, then a bulleted argument list. Every sentence adds value, and key 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 the tool's complexity (7 parameters, 1 required, no annotations, output schema present), the description is complete. It covers the core functionality, argument semantics, and behavioral details. Return values are not needed due to output 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?
Each parameter is explained in the Args section, adding meaning beyond the input schema which has 0% description coverage. For example, source lists possible values, dry_run is described as a preview, and facts are noted to be mergeable. This provides clear guidance for an AI agent.
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 'Intelligently absorb facts into memory with dedup and consolidation' and explains the process of searching, classifying, and consolidating. It distinguishes from siblings like memory_create by emphasizing dedup and LLM-driven merging.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for absorbing facts that may overlap with existing memories, but does not explicitly state when to use this tool versus alternatives like memory_create_batch or memory_update. No exclusions or alternative names are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_backfill_tagsA
Re-tag existing memories with project-prefixed tags.
Uses deterministic normalization to prefix generic tags (e.g. "plan" β "memora/plan") when the memory content clearly belongs to a specific project. No LLM calls.
Idempotent: re-running produces the same result.
Args: dry_run: If True, preview changes without writing (default: True)
Returns: Dictionary with processed count, changed count, and list of changes.
Rate limited: 120s cooldown.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behavioral traits beyond annotations: deterministic normalization, no LLM calls, idempotence, rate limiting (120s cooldown), and the preview effect of dry_run. This fully compensates for missing 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 concise and well-structured: a main purpose statement, then bullet points for parameters, returns, and rate limit. Every sentence adds value without 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 tool with a single parameter and an output schema, the description covers all necessary context: what it does, how it works, behavior under dry_run, return structure, and rate limits. No gaps are 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?
The only parameter, dry_run, is well-explained with its default value and effect (preview changes). With 0% schema description coverage, the description adds essential meaning beyond the schema, though the parameter is simple.
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 re-tags existing memories with project-prefixed tags using deterministic normalization, with an explicit example. It distinguishes itself from sibling tools by specifying this unique retroactive tagging behavior.
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 does not explicitly state when to use or avoid this tool compared to alternatives like memory_validate_tags or memory_tags. While it notes features like no LLM calls and idempotence, it lacks direct usage context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_boostA
Boost a memory's importance score.
Manually increase a memory's base importance to make it rank higher in importance-sorted searches. The boost is permanent and cumulative.
Args: memory_id: ID of the memory to boost boost_amount: Amount to add to base importance (default: 0.5) Common values: 0.25 (small), 0.5 (medium), 1.0 (large)
Returns: Updated memory with new importance score, or error if not found
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes | ||
| boost_amount | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the boost is permanent and cumulative, and states the return type (updated memory or error). This provides sufficient transparency, though it could mention potential side effects like affecting all importance-sorted queries.
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 and well-structured: a single-line summary, an explanatory sentence, then args and returns. Every sentence adds value, and the front-loaded purpose is immediately clear.
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 (2 parameters, 1 required, output schema present), the description covers all necessary aspects: purpose, usage, parameter details, and return value. Nothing is missing for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must compensate. It does so excellently by explaining both parameters: memory_id (ID of memory) and boost_amount (amount to add, with default and common values). This adds meaning beyond the raw 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 tool's purpose: to manually boost a memory's importance score, making it rank higher in searches. It specifies the verb 'boost' and the resource 'memory's importance score', and it is distinct from sibling tools like memory_update or memory_list.
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 explains when to use the tool (to manually increase importance for better ranking) but does not provide explicit guidance on when not to use it or alternatives. However, the context is clear enough for an agent to understand its appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_clustersA
Detect clusters of related memories.
Args: min_cluster_size: Minimum memories to form a cluster (default: 2) min_score: Minimum similarity score to consider connected (default: 0.3) algorithm: "connected_components" (default) or "louvain" Louvain uses embedding similarity for content-based clustering.
Returns: List of clusters with member IDs, sizes, and common tags
| Name | Required | Description | Default |
|---|---|---|---|
| algorithm | No | connected_components | |
| min_score | No | ||
| min_cluster_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral traits. It explains the return format (clusters with IDs, sizes, tags) and algorithm behavior, but does not explicitly state that it is read-only or non-destructive. A clearer safety indication would improve this.
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 a clear purpose statement and a bulleted list of parameters. Every sentence adds value; 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 that there is an output schema (described in text) and no nested objects, the description adequately covers inputs, algorithm choices, and output structure. It is self-contained for a clustering tool among many memory tools.
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 has 0% description coverage, but the description adds detailed explanations for each parameter (min_cluster_size, min_score, algorithm) and the algorithm options, enabling correct agent invocation.
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 detects clusters of related memories, with a specific verb and resource. It distinguishes from sibling tools like memory_find_duplicates or memory_related by focusing on clustering.
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?
Usage is implied (when you want to find clusters), but there is no explicit guidance on when to use this tool vs alternatives, nor when not to use it. The algorithm options are explained but not in comparison to other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_createA
Create a new memory entry.
Args: content: The memory content text metadata: Optional metadata dictionary tags: Optional list of tags suggest_similar: If True, find similar memories and suggest consolidation (default: True) similarity_threshold: Minimum similarity score for suggestions (default: 0.2) response_mode: "full" (default) or "minimal" response payload size
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| content | Yes | ||
| metadata | No | ||
| response_mode | No | full | |
| suggest_similar | No | ||
| similarity_threshold | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It does not mention side effects, authorization needs, idempotency, or error conditions. It only describes parameters, leaving behavioral expectations unclear.
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 well-structured with a clear one-line purpose followed by an Args section. It is reasonably concise but could be slightly more efficient by removing redundant phrasing (e.g., 'Optional metadata dictionary').
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 lack of annotations and the complexity of 6 parameters, the description adequately covers parameter semantics. However, it omits information about return values (output schema exists but not referenced) and behavioral context (e.g., whether duplicates are checked, how suggestions work). It meets the minimum viable threshold.
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 description provides detailed explanations for all six parameters, including their purpose, defaults, and valid options (e.g., response_mode enum, suggest_similar behavior). This adds significant meaning beyond the input schema, which only has titles and defaults.
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 'Create a new memory entry' with a specific verb and resource. It distinguishes from sibling tools like memory_create_batch, memory_create_issue, etc., which are more specialized.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. The description only lists parameters without any context on prerequisites, limitations, or sibling differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_create_batchC
Create multiple memories in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| entries | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior fully. It only states 'create' (mutation) but omits details on atomicity, limits, side effects, or what the returned output contains, despite an output schema existing.
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 (one sentence) but at the expense of necessary detail. While it is appropriately short, it lacks structure and front-loads only the 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?
Given the batch nature, many sibling tools, and lack of annotations, the description is incomplete. It fails to specify entry structure, batch limits, or behavior expectations, which are critical for correct usage.
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 single parameter 'entries' is an array of objects with no structure described. With 0% schema coverage, the description adds no meaning beyond the schema, failing to clarify required fields or allowed properties.
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 creates multiple memories, distinguishing it from single-create tools like memory_create. The verb 'create' and resource 'memories' are explicit, and the batch aspect is highlighted.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for batch creation but does not explicitly state when to use this tool over alternatives like memory_create, nor does it provide any exclusions or context-dependent guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_create_issueA
Create a new issue/bug memory.
Args: content: Description of the issue status: Issue status - "open" (default) or "closed" closed_reason: If closed, the reason - "complete" or "not_planned" severity: Issue severity - "critical", "major", "minor" (default) component: Component/area affected (e.g., "graph", "storage", "api") category: Issue category (e.g., "bug", "enhancement", "performance")
Returns: Created issue memory with auto-assigned tag "memora/issues"
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | open | |
| content | Yes | ||
| category | No | ||
| severity | No | minor | |
| component | No | ||
| closed_reason | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided. The description discloses the return value and auto-assigned tag, but does not discuss side effects, permissions, or whether it's safe (obviously creates, but no explicit safety info). Partial transparency.
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 structured with Args and Returns sections. It is informative without being verbose, though it could be slightly more concise. Overall well-organized.
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 existence of an output schema (not shown but referenced), the description covers all 6 parameters with 1 required and explains the return. It lacks error cases but is sufficient for a creation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must add meaning. It provides clear explanations for each parameter (e.g., status defaults to 'open', severity options) and clarifies the return value, adding significant value 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 specifies the action ('Create a new issue/bug memory') and resource (issue/bug memory). The name and description distinguish it from siblings like memory_create (generic) and memory_create_todo (todo-specific).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like memory_create or memory_create_todo. The description does not mention when not to use it or any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_create_sectionA
Create a new section/subsection header memory.
Section memories are organizational placeholders that:
Are NOT visible in the graph visualization
Are NOT included in duplicate detection
Do NOT compute embeddings or cross-references
Args: content: Title/description of the section section: Parent section name (e.g., "Architecture", "API") subsection: Subsection path (e.g., "endpoints/auth")
Returns: Created section memory with auto-assigned tag "memora/sections"
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| section | No | ||
| subsection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description fully discloses key behavioral traits: sections are not visible in graph visualization, excluded from duplicate detection, and do not compute embeddings or cross-references. It also notes the auto-assigned tag. This exceeds the burden for a tool with no 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 well-organized with a brief introductory sentence, bullet points for key properties, and an Args section. It is not overly verbose, but the Args section could be integrated more seamlessly. Still, it efficiently conveys necessary 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 presence of an output schema (even if not fully shown), the description mentions the return value (created section memory with auto-assigned tag). All three parameters are documented with context. The description is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by providing brief but clear explanations for each parameter: content is 'Title/description of the section', section is 'Parent section name', subsection is 'Subsection path'. This adds meaning beyond the bare schema, though the explanations are concise.
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 creates a section/subsection header memory, and distinguishes itself from regular memories by listing three specific behavioral differences (not visible in graph, not in duplicate detection, no embeddings/cross-references). This specificity and differentiation from siblings like memory_create warrants a top score.
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?
While the description explains what the tool does, it does not provide explicit guidance on when to use this tool versus alternatives such as memory_create or memory_create_batch. There is no 'when-to-use' or 'when-not-to-use' advice, leaving the agent to infer context from the behavioral differences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_create_todoA
Create a new TODO/task memory.
Args: content: Description of the task status: Task status - "open" (default) or "closed" closed_reason: If closed, the reason - "complete" or "not_planned" priority: Task priority - "high", "medium" (default), "low" category: Task category (e.g., "cloud-backend", "graph-visualization", "docs")
Returns: Created TODO memory with auto-assigned tag "memora/todos"
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | open | |
| content | Yes | ||
| category | No | ||
| priority | No | medium | |
| closed_reason | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries disclosure burden. It mentions auto-tagging and return behavior, but omits side effects (e.g., idempotency, permissions, limits). Adequate but has gaps.
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?
Structured as a clear docstring with section headers. The content is efficient but slightly verbose (e.g., 'Args:' lines are functional). Overall good readability.
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?
Explains all parameters, return value, and auto-tagging. With an output schema present, it doesn't need to detail returns. Lacks only broader context (e.g., relationship to other tools), but 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 0%, so description provides all parameter semantics: content, status, closed_reason, priority, category with defaults and examples. Adds high value beyond the bare 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 'Create a new TODO/task memory,' specifying a distinct resource type (TODO) that differentiates it from sibling tools like memory_create (generic) and memory_create_issue.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like memory_create or memory_create_issue. The description lacks explicit context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_deleteA
Delete a memory by id.
Args: memory_id: Memory ID to delete force: If True, allow deleting document fragments/roots. Use memory_delete_document() instead for clean document removal. reason: Optional tombstone reason (default "deleted")
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | ||
| reason | No | ||
| memory_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description must carry the full burden. It discloses that 'force' allows deleting document fragments/roots, warns this is not the recommended approach for documents, and that 'reason' creates a tombstone marker. This is strong transparency for the destructive nature of 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 is extremely conciseβthree short bullet points in the Args section plus a one-line summary. Every sentence adds unique value: purpose, parameter semantics, and usage guidance. 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 has an output schema (not shown but present), the description need not cover return values. It explains all three parameters, flags destructive behavior, and distinguishes a sibling. However, it does not discuss permissions, cascading effects, or error states, which would be helpful given the tool's destructive nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates. It explains that 'force' enables deletion of document fragments/roots with an alternative tool suggestion, and 'reason' is an optional tombstone reason with a default. This adds significant meaning beyond the schema's bare property 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?
The description uses a specific verb ('Delete') and resource ('memory by id'), clearly identifying the primary action. It also distinguishes itself from the sibling tool 'memory_delete_document' by advising against using 'force' for clean document removal, which clarifies scope.
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 tells when to use 'memory_delete_document' instead of this tool (for clean document removal), providing a clear exclusion. However, it does not discuss other alternatives like memory_unlink or batch operations, nor does it specify prerequisites for deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_delete_batchC
Delete multiple memories by id.
Args: ids: Memory IDs to delete reason: Optional tombstone reason (default "deleted")
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ||
| reason | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility for behavioral disclosure. The term 'tombstone reason' suggests a soft delete, but the description simply says 'delete' without clarifying permanence, atomicity, or side effects. It does not mention whether the operation is reversible, if partial failures occur, or what the response contains.
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 very short, using a clear 'Args:' format. It is efficient with no wasted words, but the informal docstring style and the inaccuracy regarding the default value slightly detract from clarity.
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 high number of sibling tools and the presence of an output schema, the description is insufficient. It does not explain the return value, error handling, or whether the operation is atomic. For a batch delete, crucial details about partial success and idempotency are missing, making the description incomplete for confident 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?
The description adds minimal meaning beyond the schema: it labels 'ids' as 'Memory IDs' and 'reason' as an 'Optional tombstone reason'. However, it contradicts the schema by stating the default for 'reason' is 'deleted' when the schema has 'default: null'. With 0% schema description coverage, the description should provide more accurate and comprehensive parameter semantics.
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 ('Delete multiple memories') and the key identifier ('by id'). This distinguishes it from the singular 'memory_delete' sibling and other batch operations. The verb and resource are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. With over 30 sibling tools, including 'memory_delete' (singular) and various other batch operations, the description does not specify when this batch deletion is appropriate or preferable, nor does it mention any prerequisites or limitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_delete_documentA
Delete a stored document and all its fragments.
Args: document_key: The document identifier version: Optional β delete only this version. If omitted, deletes all versions.
Returns: {deleted_roots: count, deleted_fragments: count, deleted_ids: [...]}
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | ||
| document_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It discloses the destructive nature (delete), the scope (document and all its fragments), and the version behavior (optional, otherwise all versions). However, it omits details like error handling, permission requirements, or irreversibility.
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, using a single sentence for the action and structured bullet points for args and returns. Every sentence adds value, no fluff.
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 low complexity and presence of an output schema, the description provides sufficient context: action, scope, version handling, and return value structure. However, it could mention error cases (e.g., missing document) to be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates by explaining both parameters: 'document_key: The document identifier' and 'version: Optional β delete only this version. If omitted, deletes all versions.' Adds meaning beyond the schema's basic type and default.
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 ('Delete a stored document and all its fragments') and specifies the resource ('document'). It distinguishes itself from siblings like memory_delete by explicitly targeting documents and mentioning fragments, which is unique.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as memory_delete or memory_delete_batch. The description does not specify context, prerequisites, or exclusions, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_detect_supersessionsA
Detect memories that supersede (update/replace) other memories.
Scans existing memories for pairs where one is an evolved/updated version of another, then creates 'supersedes' edges between them. Complements memory_absorb which only catches supersessions at write time.
Uses neutral LLM classification (not biased by timestamps) to determine both the relationship type and direction.
Args: min_similarity: Minimum embedding similarity to consider (default: 0.55) limit: Maximum pairs to analyze with LLM (default: 20) dry_run: If True, preview detections without creating edges (default: True) tags_any: Only consider memories with any of these tags min_confidence: Minimum LLM confidence to accept (default: 0.75)
Returns: Dictionary with candidates found, analyzed count, detected supersessions, and detailed results for each pair.
Rate limited: 120s cooldown.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| dry_run | No | ||
| tags_any | No | ||
| min_confidence | No | ||
| min_similarity | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: uses neutral LLM classification, creates edges, supports dry-run, and has a 120s rate limit. It does not mention idempotency, side effects beyond edge creation, or required permissions. Since no annotations are present, the description carries the full burden and does a good job overall.
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 well-structured: a concise purpose statement, functional explanation, bulleted args, return summary, and rate limit note. It is front-loaded with the most critical information and contains no redundant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, mechanism (LLM), parameters, return format, and rate limiting, and differentiates from a sibling. It lacks mentions of prerequisites (e.g., pre-existing embeddings) or performance implications, which would enhance completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description compensates by listing all five parameters with clear purposes, defaults, and explanations (e.g., dry_run for preview). This adds significant meaning beyond the raw 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 it detects memories that supersede others, scans for pairs, and creates edges. It distinguishes itself from memory_absorb which catches supersessions at write time.
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 mentions that it complements memory_absorb, implying it is for retroactive detection. However, it does not provide explicit when-not-to-use scenarios or alternative tools under specific conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_digestA
Return a deterministic digest of memories related to a topic.
The digest is an aggregation surface for agents that need current context, not a narrative generator. It combines active hybrid-search hits, optional supersession lineage, related memory ids, and matching TODO/issue memories. Raw source ids are always returned so callers can inspect primitives if the digest is too broad or too narrow.
Args: topic: Subject to digest. k: Maximum active search hits and TODO/issue matches to include. include_lineage: Include supersession history for active hits. include_todos: Include matching memora/todos and memora/issues entries. include_related_hops: Number of cross-reference hops to collect, capped at 3. synthesize: Reserved for future LLM synthesis. False by default. preview_chars: Preview length per returned memory. tags_any: Restrict hybrid search and discovered TODO/issue matches to memories with any of these tags. tags_all: Restrict hybrid search and discovered TODO/issue matches to memories with all of these tags. metadata_filters: Optional metadata filters. date_from: Optional created_at lower bound (ISO or relative like "7d"). date_to: Optional created_at upper bound (ISO or relative like "7d"). seed_ids: Explicit memory ids to include as source memories and expand lineage/related from. debug: Include ranked candidates, applied filters, and seed/filter notes.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | ||
| debug | No | ||
| topic | Yes | ||
| date_to | No | ||
| seed_ids | No | ||
| tags_all | No | ||
| tags_any | No | ||
| date_from | No | ||
| synthesize | No | ||
| include_todos | No | ||
| preview_chars | No | ||
| include_lineage | No | ||
| metadata_filters | No | ||
| include_related_hops | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden for behavioral disclosure. It thoroughly describes the tool's behavior: deterministic, combines hybrid-search hits, supersession lineage, related memory ids, and TODO/issue matches. It also notes always returning raw source ids. However, it does not explicitly state read-only nature or auth requirements, but the description is adequate for a read operation.
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 well-structured with a summary paragraph followed by a parameter list. It is front-loaded with the core purpose. Although slightly verbose, every sentence adds value, and the format aids readability.
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 (14 parameters, no annotations, but has output schema), the description covers all key aspects: what the digest includes, parameter behaviors, and the guarantee of returning raw source ids. The presence of an output schema means return value details are not required, but the description still provides useful context about the output composition.
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 description provides a detailed Args section explaining each parameter's purpose and default values (e.g., topic: 'Subject to digest', k: 'Maximum active search hits and TODO/issue matches'). Since schema description coverage is 0%, the description adds essential meaning beyond the schema's basic type and name, fully compensating for the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a deterministic digest of memories related to a topic. It specifies the verb ('return') and resource ('memories digest'), distinguishes from narrative generation, and differentiates from sibling tools like memory_hybrid_search or memory_get by focusing on aggregation.
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 context for when to use the tool ('agents that need current context') and includes guidance that raw source ids are returned for inspecting primitives if the digest is too broad or narrow. However, it lacks explicit alternatives or when-not-to-use scenarios, which would improve clarity given the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_events_clearB
Mark events as consumed.
Args: event_ids: List of event IDs to mark as consumed
Returns: Dictionary with count of cleared events
| Name | Required | Description | Default |
|---|---|---|---|
| event_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not disclose whether 'mark as consumed' is destructive or reversible, nor does it mention idempotency or side effects. No annotations exist to supplement, so the agent lacks critical behavioral insight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with a single action sentence and clear Args/Returns sections. Every word earns its place, with no fluff.
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 a simple single-parameter tool with an output schema, the description is adequate. However, it lacks context on the event lifecycle and relationship to siblings, making it slightly incomplete for full autonomous 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?
With 0% schema coverage, the description adds basic meaning by stating event_ids are IDs to mark as consumed. However, it does not specify constraints like uniqueness, range, or behavior for invalid IDs.
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 marks events as consumed, with a specific verb and resource. It differentiates from sibling 'memory_events_poll' by indicating a different operation on events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool vs alternatives like memory_events_poll. There are no prerequisites or conditions for clearing events, leaving the agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_events_pollA
Poll for memory events (e.g., shared-cache notifications).
Args: since_timestamp: Only return events after this timestamp (ISO format) tags_filter: Only return events with these tags (e.g., ["shared-cache"]) unconsumed_only: Only return unconsumed events (default: True)
Returns: Dictionary with count and list of events
| Name | Required | Description | Default |
|---|---|---|---|
| tags_filter | No | ||
| since_timestamp | No | ||
| unconsumed_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral aspects. It explains parameters and return structure, but it omits side effects (e.g., does polling mark events as consumed?) and idempotency details. The description mentions 'unconsumed_only' implying consumption states, but does not clarify 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?
The description is concise and well-structured, using bullet points for arguments and return. It is front-loaded with the purpose and avoids unnecessary details. Every sentence adds value without 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 the tool has 3 optional parameters, no annotations, and an output schema, the description covers purpose and parameters well. However, it lacks context on how polling fits into the broader workflow (e.g., repeated polling, clearing events), which slightly reduces completeness.
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 description fully explains all three parameters, including format for since_timestamp (ISO), example for tags_filter (e.g., ["shared-cache"]), and default behavior for unconsumed_only (default: True). This adds significant value beyond the input schema, which has 0% description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Poll for memory events (e.g., shared-cache notifications)'. It specifies the verb 'Poll' and the resource 'memory events' with a concrete example, distinguishing it from sibling tools like memory_list or memory_events_clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool vs alternatives. For example, it does not explain that polling is for retrieving new events, nor does it mention related tools like memory_events_clear for clearing events.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_exportA
Export all memories to JSON format for backup or transfer. Rate limited: 60s cooldown.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description adds the rate limit ('60s cooldown'), which is a crucial behavioral trait. It also implies a non-destructive read operation, though it doesn't detail potential size impacts.
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, front-loaded with purpose and ending with rate limit. No redundant words 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?
Given zero parameters, an existing output schema, and the tool's simple nature, the description fully covers purpose and constraints. The rate limit is a valuable addition for planning.
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 zero parameters, schema coverage is 100%. The description adds no parameter info but correctly states what the tool does (exports all memories). Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Export all memories to JSON format for backup or transfer', with a specific verb (Export), resource (all memories), format (JSON), and purpose (backup or transfer). This distinguishes it from siblings like memory_export_graph.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for backup or transfer, but does not explicitly mention when not to use or compare with alternatives like memory_export_graph or memory_import. The context is clear but lacks exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_export_graphA
Export memories as interactive HTML knowledge graph.
Args: output_path: Path to save HTML file (default: ~/memories_graph.html) min_score: Minimum similarity score for edges (default: 0.25)
Returns: Dictionary with path, node count, edge count, and tags
| Name | Required | Description | Default |
|---|---|---|---|
| min_score | No | ||
| output_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description covers return structure but lacks details on permissions, errors, or performance.
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?
Very concise with clear args/returns structure; front-loaded with main purpose.
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?
Well-suited for a simple export tool with output schema; covers key aspects without being verbose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but description explains both parameters with defaults and purpose, compensating well.
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 exports memories as an interactive HTML knowledge graph, with specific output format and parameters.
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 basic arguments and returns, but lacks explicit guidance on when to use this tool versus alternatives like memory_export.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_find_duplicatesA
Find potential duplicate memory pairs with optional LLM-powered comparison.
Scans cross-references to find memory pairs with similarity >= threshold, then optionally uses LLM to semantically compare them. Uses the same threshold (0.85) as the graph UI duplicate detection.
Args: min_similarity: Minimum similarity score to consider (default: 0.85) max_similarity: Maximum similarity score (default: 1.0, kept for backward compatibility) limit: Maximum pairs to analyze (default: 10) use_llm: Whether to use LLM for semantic comparison (default: True)
Returns: Dictionary with: - pairs: List of potential duplicate pairs with analysis - total_candidates: Total pairs found - analyzed: Number of pairs analyzed with LLM - llm_available: Whether LLM comparison was available
Rate limited: 120s cooldown.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| use_llm | No | ||
| max_similarity | No | ||
| min_similarity | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully discloses behavior: scanning cross-references, similarity threshold, optional LLM comparison, rate limiting (120s cooldown). It also describes the return structure in detail.
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 well-organized: a concise summary, process explanation, parameter list, return dictionary, and rate limit note. Every sentence adds value without 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 the tool's complexity and lack of annotations, the description covers all necessary aspects: purpose, parameters, return values, rate limiting, and alignment with UI. It is comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description explains all four parameters with defaults and added context, e.g., max_similarity is for backward compatibility, use_llm controls semantic comparison. This goes well 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 explicitly states the tool's purpose: 'Find potential duplicate memory pairs with optional LLM-powered comparison.' It specifies the mechanism (scans cross-references, similarity threshold), and distinguishes it by mentioning alignment with graph UI duplicate detection.
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 context, such as default threshold and optional LLM use. It mentions alignment with UI but does not explicitly state when not to use this tool or suggest alternatives among siblings like memory_merge.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_getA
Retrieve a single memory by id (full content by default).
Args:
memory_id: ID of the memory to retrieve
include_images: If False, strip image data from metadata to reduce response size
fields: Optional list of fields to return (e.g. ["id","content","tags"]). None returns all fields.
follow: Lineage mode. Default latest (resolve superseded id to the current leaf).
full_history adds a history key with all versions root-to-leaf;
all returns the exact requested id with no chain walk (forensic).
Omitting follow is NOT unfiltered β it means resolve to latest.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| follow | No | ||
| memory_id | Yes | ||
| include_images | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the default return behavior (full content), the effect of include_images and fields parameters on the response, and the lineage resolution modes for follow (latest, full_history, all), including the crucial note that omitting follow is not unfiltered but resolves to latest. This is thorough for a read operation, though it does not explicitly state that this is a non-destructive retrieval.
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 front-loaded with the core purpose in a single sentence, followed by a structured parameter list. It is concise for its complexityβno wasted words. However, the parameter documentation could be slightly more condensed, and the overall length is justified by the richness of the follow parameter.
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 that an output schema exists (context signal shows 'Has output schema: true'), the description does not need to detail return values. It adequately covers all four parameters, including the nuanced follow behavior. It might mention that it returns a single memory object, but 'full content' implies that. For a single-item retrieval tool with lineage options, the description is complete enough for correct agent usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% parameter description coverage, so the description must compensate entirely. It explains all four parameters: memory_id (ID to retrieve), include_images (strip image data), fields (optional list to filter returned fields), and follow (lineage mode with three explicit options and a clarifying note). Each parameter adds meaning beyond the schema's type and default, making selection and invocation easy.
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 'Retrieve a single memory by id', specifying the verb 'Retrieve' and the precise resource with a unique identifier. This distinguishes it from siblings like memory_list (which lists multiple memories) and memory_get_document (for documents), making the tool's purpose unambiguous.
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 does not explicitly state when to use this tool versus alternatives, nor does it mention when not to use it. The usage context is implied (when you need a specific memory by ID), but there is no guidance on exclusions or comparisons to siblings like memory_list or memory_semantic_search. The 'follow' parameter hints at different use cases, but overall usage guidelines are lacking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_get_documentA
Retrieve a stored document and its fragments by document key.
Args: document_key: The document identifier used during storage content_mode: "preview" (default) or "full" for fragment content preview_chars: Max chars for preview mode (default: 120) node_kinds: Optional filter β e.g. ["claim", "plan_item"] for specific fragment types version: Optional version filter. If omitted, returns the latest version.
Returns: {root: {...}, fragments: [...] ordered by ordinal, document_key, version}
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | ||
| node_kinds | No | ||
| content_mode | No | preview | |
| document_key | Yes | ||
| preview_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It explains the return structure (root and fragments) and behavior of optional parameters (e.g., version defaults to latest). It does not disclose side effects or permissions, but for a read operation this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a well-structured docstring with Args and Returns sections. Every sentence provides necessary information without redundancy. It is concise and front-loaded with the core purpose.
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 output schema exists, the description complements it by detailing parameter semantics and the layout of returned data. No critical information is missing for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description thoroughly explains each parameter: document_key is the identifier, content_mode has 'preview' or 'full', preview_chars max characters, node_kinds filters fragment types, version is optional. This fully compensates for the missing schema 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 'Retrieve a stored document and its fragments by document key,' which is a specific verb and resource. The purpose is unambiguous and distinct from sibling tools like memory_store_document (store) and memory_get (which retrieves individual entries).
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 context on when to use the tool (retrieve a document by key) but does not explicitly mention when not to use it or list alternatives. However, the purpose and parameter details are sufficient for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_hierarchyC
Return memories organised into a hierarchy derived from their metadata.
Args: compact: If True (default), return only id, preview (first 80 chars), and tags per memory to reduce response size. Set to False for full memory data.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| compact | No | ||
| date_to | No | ||
| tags_all | No | ||
| tags_any | No | ||
| date_from | No | ||
| tags_none | No | ||
| include_root | No | ||
| metadata_filters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full weight. It only discloses the compact parameter behavior (reduced response size) but omits critical behaviors like pagination, hierarchy depth, sorting, potential performance impact, or whether queries are required. The description is insufficient for safe invocation.
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 short but not optimally front-loaded; the core purpose is stated first, but the Args section is sparse and only covers one parameter. Could be more concise and structured to highlight key parameters and behavior.
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 9 parameters, nested objects in the schema, and a provided output schema (unseen), the description is grossly incomplete. It fails to explain the hierarchy structure, parameter combinations, filtering, or return format, leaving significant gaps for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the input schema provides no parameter descriptions. The description only explains the 'compact' parameter (1 out of 9). Other parameters like query, metadata_filters, date_from, date_to, tags_any, tags_all, tags_none, include_root receive no explanation, leaving the agent unable to use them correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns memories organized into a hierarchy from metadata, using the verb 'Return' and specifying the resource 'memories' and the structure 'hierarchy'. This distinguishes it from siblings like memory_list (flat list) and memory_related (related items).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as memory_list, memory_hybrid_search, or memory_tag_hierarchy. The description lacks explicit context, when-not-to-use, or mention of prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_hybrid_searchA
Perform a hybrid search combining keyword (FTS) and semantic (vector) search.
Uses Reciprocal Rank Fusion (RRF) to merge results from both search methods, providing better results than either method alone.
Returns compact previews by default. Use content_mode="full" for complete content. Use memory_get to fetch full content for specific IDs.
Args:
query: Search query text
semantic_weight: Weight for semantic results (0-1). Higher values favor semantic similarity.
Keyword weight = 1 - semantic_weight. Default: 0.6 (60% semantic, 40% keyword)
top_k: Maximum number of results (legacy name; default 10 if neither limit nor top_k)
limit: Alias for top_k β preferred name; honored so callers matching memory_list work
min_score: Minimum combined score threshold (default: 0.0)
metadata_filters: Optional metadata filters
date_from: Optional date filter (ISO format or relative like "7d", "1m", "1y")
date_to: Optional date filter (ISO format or relative)
tags_any: Match memories with ANY of these tags (OR logic)
tags_all: Match memories with ALL of these tags (AND logic)
tags_none: Exclude memories with ANY of these tags (NOT logic)
content_mode: "preview" (default) returns truncated content_preview; "full" returns complete content
preview_chars: Max chars for preview (default: 300, ignored when content_mode="full")
fields: Optional list of fields to return. Include "score" to keep {memory, score} envelope;
omit "score" for flat list of memory dicts.
follow: Lineage mode. Default active (excludes superseded memories).
latest / full_history as documented on memory_list;
all is the explicit unfiltered forensic escape hatch.
Omitting follow is NOT unfiltered β it means the safe default.
Returns: Dictionary with count and list of results, each containing score and memory
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| top_k | No | ||
| fields | No | ||
| follow | No | ||
| date_to | No | ||
| tags_all | No | ||
| tags_any | No | ||
| date_from | No | ||
| min_score | No | ||
| tags_none | No | ||
| content_mode | No | preview | |
| preview_chars | No | ||
| semantic_weight | No | ||
| metadata_filters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does an outstanding job: explains the RRF algorithm, default content mode, preview behavior, the follow parameter's lineage logic, and the fields parameter's effect on output envelope. Minor deduction for not explicitly stating whether the operation is read-only (though clearly implied).
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 well-structured with clear sections for behavior details, Args, and Returns. It front-loads the core purpose and algorithm. Some minor verbosity in the 'follow' description with inline references to other tools, but this is justified for clarity given the tool's complexity.
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 high complexity (15 params, nested objects, hybrid algorithm), the description is remarkably complete. It addresses search behavior, return formats, filtering options, and alternate tools. The output schema exists, so return value explanation is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate for all 15 parameters. It does: every parameter gets a clear explanation, including defaults, relationships (semantic_weight vs 1 - semantic_weight), aliases (limit vs top_k), and behavioral nuances (follow default is not unfiltered). Goes far beyond what the schema provides.
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 'Perform a hybrid search' and specifies the resources involved (keyword FTS and semantic vector search). It distinguishes itself from sibling tools by explaining the hybrid nature and RRF merging, making it clear what unique value this tool provides.
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 excellent usage guidance, explaining when to use this tool (when better results are needed than either method alone) and when to use alternatives (memory_get for full content retrieval). It also clarifies parameter relationships, like the semantic_weight vs keyword weight balance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_importA
Import memories from JSON format. Rate limited: 60s cooldown.
Args: data: List of memory dictionaries with content, metadata, tags, created_at strategy: "replace" (clear all first), "merge" (skip duplicates), or "append" (add all)
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| strategy | No | append |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description takes full burden. It reveals rate limiting, and describes the side effects of each strategy (e.g., 'replace' clears all memories first). This is valuable beyond what structured fields provide, though it could mention whether the operation is atomic or rolls back on failure.
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?
Extremely concise, front-loaded with the core purpose, followed by essential details on rate limiting and arguments. Every sentence is necessary, no fluff.
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 (import strategies, rate limiting), the description covers key aspects: what it does, how arguments work, and behavioral constraints. It does not mention error handling or maximum data size, but the presence of an output schema partially compensates for missing return value explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must compensate. It explains the 'data' parameter as a list of memory dictionaries with expected keys (content, metadata, tags, created_at), and the 'strategy' parameter with its three options and meanings. This adds significant value over the bare 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 ('Import memories') and resource ('from JSON format'), distinguishing it from many sibling tools like memory_create, memory_merge, etc. The verb 'import' and specific format 'JSON' make the purpose unambiguous.
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 rate limiting guidance ('60s cooldown') and explains three strategies (replace, merge, append) with their behaviors. However, it does not explicitly compare to sibling tools or state when to use this tool over alternatives like memory_create_batch or memory_merge, but the context is sufficient for most cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_insightsB
Analyze stored memories and produce actionable insights.
Returns activity summary, open items, consolidation suggestions, and optional LLM-powered pattern detection.
Args: period: Time period to analyze (e.g., "7d", "1m", "1y") include_llm_analysis: If True, use LLM to detect patterns and themes
Returns: Dictionary with: - activity_summary: Created counts by type and tag - open_items: Open TODOs and issues with stale detection - consolidation_candidates: Similar memory pairs that could be merged - llm_analysis: Themes, focus areas, gaps, and summary (or null) Rate limited: 120s cooldown.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | 7d | |
| include_llm_analysis | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Mentions rate limiting (120s cooldown), which is helpful. Implies read-only operation via 'analyze' and 'returns' but does not explicitly state it does not modify data. Lacks details on potential costs or time for LLM analysis.
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?
Structured with Args and Returns sections, but includes some redundancy and could be more concise. The rate limit info is placed at the end, somewhat separate from the main description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers parameters, return values, and rate limit. Has output schema available in context, so description's detail on returns is appropriate. Lacks prerequisites or error conditions but is generally sufficient for its scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description compensates well. Provides example values for 'period' and explains effect of 'include_llm_analysis'. Adds meaning beyond the bare 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 analyzes memories and produces actionable insights, listing returns like activity summary, open items, etc. However, it does not differentiate from similar analysis tools like memory_stats or memory_clusters, so some ambiguity remains among 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?
No explicit guidance on when to use this tool versus alternatives. The description explains what it does but does not mention scenarios or conditions for use, nor when to avoid it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_linkA
Create an explicit typed link between two memories.
Args: from_id: Source memory ID to_id: Target memory ID edge_type: Type of relationship. Options: - "references" (default): General reference - "implements": Source implements/realizes target - "supersedes": Source replaces/updates target - "extends": Source builds upon target - "contradicts": Source conflicts with target - "related_to": Generic relationship bidirectional: If True, also create reverse link (default: True)
Returns: Dict with created links and their types
| Name | Required | Description | Default |
|---|---|---|---|
| to_id | Yes | ||
| from_id | Yes | ||
| edge_type | No | references | |
| bidirectional | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It explains the edge_type options and bidirectional behavior, but lacks details on idempotency, validation, or failure conditions.
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?
Brief first-line summary followed by structured Args section. No redundant sentences; all sentences add 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 4 parameters, no annotations, and existence of output schema, the description is fairly complete. It explains the tool's purpose, parameters, and return value, but omits preconditions like memory existence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description provides full meaning for all 4 parameters, including explanations for edge_type options and bidirectional's reverse link creation.
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 'create' and the resource 'explicit typed link between two memories'. It distinguishes from siblings like memory_unlink, which removes links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., memory_merge). It does not indicate when not to use or provide context for using different edge types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_listA
List memories, optionally filtering by substring query or metadata.
Returns compact previews by default to reduce context usage.
Use content_mode="full" when you need the complete content.
Use memory_get to fetch full content for specific IDs.
Args:
query: Optional text search query
metadata_filters: Optional metadata filters
limit: Maximum results (default: 20). Pass -1 for unlimited.
offset: Number of filtered results to skip (default: 0)
date_from: Optional date filter (ISO format or relative like "7d", "1m", "1y")
date_to: Optional date filter (ISO format or relative like "7d", "1m", "1y")
tags_any: Match memories with ANY of these tags (OR logic)
tags_all: Match memories with ALL of these tags (AND logic)
tags_none: Exclude memories with ANY of these tags (NOT logic)
sort_by_importance: Sort results by importance score (default: False, sorts by date)
content_mode: "preview" (default) returns truncated content_preview; "full" returns complete content
preview_chars: Max chars for preview (default: 120, ignored when content_mode="full")
fields: Optional list of fields to return (e.g. ["id","content_preview","tags"]). None returns all fields.
follow: Lineage mode. Default active (excludes superseded memories).
latest resolves each hit to its current version;
full_history expands supersession chains;
all is the explicit unfiltered forensic escape hatch (includes superseded).
Omitting follow is NOT unfiltered β it means the safe default.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| fields | No | ||
| follow | No | ||
| offset | No | ||
| date_to | No | ||
| tags_all | No | ||
| tags_any | No | ||
| date_from | No | ||
| tags_none | No | ||
| content_mode | No | preview | |
| preview_chars | No | ||
| metadata_filters | No | ||
| sort_by_importance | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, but the description compensates thoroughly. It discloses default behavior (preview mode, sort by date, safe follow mode), explains context usage reduction, and provides detailed behavioral notes for parameters like limit=-1 and follow. No contradictions exist.
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 well-structured with a brief introductory paragraph, usage recommendations, a detailed args section, and clear formatting. Every sentence adds value without redundancy. It is appropriately sized for a complex tool with 14 parameters.
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 high parameter count (14), no annotations, and presence of an output schema, the description is fully complete. It covers all filtering, sorting, pagination, lineage modes, and field selection. The output schema exists, so return values are not required. This is a model description for a complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully explain parameters. It does so comprehensively: each parameter's purpose, defaults (e.g., limit=20, preview_chars=120), special values (limit=-1), filtering logic (tags_any vs. tags_all), date formats (ISO or relative), and dependencies (content_mode affects preview_chars). This adds rich meaning beyond the bare 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 tool lists memories with optional filtering by substring query or metadata. It explicitly distinguishes the default preview behavior from the full content mode and references sibling tools like memory_get for fetching full content by ID. This makes the purpose specific and distinct.
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 guidance on when to use different modes (preview vs. full), references a sibling tool (memory_get) for targeted retrieval, and explains the follow parameter options in detail, including safe defaults and when to use each lineage mode. This gives clear context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_list_compactA
[Deprecated] List memories in compact format (id, preview, tags only).
Prefer memory_list which now defaults to compact previews with richer
fields and configurable content_mode/preview_chars.
Returns minimal fields: id, content preview (first 80 chars), tags, and created_at.
Args: query: Optional text search query metadata_filters: Optional metadata filters limit: Maximum number of results to return (default: unlimited) offset: Number of results to skip (default: 0) date_from: Optional date filter (ISO format or relative like "7d", "1m", "1y") date_to: Optional date filter (ISO format or relative like "7d", "1m", "1y") tags_any: Match memories with ANY of these tags (OR logic) tags_all: Match memories with ALL of these tags (AND logic) tags_none: Exclude memories with ANY of these tags (NOT logic)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| offset | No | ||
| date_to | No | ||
| tags_all | No | ||
| tags_any | No | ||
| date_from | No | ||
| tags_none | No | ||
| metadata_filters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description fully carries the burden. It transparently lists the exact return fields (id, content preview first 80 chars, tags, created_at) and implies a read-only operation by describing a list action. A slight deduction for not explicitly stating it's read-only, but the output details are comprehensive.
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 well-structured with a deprecation warning first, then the parameter list in a clear Args section. It could be slightly more concise by shortening some parameter explanations, but overall it's organized and easy to scan.
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 presence of an output schema (not shown but indicated), the description already covers the return fields. All parameters are explained, usage context is given (deprecated, prefer alternative), and no gaps remain for an agent to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description compensates fully by providing clear, plain-English explanations for all 9 parameters, including defaults and format expectations for date filters and tag logic.
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 lists memories in compact format with specific fields (id, preview, tags only) and distinguishes itself from sibling tool memory_list which now defaults to compact previews with richer fields.
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 clearly advises against using this tool by labeling it deprecated and directing users to memory_list instead, which provides richer fields and configurable options. This explicit when-not-to-use guidance exceeds typical usage guidelines.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_mergeA
Merge source memory into target, then delete source.
Combines two memories into one, preserving content and metadata.
Args: source_id: Memory ID to merge from (will be deleted) target_id: Memory ID to merge into (will be updated) merge_strategy: How to combine content: - "append": Append source content to target (default) - "prepend": Prepend source content to target - "replace": Replace target content with source
Returns: Updated target memory and deletion confirmation
| Name | Required | Description | Default |
|---|---|---|---|
| source_id | Yes | ||
| target_id | Yes | ||
| merge_strategy | No | append |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully describes behavior: source will be deleted, target updated, and content merged according to strategy. It also mentions preserving content and metadata and lists the expected return value. 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?
The description is well-structured: a concise summary line followed by a detailed Args block and Returns. Every sentence adds value, with no repetition or filler. The parameter explanations are 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?
The description is complete for a merge tool. It covers both source and target behavior, merge strategies, and return value. Despite having an output schema, the description provides sufficient understanding of the tool's operation.
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 has 0% description coverage (no parameter descriptions), so the description compensates fully. It explains source_id, target_id, and merge_strategy with clear semantics and even enumerates the three strategies (append, prepend, replace).
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 merges source memory into target and deletes the source. It specifies the resource (memory), the action (merge), and the outcome (delete source), distinguishing it from similar tools like memory_absorb which may not delete the source.
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 does not provide guidance on when to use this tool versus alternatives like memory_absorb or memory_update. It explains the merge strategies but lacks explicit when-to-use or when-not-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_migrate_imagesA
Migrate existing base64 images to R2 storage.
Scans all memories and uploads any base64-encoded images to R2, replacing the data URIs with R2 URLs.
Args: dry_run: If True, only report what would be migrated without making changes
Returns: Dictionary with migration results including count of migrated images
Rate limited: 300s cooldown.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It explains that the tool scans all memories, uploads to R2, and has a rate limit. The dry_run parameter and return dictionary are described. More detail on side effects or safety would improve it.
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: a single sentence for purpose, followed by structured Args and Returns sections. No extraneous information, and the rate limit note is included efficiently.
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 key aspects: purpose, parameter, return value, and rate limiting. An output schema exists, so return details are handled. Missing details like failure handling or progress are minor given the tool's scope.
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?
Only one parameter (dry_run) with 0% schema description coverage. The description adds meaning by explaining it reports what would be migrated without making changes, which is valuable 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 tool migrates base64 images to R2 storage, scanning memories and replacing data URIs. It distinguishes from sibling tools like memory_upload_image and other memory utilities.
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 mentions the dry_run parameter for testing and a rate limit of 300s cooldown. It does not explicitly state when to use vs alternatives, but the purpose is clear enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_rebuild_crossrefsA
Recompute cross-reference links for all memories. Rate limited: 300s cooldown.
Use this periodically (or after bulk imports) to close the eventual-consistency
gap in the related graph β see memory_related for the consistency model.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description mentions rate limiting (300s cooldown) but lacks details on side effects, authorization needs, or performance impact. Adequate but could be more comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words; front-loaded with the main action and followed by usage guidance.
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 parameters, an output schema exists, and the description explains purpose, usage context, and references a related tool for consistency model. Complete for a maintenance 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?
No parameters; schema coverage 100% trivially. Description adds value by mentioning rate limit, though baseline for 0 params is 4.
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?
Clear verb+resource: 'Recompute cross-reference links for all memories.' Distinct from siblings like memory_related which deals with the consistency model.
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?
Explicit guidance: 'Use this periodically (or after bulk imports) to close the eventual-consistency gap' and references sibling tool memory_related for the consistency model.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_rebuild_embeddingsA
Recompute embeddings for all memories. Rate limited: 300s cooldown.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the rate limit cooldown, which is a critical behavioral trait. However, it does not mention resource usage, potential impacts on existing data, or whether the operation is long-running.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff. The first sentence states the purpose clearly, and the second adds an important behavioral constraint. Every word 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?
Given the tool has no parameters and has an output schema (not shown but indicated), the description is mostly complete. However, it lacks information about the output or return value, and could benefit from explaining typical use cases (e.g., after data updates). Despite this, it covers the essential behavioral aspect of rate limiting.
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 has no parameters, and schema description coverage is 100%. With zero parameters, the baseline is 4. The description does not need to add parameter information, and it does not introduce any confusion.
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 purpose: 'Recompute embeddings for all memories.' It uses a specific verb and resource, and it distinguishes itself from sibling tools like memory_create or memory_rebuild_crossrefs by specifying a unique 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 mentions a rate limit (300s cooldown) which signals that this tool is not for frequent use, but it does not provide explicit guidance on when to use it versus alternatives. No exclusion criteria or alternative suggestions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_semantic_searchA
Perform a semantic search using vector embeddings.
Returns compact previews by default. Use content_mode="full" for complete content.
Args:
query: Search query text
top_k: Maximum number of results (legacy name; default 5 if neither limit nor top_k)
limit: Alias for top_k β preferred name; honored so callers matching memory_list work
metadata_filters: Optional metadata filters
min_score: Minimum similarity score threshold
content_mode: "preview" (default) returns truncated content_preview; "full" returns complete content
preview_chars: Max chars for preview (default: 300, ignored when content_mode="full")
fields: Optional list of fields to return. Include "score" to keep {memory, score} envelope;
omit "score" for flat list of memory dicts.
follow: Lineage mode. Default active (excludes superseded memories).
latest / full_history as documented on memory_list;
all is the explicit unfiltered forensic escape hatch.
Omitting follow is NOT unfiltered β it means the safe default.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| top_k | No | ||
| fields | No | ||
| follow | No | ||
| min_score | No | ||
| content_mode | No | preview | |
| preview_chars | No | ||
| metadata_filters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It thoroughly discloses behavioral traits: default content_mode='preview', preview_chars=300, the alias relationship between limit and top_k, the effect of fields on result envelope, and the nuanced follow parameter. It also clarifies that omitting follow is not unfiltered, which prevents misinterpretation.
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 well-structured with a high-level purpose line, then a bulleted Args section. It is thorough but slightly verbose (e.g., the follow parameter explanation could be more concise). The front-loading of purpose is effective.
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 (9 parameters, nested objects, output schema exists), the description covers all necessary aspects: return format (envelope vs flat list), content modes, follow lineage, and metadata filters. The output schema already documents return structure, so the description's focus on parameter behavior and result variant is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the input schema provides only names and types. The description compensates fully by detailing all 9 parameters in the Args block, including the meaning of each, defaults, and the alias. This adds essential value 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 starts with 'Perform a semantic search using vector embeddings,' which is a specific verb+resource combination. It clearly distinguishes from sibling tools like memory_list (non-semantic list) and memory_hybrid_search (hybrid approach), as it focuses purely on vector embeddings.
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 context for parameters like content_mode, follow, and fields. It mentions that 'omitting follow is NOT unfiltered' and references memory_list for follow mode documentation. However, it does not explicitly state when to use this tool over alternatives (e.g., memory_hybrid_search), leaving some implicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_statsA
Get statistics and analytics about stored memories.
Also reports WHICH DATABASE this session is bound to (memora #997). A valid-but-wrong database name in a workspace's .mcp.json is otherwise undetectable: every tool works, reads succeed, and writes land silently in another project's store. Reporting the bound identity is what makes that drift visible to an agent or an operator at all.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it does substantial work: it discloses that the tool reports statistics, identifies the bound database, and explains why that reporting matters. It does not explicitly state read-only behavior, but the verb 'Get' strongly implies it for a zero-parameter stats 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 main purpose is front-loaded in the first sentence, and the additional explanation of database-drift detection earns its place because it tells an agent why the tool matters. The wording is a bit verbose for such a simple tool, but the length is justified by the non-obvious context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, no annotations, and an existing output schema, the description covers the essential functional context including the unique database-identity reporting. It stops short of 5 because it does not acknowledge or differentiate the closely related sibling tools that also provide memory analytics or insights.
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 zero parameters and schema description coverage is 100%, so there is no parameter semantics for the description to add. The baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Get') and resource ('stored memories'), and also identifies a distinctive secondary output (the bound database identity). It falls short of a 5 because it does not distinguish this tool from sibling memory_insights or memory_digest, which could plausibly offer overlapping statistics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a key use case: detecting database drift by reporting which database the session is bound to. However, it never explicitly says when to use this tool versus memory_insights or other memory analytics siblings, and no exclusions or alternative routing are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_store_documentA
Store a structured document as a root memory + searchable fragments.
Parses markdown into typed fragments (claims, plan items, references, risks, section chunks) that are individually searchable while the full document remains retrievable as a unit.
Args: content: Full markdown document content document_key: Stable identifier (e.g. "research/memora-enhancements-2026-04-08") version: Document version (default: 1). If >1, supersedes previous version. tags: Tags applied to root and fragments metadata: Additional metadata merged into root and fragments skip_fragment_crossrefs: If True, fragments skip crossref computation (default: True)
Returns: {document_key, root_id, fragment_count, node_map: {node_kind: [ids]}}
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| content | Yes | ||
| version | No | ||
| metadata | No | ||
| document_key | Yes | ||
| skip_fragment_crossrefs | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains parsing, fragment searchability, version superseding, and crossref skipping. It does not mention destructive actions or auth, but for a store operation, this is sufficient.
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 somewhat lengthy but well-structured with a leading summary and Args/Returns sections. It is informative without being verbose, earning its sentences.
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 (markdown parsing, multiple fragment types, crossrefs) and the presence of an output schema (not shown here but implied), the description covers return format and key behaviors. It is complete for agent usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain all parameters. It does so thoroughly: content as full markdown, document_key as stable identifier, version default 1, tags applied, metadata merged, skip_fragment_crossrefs default True. Every parameter is given meaningful context.
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 stores a structured document as 'root memory + searchable fragments', with a specific verb 'store' and resource 'document'. It distinguishes from siblings like memory_create by explaining the markdown parsing and fragment creation, which is unique.
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 implicitly indicates usage for storing markdown documents with automatic parsing, but does not explicitly contrast with alternatives like memory_create for simple memories. Still, the purpose is clear enough for an agent to know when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_tag_hierarchyB
Return stored tags organised as a namespace hierarchy.
| Name | Required | Description | Default |
|---|---|---|---|
| include_root | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only states the function but does not disclose behavioral traits such as read-only nature, side effects, or requirements. For a read operation, the description should at least imply safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 7 words, front-loaded with the verb and resource. No unnecessary information is present.
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?
While the output schema exists, the description lacks explanation of parameter semantics and usage context. For a simple tool with one optional parameter, the description is minimally adequate but could still benefit from specifying what 'namespace hierarchy' means and when 'include_root' matters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the description does not mention the only parameter 'include_root'. The parameter's purpose (e.g., whether to include root node in hierarchy) is left undocumented, leaving the agent to infer from the name alone.
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 'Return' and the resource 'stored tags', and specifies the output organization as 'a namespace hierarchy', which distinguishes it from sibling tools like 'memory_tags' (likely flat) and 'memory_hierarchy' (possibly different context).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'memory_tags' or 'memory_hierarchy'. There is no mention of prerequisites, context, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_tagsB
Return the allowlisted tags.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description must carry the burden. It only states 'Return' implying a read operation, but lacks disclosure of side effects, auth needs, or any behavioral traits.
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?
Single sentence, no wasted words; appropriate for a simple parameterless tool.
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 output schema present, the description need not explain return values, but it fails to clarify what 'allowlisted' means or its purpose within the tool suite; adequate but minimal.
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?
No parameters in schema; baseline score of 4 for zero parameters as per guidelines.
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 'Return the allowlisted tags' clearly states the verb (return) and resource (allowlisted tags), but does not differentiate from sibling tools like memory_tag_hierarchy or memory_validate_tags.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives; the description provides no context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_unlinkA
Remove a link between two memories.
Args: from_id: Source memory ID to_id: Target memory ID bidirectional: If True, also remove reverse link (default: True)
Returns: Dict with removed links
| Name | Required | Description | Default |
|---|---|---|---|
| to_id | Yes | ||
| from_id | Yes | ||
| bidirectional | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavioral traits. It explains the bidirectional parameter and return type, but lacks details on prerequisites (e.g., link must exist), side effects (e.g., timestamps), error conditions, or required permissions. This leaves significant gaps for an AI agent.
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: a one-line purpose followed by parameter explanations using a simple label-description format. No unnecessary words. Slightly informal but fits MCP expectations.
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 3 parameters and an output schema, the description covers core behavior and parameters. However, it misses error handling, prerequisites (e.g., must the link exist?), and does not leverage the output schema to explain return values. Incomplete for full autonomous agent usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must add meaning. It adds: from_id is 'Source memory ID', to_id is 'Target memory ID', and bidirectional explains default and effect. This goes beyond the schema's type/title only.
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 a link between two memories,' which is a specific verb and resource. It distinguishes itself from siblings like memory_link (creates a link) and memory_delete (deletes a memory). The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when wanting to remove a link between two memories, but provides no explicit guidance on when not to use it or mention of alternatives (e.g., memory_link for creation, memory_delete for removing memories with their links). Context signals include 39 sibling tools, but no differentiation is made.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_updateB
Update an existing memory.
Metadata updates merge into existing metadata by default. Set a metadata key to null/None to delete that key. Pass replace_metadata=True only when intentionally replacing the whole metadata object.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| content | No | ||
| metadata | No | ||
| memory_id | Yes | ||
| replace_metadata | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It explains metadata merging and replace_metadata behavior but omits key aspects like how content and tags are updated (overwritten or merged). This partial disclosure earns a 3.
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, efficiently front-loaded with the core purpose. It avoids redundancy but could be more concise by eliminating minor framing. Overall well-structured.
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 5 parameters and no schema descriptions, the description leaves major gaps: update behavior for content and tags is unspecified. Output schema exists but return values are not mentioned. Incomplete for a mutation 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?
With 0% schema coverage, the description must compensate. It adds meaning for metadata and replace_metadata but provides no details about memory_id, content, or tags parameters. This insufficient compensation results in a low score.
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 'Update an existing memory.' which is a specific verb-resource pair. It further details metadata update behavior, distinguishing it from creation or deletion. Among many siblings, 'update' is distinct enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for updating memories but provides no explicit guidance on when to use this tool versus alternatives like memory_absorb or memory_merge. No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_upload_imageA
Upload an image file directly to R2 storage.
Uploads a local image file to R2 and returns the r2:// reference URL that can be used in memory metadata.
Args: file_path: Absolute path to the image file to upload memory_id: Memory ID this image belongs to (used for organizing in R2) image_index: Index of image within the memory (default: 0) caption: Optional caption for the image
Returns: Dictionary with r2_url (the r2:// reference) and image object ready for metadata
| Name | Required | Description | Default |
|---|---|---|---|
| caption | No | ||
| file_path | Yes | ||
| memory_id | Yes | ||
| image_index | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the upload action, returns an r2:// URL, and mentions organization by memory_id. It could be more explicit about side effects (e.g., overwrite behavior, permissions needed) but provides adequate transparency for a typical upload operation.
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 well-structured with a brief summary followed by an Args/Returns block. It is not overly long, but could be slightly more concise by removing the Returns block if output schema is sufficient. Still, it is clear and 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 4 parameters, no annotations, and an output schema present, the description is fairly complete. It explains all parameters and the return value. It could mention any constraints (e.g., file size limits, supported formats) but overall provides sufficient context for correct 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?
Despite 0% schema description coverage, the description includes a full docstring for each parameter (file_path, memory_id, image_index, caption), explaining their purpose and defaults. This adds significant meaning beyond the schema's bare type hints.
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 uploads an image file to R2 storage and returns an r2:// reference URL, specifying the action and resource. The verb 'upload' and resource 'image file to R2' are specific, and the purpose is distinguishable from sibling tools like memory_migrate_images or memory_store_document.
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 explains when to use the tool (for uploading images to R2) but does not explicitly state when not to use it or mention alternative tools. However, the context of sibling tools implies it is for image uploads specifically, and the docstring provides clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_validate_tagsC
Validate stored tags against the allowlist and report invalid entries.
| Name | Required | Description | Default |
|---|---|---|---|
| include_memories | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states 'report invalid entries' but does not disclose whether the tool modifies data, requires special permissions, or how the report is returned. The name implies read-only, but not confirmed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, which is concise, but it omits crucial details. Conciseness is not sacrificed for clarity; rather, the description is under-specified.
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 that there is only one parameter and no required parameters, the description should at least explain the parameter and the output format. It lacks details about the validation process, allowlist context, and interpretation of 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?
The only parameter (include_memories) is not mentioned in the description. Schema coverage is 0%, and the description adds no information about its meaning, default, or effect on 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?
The description explicitly states the action ('validate'), the resource ('stored tags'), and the goal ('against the allowlist and report invalid entries'). It clearly distinguishes from sibling tools like memory_tags or memory_backfill_tags which have different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs. alternatives. It mentions 'against the allowlist' but does not explain what the allowlist is or how to configure it. No mention of prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_verify_integrityA
Read-only embedding integrity doctor with bounded offending ids.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavior. It correctly declares the tool as 'Read-only', which is critical for an agent to know it is safe to invoke. However, it does not disclose what 'integrity' means (e.g., consistency checks, corruption detection), what 'bounded offending ids' implies (e.g., a limit on results), or any other behavioral traits such as cost or side effects, leaving room for ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that conveys the core purpose and a key behavioral trait ('Read-only') without any wasted words. It is front-loaded with the most critical information and easily digestible by an 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?
Given that the tool has no parameters and a very specific purpose, the description covers the basics. However, the presence of an output schema is noted in the context, and the description does not hint at what the output contains beyond 'bounded offending ids', leaving the agent to rely solely on the output schema for understanding return values. For a diagnostic tool among many similar siblings, more context on what kind of integrity issue is detected would improve completeness.
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 has zero parameters and is 100% covered by the schema definition itself. Since there are no parameters to document, the description cannot add value beyond the schema; therefore, the baseline 4 is appropriate, but the clear description of the tool's action ('verify integrity') and output characteristic ('bounded offending ids') effectively communicates what the no-parameter invocation does, earning 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?
The description clearly states the verb ('verify') and resource ('embedding integrity'), and the phrase 'bounded offending ids' adds specificity about what the reader can expect from the output, distinguishing it as a diagnostic tool. It does not, however, elaborate on what aspect of integrity is checked, and with many sibling tools like memory_find_duplicates and memory_detect_supersessions also performing diagnostics, the distinction is only moderate.
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 no guidance on when to use this tool versus any of the many sibling tools. The phrase 'Read-only embedding integrity doctor' implies a safe diagnostic context, but there are no explicit when-to-use, when-not-to-use, or alternative suggestions, leaving the agent to guess its role among over 40 siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes, but there is some overlap (e.g., memory_hybrid_search vs memory_semantic_search, memory_list vs deprecated memory_list_compact) that could cause confusion for an agent. Additionally, memory_find_duplicates and memory_detect_supersessions serve related but distinct roles.
Tools follow a consistent 'memory_<verb>_<noun>' pattern, with a few exceptions like 'memory_tag_hierarchy' (noun-verb order) and the deprecated 'memory_list_compact'. The naming is readable and predictable overall.
With 41 tools, the server is comprehensive but borders on excessive for a typical MCP server. Each tool serves a specific function, but the high count may overwhelm agents compared to the ideal 10-15 tool range.
The tool surface is remarkably complete, covering CRUD operations, advanced features (absorb, merge, boost, link), specialized types (issues, todos, documents), search variants, import/export, analytics, and maintenance tools. No obvious dead ends or missing operations for the memory/knowledge domain.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Persistent memory and knowledge graphs for AI agents. Hybrid search, context checkpoints, and more.
Shared long-term memory for AI agents: save and recall context as a searchable knowledge graph.
Persistent memory and knowledge graph for AI assistants β keyword + vector + graph search.
Persistent memory for AI agents. Semantic search, memory graph, W3C DID identity.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceProvides persistent, semantic memory storage for LLMs across sessions using vector embeddings and FAISS search. Features bio-inspired memory consolidation, intelligent forgetting, and semantic retrieval without API costs.MIT

Mnemo MCPofficial
AlicenseNot gradedqualityBmaintenancePersistent AI memory server with hybrid search and embedded sync. Enables AI agents to store, retrieve, and manage information across sessions with temporal knowledge graph support.MIT- AlicenseNot gradedqualityBmaintenanceEnables AI agents to maintain persistent, local memory with retrieval-augmented search, knowledge graphs, and context surfacing, without any cloud dependencies.135MIT
- AlicenseNot gradedqualityCmaintenanceProvides persistent memory for AI tools by building a local knowledge graph from conversations, enabling cross-session recall and context awareness without cloud dependencies.9MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/agentic-box/memora'
If you have feedback or need assistance with the MCP directory API, please join our Discord server