Skip to main content
Glama

YantrikDB MCP Server

YantrikDB — Cognitive memory for AI agents. Persistent semantic recall, knowledge graph, contradiction detection, and procedural learning. Ships as embeddable engine, network database, or MCP server.

Works with Claude Code, Cursor, Windsurf, Hermes Agent, Prime Agent, and any MCP-compatible client. Ships a portable Agent Skills skill — skills/persistent-memory — that teaches any compliant harness the memory golden path.

PyPI PyPI downloads Python License: MIT

Website: yantrikdb.com · Docs: yantrikdb.com/guides/mcp · GitHub: yantrikos/yantrikdb-mcp · Paper: Skill as Memory, Not Document

yantrikdb-mcp demo: three memories stored over MCP, one recalled by a question that shares no words with it, then think() flagging that two stored beliefs about the same on-call lead contradict each other — the next session's recall comes back with open_conflicts: 1

Every value on screen is the server's own answer over MCP — driver: docs/demo/demo.py, recorded with docs/demo/demo.tape.

At a glance

What it is

An MCP server that gives any MCP-compatible AI agent persistent, structured, queryable memory across sessions

Install

pip install yantrikdb-mcp

Works with

Claude Code, Cursor, Windsurf, Continue, Claude Desktop, Hermes Agent, Prime Agent, any MCP client

Storage

Local SQLite at ~/.yantrikdb/memory.db (or any path; or HTTP cluster)

Embedder

Bundled 64-dim Rust embedder (default), 384-dim ONNX MiniLM ([onnx] extra), 256-dim multilingual (101 languages)

Tools

19 — remember, recall, forget, correct, think, memory, graph, conflict, trigger, session, temporal, procedure, category, personality, stats, skill, gaps, conversation, task

License

MIT (engine: Apache-2.0)

Privacy

All data on your machine. No telemetry. No external services.

Related MCP server: memex

Install

# Default — uses the engine's bundled 64-dim embedder. ~10 MB install,
# ~80 ms cold start, no native ML deps.
pip install yantrikdb-mcp

# Optional: higher-quality 384-dim ONNX MiniLM-L6-v2 embedder (~150 MB install).
# Auto-used when an existing pre-v0.6 database is detected.
pip install 'yantrikdb-mcp[onnx]'

Upgrading from v0.5.x? Your existing database stays at 384 dim — install the [onnx] extra to keep using it transparently. New installs default to the lean bundled embedder. v0.7.0+ pins the engine migration fix automatically. See Embedder backends below.

Configure

The MCP server has three deployment modes. Pick the one that fits your setup.

The MCP server runs the engine in-process with a local SQLite database. Fast, private, zero dependencies.

{
  "mcpServers": {
    "yantrikdb": {
      "command": "yantrikdb-mcp"
    }
  }
}

That's it. The agent auto-recalls context, auto-remembers decisions, and auto-detects contradictions — no prompting needed.

Forward all tool calls to a YantrikDB HTTP cluster instead of using an embedded engine. The MCP server is a thin stateless client — all memories live on the cluster, accessible from any machine.

Benefits: shared memory across machines, high availability, no local embedder download, no local database.

{
  "mcpServers": {
    "yantrikdb": {
      "command": "yantrikdb-mcp",
      "env": {
        "YANTRIKDB_SERVER_URL": "http://node1:7438,http://node2:7438",
        "YANTRIKDB_TOKEN": "ydb_your_database_token"
      }
    }
  }
}
  • Comma-separate multiple nodes for Raft cluster auto-discovery

  • Automatic leader-following on failover

  • 15s request timeout

  • Get the token from the cluster: yantrikdb token create --db your_database

Mode 3 — SSE Server (legacy, single remote instance)

Run the MCP server itself as a long-running SSE server with its own embedded database. Clients connect via HTTP streaming.

# Generate a secure API key
export YANTRIKDB_API_KEY=$(python -c "import secrets; print(secrets.token_urlsafe(32))")

# Start SSE server
yantrikdb-mcp --transport sse --port 8420
{
  "mcpServers": {
    "yantrikdb": {
      "type": "sse",
      "url": "http://your-server:8420/sse",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Supports sse and streamable-http transports. Note: SSE connections can drop on idle — Mode 2 (HTTP Cluster) is more reliable for shared deployments.

Environment Variables

Variable

Used in Mode

Default

Description

YANTRIKDB_SERVER_URL

Cluster

(unset → local mode)

Comma-separated cluster node URLs

YANTRIKDB_TOKEN

Cluster

(none)

Bearer token for the cluster database

YANTRIKDB_DB_PATH

Local

~/.yantrikdb/memory.db

Database file path

YANTRIKDB_EMBEDDER

Local

auto

Backend selector: auto | bundled | onnx | multilingual

YANTRIKDB_EMBEDDING_MODEL

Local

all-MiniLM-L6-v2

ONNX model name (only used when YANTRIKDB_EMBEDDER=onnx)

YANTRIKDB_SKILLS_WRITE_ENABLED

All

false

Set true to allow agents to author skills via skill(action="define") (see Skill substrate below)

YANTRIKDB_OUTCOMES_WRITE_ENABLED

All

true

Outcome tracking via skill(action="outcome"). Defaults on so the feedback loop works out of the box; set false to lock the outcome substrate. Added in v0.8.1 per #8

YANTRIKDB_API_KEY

SSE server

(none)

Bearer token when serving SSE/HTTP

Embedder backends

Local mode ships three embedders. The MCP picks one automatically; override with YANTRIKDB_EMBEDDER.

Backend

Dim

Cold start

Install size

Language coverage

When it's used

bundled (engine default)

64

~80 ms

~10 MB

English-only

New / empty databases (auto-selected)

onnx (MiniLM-L6-v2)

384

~2 s

~150 MB

English (higher recall)

Existing pre-v0.6 databases (auto-selected), or when set explicitly

multilingual (potion-multilingual-128M)

256

~2 s + ~460 MB download on first use

~10 MB pip + ~500 MB model cache

101 languages (BGE-M3 tokenizer)

Opt-in only via YANTRIKDB_EMBEDDER=multilingual

auto (default) reads the SQLite file at YANTRIKDB_DB_PATH and picks onnx if it already contains memories — preserving recall quality on upgrades — and bundled otherwise. Multilingual is never auto-selected because its 256-dim vectors are incompatible with existing bundled (64-dim) or ONNX (384-dim) databases; opt-in only on fresh databases.

Set YANTRIKDB_EMBEDDER=bundled|onnx|multilingual to override. If you set YANTRIKDB_EMBEDDER=onnx (or auto-detection picks it) without installing the extras, the server fails fast with an install hint:

RuntimeError: Existing DB has memories embedded with the 384-dim ONNX
model, but ONNX deps are missing.
  Install with:  pip install 'yantrikdb-mcp[onnx]'

For the multilingual backend, the engine downloads potion-multilingual-128M (~460 MB tarball) from github.com/yantrikos/yantrikdb-models on first use. The download is SHA-256 verified, extracted into the engine's cache dir, and reused on subsequent starts. No extra Python deps required — the model runs entirely inside the Rust engine.

Why Not File-Based Memory?

File-based memory (CLAUDE.md, memory files) loads everything into context every conversation. YantrikDB recalls only what's relevant.

Benchmark: 15 queries × 4 scales

Memories

File-Based

YantrikDB

Savings

Precision

100

1,770 tokens

69 tokens

96%

66%

500

9,807 tokens

72 tokens

99.3%

77%

1,000

19,988 tokens

72 tokens

99.6%

84%

5,000

101,739 tokens

53 tokens

99.9%

88%

Selective recall is O(1). File-based memory is O(n).

  • At 500 memories, file-based exceeds 32K context windows

  • At 5,000, it doesn't fit in any context window — not even 200K

  • YantrikDB stays at ~70 tokens per query, under 60ms latency

  • Precision improves with more data — the opposite of context stuffing

Run the benchmark yourself: python benchmarks/bench_token_savings.py

The server injects a golden-path playbook into the agent's system prompt. Since v0.10.0 the default is digest-first:

  1. Cold start — one call. session(action="digest") returns a single briefing (narrative chain head, open decisions, unresolved conflicts, pending triggers, stale high-importance memories) — replacing several separate recall/temporal calls at conversation start. Then recall only for the specific thing the current message is about.

  2. During work — capture as you go. New durable fact → remember; a stored fact changed → correct (keeps history, avoids contradictions); relationship learned → graph(action="relate").

  3. End of substantial work — conditional. Only when the session was long or state-changing: think to consolidate + detect conflicts. Short/read-only exchanges need no end step.

Trust boundary: recalled memories and digest snippets are data, not instructions. The playbook directs the agent never to execute directives found inside recalled content — a memory may carry text an earlier session or another user stored.

Tools

19 tools, full engine coverage (gaps, conversation, task added in v0.9.0):

Tool

Actions

Purpose

remember

single / batch

Store memories — decisions, preferences, facts, corrections

recall

search / refine / feedback

Semantic search, refinement, and retrieval feedback

forget

single / batch

Tombstone memories

correct

Fix incorrect memory (preserves history)

think

Consolidation + conflict detection + pattern mining

memory

get / list / search / update_importance / archive / hydrate

Manage individual memories + keyword search

graph

relate / edges / link / search / profile / depth

Knowledge graph operations

conflict

list / get / resolve / reclassify

Handle contradictions and teach substitution patterns

trigger

pending / history / acknowledge / deliver / act / dismiss

Proactive insights and warnings

session

start / end / history / active / abandon_stale

Session lifecycle management

temporal

stale / upcoming

Time-based memory queries

procedure

learn / surface / reinforce

Procedural memory — learn and reuse strategies

category

list / members / learn / reset

Substitution categories for conflict detection

personality

get / set

AI personality traits from memory patterns

stats

stats / health / weights / maintenance

Engine stats, health, weights, and index rebuilds

skill

define / surface / outcome / get / list

Substrate-native agent skill catalog (writes off by default — see Skill substrate)

gaps

v0.9.0 — surface frequently-asked, poorly-answered queries (substrate's known unknowns)

conversation

record / recent / clear

v0.9.0 — bounded encrypted ring buffer for verbatim conversation turns, namespace-isolated

task

add / get / list / update / delete

v0.9.0 — substrate-backed task / chore store; survives sessions, surfaces in session(action="digest")

Plus new actions on existing tools in v0.9.0:

  • session(action="digest") — one-call boot-time briefing (narrative chain head + open decisions + conflicts + triggers)

  • think(maintenance_cycle=True) — autonomous hygiene sleep cycle

  • think(last_cycle_only=True) — read the last cycle summary without running

  • stats(action="audit_leak") — privacy / leak-candidate audit

  • stats(action="skill_outcomes") — durable skill-outcome count

  • graph(action="auto_relate" / "record_link" / "record_unlink" / "linked_records" / "recall_with_links") — co-occurrence edges + record-to-record links + link-expanded recall

  • conflict(action="auto_resolve") — burn down unambiguous conflicts in one pass

  • memory(action="chain_head" / "history") — chain-namespace head + revision history

  • trigger(action="prune") — bound the pending-trigger backlog

  • remember(summary=...) — draft mode: engine atomizes a long summary into linked semantic facts (end-of-session auto-capture)

See yantrikdb.com/guides/mcp for full documentation.

Skill substrate (v0.8.0+)

YantrikDB exposes a structured agent skill catalog — separate from loose procedure memories. Skills have schema (skill_id, applies_to, triggers, body, type) and are stored in the dedicated skill_substrate namespace so multiple consumers (this MCP, yantrikdb-hermes-plugin, Lane B SDK, WisePick, yantrikdb-server's /v1/skills/* endpoints) all read and write the same substrate. Background: Sarkar 2026 — Skill as Memory, Not Document.

Security model

Skill writes shape future agent behavior across sessions, so the MCP server implements defense-in-depth. Every control has an env-var knob (locked once at startup — C2) and the full state is exposed via stats(action="stats") and the audit log.

Layered controls (each ships on by default unless noted):

Layer

Control

Env var

Notes

Schema

skill_id regex, body 50–5000 chars, applies_to 1–10 entries, skill_type enum

(always on)

Same regex set as yantrikdb-server /v1/skills/define

A1 Prompt-injection markers

Reject bodies containing role-confusion / "ignore previous instructions" patterns

YANTRIKDB_SKILLS_DISABLE_SCANNERS=A1 to disable (audited)

OWASP LLM01

A2 Credential scanner

AWS/GitHub/Slack/Stripe/Google/Anthropic/OpenAI keys, SSH/PGP private keys, JWT, password assignments

=A2 to disable

Subset of GitHub secret-scanning

A3 URL/IP block

Reject http(s), ftp, IPv4 literals in body

YANTRIKDB_SKILLS_ALLOW_URLS=true to allow

Exfil path for downstream agents

A4 Unicode evasion

Reject non-printing chars (Cf/Cs/Cn except whitelisted)

=A4 to disable

Bidi override (U+202E), zero-width spaces

A5 Encoded payload

Reject ≥200-char runs of base64/hex

=A5 to disable

Heuristic — false-positive prone for large hashes

B1 Namespace allowlist

skill_id first segment must be in operator list

YANTRIKDB_SKILLS_ALLOWED_NAMESPACES=workflow,review

Unset = all allowed

B2 Author attribution

Records session_id, os_user, hostname, wall_clock, audit_nonce

(always on)

Forensic trail

B3 Cross-origin replace

Refuse to overwrite a skill written by a different consumer

YANTRIKDB_SKILLS_ALLOW_CROSS_ORIGIN_REPLACE=true to allow

Defends against MCP↔hermes-plugin collision

B4 Supersedes integrity

supersedes must reference an existing skill in the same namespace

(always on)

Blocks malicious retirement of legit skills

C1 Time-bound gate

Gate auto-closes at the timestamp (applies to both define + outcome)

YANTRIKDB_SKILLS_WRITE_EXPIRES_AT=2026-12-31T00:00:00Z

Unset = no expiry

C1.5 Split outcome gate

outcome action uses its own gate, default ON

YANTRIKDB_OUTCOMES_WRITE_ENABLED=false to lock outcomes too

v0.8.1+: define and outcome have different threat profiles — outcome can't introduce new instructions, only append {succeeded, note≤500} against an existing skill. Feedback loop works by default; lock explicitly if needed

C2 Locked config

All YANTRIKDB_SKILLS_* / YANTRIKDB_OUTCOMES_* env vars read once at startup

(always on)

Mutating env in a sub-process can't bypass the gate

D1 Audit log

JSONL append of every accept/reject/tamper event

YANTRIKDB_SKILLS_AUDIT_LOG=/var/log/yantrikdb/skills.jsonl

Unset = no auditing (warns at boot)

D2 Rate limit

Per-session-id sliding-window write cap

YANTRIKDB_SKILLS_WRITE_RATE=30 (default writes/min)

Defeats flood attacks

D3 Outcome.note guards

Note ≤500 chars + scanned by A1/A2/A4

(always on)

Closes the outcome side-channel

D4 Counters in stats

Accept/reject counts by reason, surfaced in stats(action="stats")["skill_substrate"]

(always on)

Operator dashboards

E1 Body SHA-256

Stored at write time, re-verified on every read

(always on)

Detects out-of-band DB tampering — surface/get omit mismatches and log to audit

E2 Author origin

metadata.author_origin tag — defaults to yantrikdb-mcp

YANTRIKDB_SKILLS_AUTHOR_ORIGIN=... to override

Tracks substrate provenance across consumers

F Startup safety

Boot-time warnings about dangerous configurations

(always on)

Logs [F.1][F.5] to stderr + audit

G Review queue for rule

rule-type skills route to skill_pending_review (not surfaced by surface/get/list)

YANTRIKDB_SKILLS_RULE_REQUIRES_REVIEW=false to disable (not recommended)

Rules influence agent policy — human approval required

Multi-tenant guard

[F.1] warning if DB shows multiple actor IDs without ack

YANTRIKDB_SKILLS_MULTITENANT_ACK=true

One DB = one tenant is the safe default

Enterprise checklist:

# Minimum production config when you turn the gate ON:
YANTRIKDB_SKILLS_WRITE_ENABLED=true
YANTRIKDB_SKILLS_WRITE_EXPIRES_AT=2026-12-31T00:00:00Z
YANTRIKDB_SKILLS_ALLOWED_NAMESPACES=workflow,review,onboarding
YANTRIKDB_SKILLS_AUDIT_LOG=/var/log/yantrikdb/skills.audit.jsonl
YANTRIKDB_SKILLS_AUTHOR_ORIGIN=acme-corp-claude-prod
# Defaults are already correct: writes off, scanners on, rate-limit 30/min,
# rule-type routed to review, body-hash verified on read, locked at startup.

The audit log is the canonical record. Every accept, every reject (with the scanner that flagged), every tamper-detection on read, every gate-closed-due-to-expiry — all there in JSONL. Plug it into your SIEM.

stats(action="stats") example output (skill_substrate slice)

"skill_substrate": {
  "counters": {
    "skill_defines_accepted": 12,
    "skill_defines_rejected": {"content_scan:A2": 1, "namespace_not_allowed": 3},
    "skill_outcomes_recorded": 47,
    "skill_pending_review": 2
  },
  "config": {
    "writes_enabled": true,
    "write_expires_at": "2026-12-31T00:00:00+00:00",
    "allowed_namespaces": ["workflow", "review"],
    "audit_log_path": "/var/log/yantrikdb/skills.audit.jsonl",
    "rule_requires_review": true,
    "author_origin": "acme-corp-claude-prod"
  }
}

Schema (validated at write time)

Field

Constraint

skill_id

Lowercase dot-separated segments, length 4–200, e.g. workflow.git.commit_clean

body

50–5000 chars

applies_to

1–10 lowercase-underscore identifiers (no hyphens — load-bearing for substrate consistency)

skill_type

One of procedure, reference, lesson, pattern, rule

on_conflict

reject (default) or replace

Example session

# Define (requires gate enabled)
skill(action="define",
      skill_id="workflow.git.commit_clean",
      body="Before commit: run pytest, run lint, write a clear subject + body.",
      skill_type="procedure",
      applies_to=["git", "release"])

# Surface relevant skills for the current task
skill(action="surface", query="how to commit cleanly", top_k=5)

# Record an outcome after using the skill (gated, append-only)
skill(action="outcome", skill_id="workflow.git.commit_clean",
      succeeded=True, note="caught a flake8 issue pre-push")

Outcomes are append-only events in the outcome_substrate namespace — no auto-rollup on the parent skill, matching yantrikdb-server's "schema not semantics" design rule. Agents (or the operator) can aggregate outcomes themselves to compute success rates.

FAQ

What is YantrikDB MCP?

YantrikDB MCP is a Model Context Protocol (MCP) server that gives AI agents persistent cognitive memory across sessions. It exposes 16 tools (remember, recall, forget, correct, think, graph, conflict, trigger, session, temporal, procedure, category, personality, stats, memory, skill) that any MCP-compatible client — Claude Code, Cursor, Windsurf, Continue, Claude Desktop — can call automatically without prompting.

How is this different from file-based memory like CLAUDE.md?

File-based memory loads everything into context on every conversation, which scales O(n) in token cost. YantrikDB uses selective semantic recall — at 5,000 memories, file-based costs ~101K tokens per conversation while YantrikDB costs ~53 tokens. Precision improves with more data instead of degrading as the context window fills up. Benchmark script: python benchmarks/bench_token_savings.py.

How does it compare to mem0 / Letta / Zep / native MCP memory?

See comparison table below. Short version: YantrikDB is the only one that ships as both an embeddable Rust engine and an MCP server and a network database with the same substrate semantics. It's the only one with first-class procedural memory + a skill substrate validated by schema at write time + autonomous consolidation/conflict detection. It's also the only one whose underlying engine is published as a peer-reviewed paper (Sarkar 2026, Zenodo DOI 10.5281/zenodo.20128887).

Can I self-host?

Yes — three ways. (1) Local: just pip install yantrikdb-mcp and point your MCP client at it. SQLite lives at ~/.yantrikdb/memory.db. (2) Network: run yantrikdb-server as a multi-tenant HTTP cluster, point the MCP at it via YANTRIKDB_SERVER_URL. (3) Hybrid: SSE server mode (yantrikdb-mcp --transport sse) for shared deployments.

Is my data sent anywhere?

No. All data stays on your machine (or your cluster). No telemetry, no third-party services. The default embedder runs entirely in the Rust engine via static lookup — no model downloads or API calls. The optional [onnx] and multilingual embedders fetch model weights once from HuggingFace's CDN and run locally thereafter.

What's the difference between procedure and skill?

procedure stores loose how-to memories (effectiveness-ranked, no schema). skill stores structured catalog entries (skill_id, applies_to, triggers, body, type) in a dedicated skill_substrate namespace shared with yantrikdb-hermes-plugin, Lane B SDK, WisePick, and the yantrikdb-server /v1/skills/* endpoints. Use procedure for personal how-to notes; use skill for structured agent capabilities that other consumers should be able to surface.

Is skill authoring safe to enable?

Skill writes are off by default precisely because they can shape future agent behavior. When you turn the gate on, seven layers of defense-in-depth apply: prompt-injection scanner, credential scanner, URL block, unicode-evasion scanner, namespace allowlist, author attribution, audit log, rate limit, body-hash tamper detection, and a review queue for rule-type skills. See Security model above.

Does it work in production?

Yes — yantrikdb-mcp runs in production on the YantrikDB homelab cluster (1973+ memories, SSE transport, 2 weeks uptime per release cycle) and is the reference deployment behind the engine's release decisions. v0.8.x added the engine's same-day-patch cadence to the MCP server itself: external issues filed by community contributors land as released fixes within 2 hours.

What's the engine written in?

The YantrikDB engine is Rust (crates.io: yantrikdb) with pyo3 Python bindings (PyPI: yantrikdb). The MCP server itself is Python — a thin wrapper around the engine's Python bindings, plus stdio/SSE/HTTP transport plumbing.

Comparison with other agent memory systems

Capability

YantrikDB MCP

mem0

Letta (MemGPT)

Zep

Native MCP filesystem memory

MCP-native

✅ first-class

via custom integration

via custom integration

via custom integration

✅ filesystem-shaped

Embeddable (no server)

✅ Rust + Python

❌ requires service

❌ requires service

❌ requires service

✅ filesystem

Network database mode

✅ Raft HA cluster

✅ Pro / Enterprise

✅ self-host

✅ managed + self-host

Semantic recall (vector)

✅ HNSW

❌ (file grep only)

Knowledge graph

✅ typed nodes + edges

✅ (recent addition)

partial

Contradiction detection

✅ autonomous

Procedural memory

✅ effectiveness-ranked

partial

Skill substrate (schema-validated)

✅ with 7 defense layers

Autonomous consolidation (think)

partial

Temporal decay + half-life

✅ biological model

Proactive triggers

Personality traits derivation

✅ from memory patterns

Storage

local SQLite + WAL

hosted

local

local + hosted

filesystem

License

MIT (engine Apache-2.0)

Apache 2.0

Apache 2.0

Apache 2.0

MIT

Peer-reviewed paper

Zenodo

✅ MemGPT paper

Same-day patch cadence for issues

✅ (avg <2h on v0.8.x)

varies

varies

varies

n/a

Comparisons reflect public-facing capabilities as of May 2026. PRs welcome to correct any rows.

Cite this work

If you use YantrikDB in academic or research context, please cite the substrate paper:

@misc{sarkar2026skill,
  author       = {Sarkar, Pranab},
  title        = {Skill as Memory, Not Document: A Database-Native Substrate for Agent Skill Catalogs},
  year         = {2026},
  publisher    = {Zenodo},
  doi          = {10.5281/zenodo.20128887},
  url          = {https://doi.org/10.5281/zenodo.20128887},
  orcid        = {0009-0009-8683-1481}
}

Plain text citation:

Sarkar, P. (2026). Skill as Memory, Not Document: A Database-Native Substrate for Agent Skill Catalogs. Zenodo. https://doi.org/10.5281/zenodo.20128887

Examples

1. Auto-recall at conversation start

User: "What did we decide about the database migration?"

The agent automatically calls recall("database migration decision") and retrieves relevant memories before responding — no manual prompting needed.

2. Remember decisions + build knowledge graph

User: "We're going with PostgreSQL for the new service. Alice will own the migration."

The agent calls:

  • remember(text="Decided to use PostgreSQL for the new service", domain="architecture", importance=0.8)

  • remember(text="Alice owns the PostgreSQL migration", domain="people", importance=0.7)

  • graph(action="relate", entity="Alice", target="PostgreSQL Migration", relationship="owns")

3. Contradiction detection

After storing "We use Python 3.11" and later "We upgraded to Python 3.12", calling think() detects the conflict. The agent surfaces it:

"I found a contradiction: you previously said Python 3.11, but recently mentioned Python 3.12. Which is current?"

Then resolves with conflict(action="resolve", conflict_id="...", strategy="keep_b").

Privacy Policy

YantrikDB MCP Server stores all data locally on your machine (default: ~/.yantrikdb/memory.db). No data is sent to external servers, no telemetry is collected, and no third-party services are contacted during operation.

  • Data collection: Only what you explicitly store via the remember tool or what the AI agent stores on your behalf.

  • Data storage: Local SQLite database on your filesystem. You control the path via YANTRIKDB_DB_PATH.

  • Third-party sharing: None. Data never leaves your machine in local (stdio) mode.

  • Network mode: When using SSE/HTTP transport, data travels between your client and your self-hosted server. No Anthropic or third-party servers are involved.

  • Embedding model: Uses a local ONNX model (all-MiniLM-L6-v2). Model files are downloaded once from Hugging Face Hub on first use, then cached locally.

  • Retention: Data persists until you delete it (forget tool) or delete the database file.

  • Contact: developer@pranab.co.in

Full policy: yantrikdb.com/privacy

Contributing

See CONTRIBUTING.md for a venv setup, running pytest, and opening PRs.

Support

Same memory substrate, different entry points:

  • yantrikdb — the embeddable Rust/Python engine this server runs on (pip install yantrikdb).

  • yantrikdb-server — HTTP gateway and HA cluster, for the network deployment modes above.

  • yantrikdb-client — typed Python client for that server.

  • langchain-yantrikdb — YantrikDB as a LangChain VectorStore and ChatMessageHistory.

  • yantrikdb-hermes-plugin — memory provider for NousResearch/hermes-agent, sharing the same skill substrate.

  • yantrik-memory — framework-agnostic memory layer with traits and bond evolution.

License

This MCP server is licensed under MIT — use it freely in any project.

Note: This package depends on yantrikdb (the cognitive memory engine), which is licensed under Apache-2.0 as of 2026-08-18 (previously AGPL-3.0). Both this server and the engine are now permissively licensed — there are no copyleft obligations on your code, modifications, or hosted services.

Available Tools

20 tools
categoryA
Destructive

Substitution categories for conflict detection — list, inspect, teach, or reset.

ACTIONS:

  • "list": Show all categories with member counts.

  • "members": Show members of a specific category (needs category_name).

  • "learn": Teach new members (needs category_name + members as [[token, confidence], ...]).

  • "reset": Reset category to seed state (needs category_name).

EXAMPLES:

  • category() → list all categories

  • category(action="members", category_name="databases")

  • category(action="learn", category_name="databases", members=[["tidb", 0.35]])

  • category(action="reset", category_name="editors_tools")

Args: action: "list", "members", "learn", "reset". category_name: Required for members/learn/reset. members: For learn: [[token, confidence], ...]. source: For learn: "llm_suggested", "user_confirmed", "seed".

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNolist
sourceNollm_suggested
membersNo
category_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explains each action's effect (e.g., 'reset' returns to seed state). The annotations include destructiveHint=true, which aligns with the 'reset' action. However, it does not explicitly state that 'list' and 'members' are read-only, nor does it disclose authorization requirements or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a one-line purpose, bulleted actions, clear examples, and an args list. Every sentence adds value, and it is front-loaded with the core purpose. No unnecessary text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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, the description does not need to explain return values. It covers all parameters and actions adequately. However, it could mention the output format or how the tool integrates with conflict detection, though this is not essential.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds substantial meaning beyond the input schema, which has 0% coverage. It explains each parameter in detail: action options, category_name requirement, members format, and source values. This fully compensates for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it's for 'Substitution categories for conflict detection' and lists specific actions (list, members, learn, reset). However, it does not differentiate from sibling tools like 'conflict' or 'memory', which might have overlapping functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit actions and examples for each, giving clear usage context. However, it does not specify when NOT to use this tool or mention alternative tools for similar tasks, leaving some ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

conflictA
Destructive

Manage memory conflicts (contradictions) — list, resolve, dismiss, reclassify, or batch-burn-down the unambiguous ones (v0.8.0+).

ACTIONS:

  • "list": List conflicts. Optional status filter.

  • "get": Get single conflict by conflict_id.

  • "resolve": Resolve with strategy: "keep_a"/"keep_b"/"keep_both"/"merge"/"dismiss".

  • "reclassify": Reclassify conflict type.

  • "auto_resolve": v0.8.0 — burn down unambiguous conflicts in one pass. Set dry_run=False to actually persist.

Args: action: "list", "get", "resolve", "reclassify", "auto_resolve". conflict_id / status / strategy / winner_rid / new_text / resolution_note / new_type / limit: see action docs above. dry_run: For auto_resolve — preview without persisting.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
actionNolist
statusNo
dry_runNo
new_textNo
new_typeNo
strategyNo
winner_ridNo
conflict_idNo
resolution_noteNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true, matching the description of conflicts being managed and resolved. The description adds context about auto_resolve's dry_run flag for previewing persistence, which is not in annotations. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with actions listed and parameters grouped. It is somewhat lengthy but each section adds value. The main purpose is front-loaded. A more streamlined format could improve conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 10 parameters, 0 required, and no schema descriptions, the description provides adequate context for each action and parameter. The output schema exists but is not shown, so return values are not described. Overall, it covers the essential information for tool usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It groups parameters by action and explains their roles (e.g., strategy for resolve, dry_run for auto_resolve). This adds meaning beyond the schema's default values and types, though individual parameter details are brief.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool manages memory conflicts and lists specific actions (list, get, resolve, reclassify, auto_resolve). It distinguishes itself from sibling tools by its unique function. The purpose is clear but could be more concise.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance for each action, e.g., listing with optional status filter and resolving with strategies. It mentions the auto_resolve action for v0.8.0+ and dry_run for previewing. While it doesn't explicitly state when not to use, it gives sufficient context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

conversationA
Destructive

Bounded encrypted working-memory ring buffer for raw conversation turns (v0.9.0 engine conversation primitive).

Unlike remember (which stores extracted semantic memories), this stores verbatim turns — useful for short-horizon working memory, e.g. "what exactly did the user say two messages ago". The ring is bounded per namespace; oldest turns evict when max_turns is exceeded.

ACTIONS:

  • "record": Append a turn (needs role + content).

  • "recent": Retrieve last N turns, oldest-first.

  • "clear": Drop the buffer for a namespace.

Args: action: "record" | "recent" | "clear". namespace: Ring buffer namespace (separate buffers per agent / topic). role: "user" | "assistant" | "system" | "tool" — caller's choice. content: The verbatim turn text. max_turns: Ring size at record time (default 10). limit: How many recent turns to return.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNo
limitNo
actionYes
contentNo
max_turnsNo
namespaceNodefault

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description discloses behavioral traits beyond annotations: bounded per namespace, oldest turns evict when max_turns exceeded, and 'encrypted'. Annotations only indicate destructiveHint=true and readOnlyHint=false, so the description adds significant context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with actions listed in a bullet format and args explained clearly. Every sentence provides necessary information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 parameters, no schema descriptions, and an existing output schema (not detailed), the description covers all essential aspects: purpose, actions, parameters, and behavioral details. It is sufficiently complete for an AI 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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description explains every parameter: action options, namespace purpose, role choices, content as verbatim text, max_turns as ring size, and limit for recent retrieval. This fully compensates for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is a 'bounded encrypted working-memory ring buffer for conversation turns', distinguishing it from the 'remember' sibling. It lists three specific actions (record, recent, clear) with their purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description contrasts with 'remember' and explains it is for short-horizon working memory and verbatim turns. While it provides clear context, it does not explicitly state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

correctA
Destructive

Correct an existing memory in-place with a revision-history entry (engine v0.7.20+, Issue #47).

WHEN TO USE: When the user corrects a recalled fact.

  • "Actually, we're using Python 3.12, not 3.11" → correct the memory.

Preserves history via an append-only revision entry keyed on reason. Entity relationships stay attached to the same rid (in-place mutation, not a tombstone+new-rid dance).

Args: rid: The memory ID to correct. reason: Required — why the correction was made. Non-empty. Recorded on the revision-history entry so future recall + audit can reconstruct why the memory changed. new_text: Optional new text (pass None to keep existing). new_importance: Optional updated importance (0.0-1.0). new_valence: Optional updated valence (-1.0 to 1.0). metadata_merge: Optional dict to merge into existing metadata (None = keep as-is).

ParametersJSON Schema
NameRequiredDescriptionDefault
ridYes
reasonYes
new_textNo
new_valenceNo
metadata_mergeNo
new_importanceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations include destructiveHint=true, and description explains the in-place mutation and append-only revision history, providing sufficient behavioral context beyond annotations. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear sections, but slightly verbose (e.g., version/issue reference). Every sentence adds value; no wasteful repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers behavioral traits, parameter semantics, and use cases adequately. Output schema exists and is not required to be explained. Could mention return behavior but not necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description fully compensates with detailed Args section: explains 'rid', 'reason' (required, recorded for audit), 'new_text', 'new_importance', 'new_valence', and 'metadata_merge' with defaults and constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool corrects an existing memory in-place with revision history. It provides a concrete example ('Actually, we're using Python 3.12...') and distinguishes from siblings by noting in-place mutation vs tombstone approach.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'WHEN TO USE' section explicitly tells when to use (user corrects a recalled fact) with an example. Lacks explicit when-not-to-use, but the context is clear and sibling tool list implies alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forgetA
DestructiveIdempotent

Permanently forget (tombstone) one or more memories.

WHEN TO USE: When the user explicitly asks to forget something, or when a memory is clearly wrong and correction isn't appropriate. Prefer correct over forget when the memory just needs updating.

Args: rid: Single memory ID to forget. rids: List of memory IDs to forget (batch mode).

ParametersJSON Schema
NameRequiredDescriptionDefault
ridNo
ridsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds context like 'permanently' and 'tombstone', reinforcing the irreversible nature. This is consistent and adds value beyond the annotations, though the annotations already convey the key safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: a one-sentence purpose, a usage block, and parameter list. Every sentence carries essential information, and it is front-loaded for quick scanning. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 and the tool's destructive nature, the description adequately covers the key aspects: purpose, usage, parameters, and alternatives. It could mention that forget is irreversible (already implied by permanent/tombstone), but annotations cover that. No major gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It explains 'rid' as single memory ID and 'rids' as batch mode. However, it does not specify the format or source of memory IDs, which are necessary for invocation. The explanation is adequate but lacks depth.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description explicitly states the action: 'Permanently forget (tombstone) one or more memories.' It also distinguishes from the sibling tool 'correct', clarifying that 'correct' is preferred for updates, making the purpose specific and differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear when-to-use guidance: when user explicitly asks to forget or when a memory is clearly wrong and correction isn't appropriate. It also explicitly names the alternative ('prefer `correct` over `forget`'), which is excellent decision support.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gapsA
Read-onlyIdempotent

Surface knowledge gaps — frequently-asked, poorly-answered queries (v0.9.0 engine demand log).

The substrate logs every recall and tracks how often each query is asked

  • what top scores it surfaces. knowledge_gaps() returns the queries that are asked often but answered poorly — the substrate's "known unknowns". Use this to drive proactive learning: when the agent sees a gap, it can ask the user, fetch info, or note the limitation.

Args: min_count: Only surface queries asked at least this many times. max_avg_top_score: Only surface queries whose best recall score averages below this (lower = poorer answer). limit: Max gaps to return.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
min_countNo
max_avg_top_scoreNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds context about the internal mechanism ('substrate logs every recall...') and the nature of the output (frequently-asked, poorly-answered queries), which enhances transparency beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is reasonably concise, starting with the core purpose and then elaborating. It uses a bullet-like list for parameters. One minor point: the first sentence could be slightly more front-loaded, but overall it is efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has three parameters with defaults and an output schema. The description explains the tool's functionality, internal logging mechanism, and intended use case for proactive learning, which is fully adequate given the output schema provides return value details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates by explaining each parameter's semantics: min_count surfaces queries asked at least N times, max_avg_top_score filters by average best recall score, and limit caps results. This adds essential meaning beyond the schema's type and default values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose as 'Surface knowledge gaps — frequently-asked, poorly-answered queries'. This is a specific verb-resource combination that distinguishes it from siblings like 'recall' and 'memory' which deal with storing or retrieving specific facts, while this tool identifies unknown areas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: 'Use this to drive proactive learning: when the agent sees a gap, it can ask the user, fetch info, or note the limitation.' However, it does not explicitly exclude cases where this tool should not be used or mention alternative sibling tools such as 'stats' for similar analysis.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

graphB

Knowledge graph operations — entity relationships, memory↔entity links, record-to-record links, co-occurrence auto-relate, and link-expanded recall.

ACTIONS:

  • "relate": Entity↔entity relationship (legacy).

  • "edges": Get all relationships for entity.

  • "link": Link a memory (rid) to an entity (legacy).

  • "search": Find entities by pattern.

  • "profile": Rich entity profile.

  • "depth": How deeply the system knows an entity.

  • "auto_relate": v0.8.0 — co-occurrence-driven edge backfill. Set dry_run=False to persist.

  • "record_link": v0.9.0 — add a record-to-record link (needs source_rid + target_rid + link_type).

  • "record_unlink": v0.9.0 — remove a record-to-record link.

  • "linked_records": v0.9.0 — traverse links from rid (direction = "outbound" | "inbound" | "both", optional link_type filter).

  • "recall_with_links": v0.9.0 — semantic recall with N-hop link expansion.

Args: action: One of the actions above. entity / target / relationship / weight / rid / pattern / limit / days / namespace: Legacy entity-graph args. source_rid / target_rid / link_type: For record_link / record_unlink. direction: For linked_records — "outbound" / "inbound" / "both". dry_run: For auto_relate — preview without persisting. max_edges: For auto_relate — cap edges proposed/created. query: For recall_with_links — natural language search. top_k: For recall_with_links — max seed results. expand_links: For recall_with_links — hop budget for traversal.

ParametersJSON Schema
NameRequiredDescriptionDefault
ridNo
daysNo
limitNo
queryNo
top_kNo
actionYes
entityNo
targetNo
weightNo
dry_runNo
patternNo
directionNoboth
link_typeNo
max_edgesNo
namespaceNo
source_ridNo
target_ridNo
expand_linksNo
relationshipNorelated_to

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotation Contradiction: The description explicitly includes 'record_unlink: remove a record-to-record link' and auto_relate persistence, both of which are mutating/destructive operations, yet annotations declare destructiveHint=false. This directly contradicts the structured metadata, so the description fails to align with the tool's actual behavioral profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a summary line, a bulleted action list, and a grouped args section. It is front-loaded and scannable despite its length. The length is justified by the tool's multi-action nature and 19 parameters, though some repetition could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's high complexity (12 actions, 19 parameters) and the presence of an output schema, the description covers most actions and parameter groupings adequately. However, it lacks guidance on when to prefer this tool over sibling tools, and it does not describe return-value behavior or error conditions, leaving the overall context incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It groups parameters by action (source_rid/target_rid/link_type for record_link, direction for linked_records, dry_run/max_edges for auto_relate, query/top_k/expand_links for recall_with_links), which adds useful meaning. However, many legacy parameters (weight, days, namespace, pattern, limit) are only listed without semantic explanation, leaving gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as 'Knowledge graph operations' and enumerates 12 distinct actions with specific verbs and targets (relate, edges, link, search, profile, depth, auto_relate, record_link, record_unlink, linked_records, recall_with_links). This makes the tool's scope and capabilities immediately clear and distinguishes it from sibling memory/recall tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides action-specific usage details, such as 'Set dry_run=False to persist' for auto_relate, direction values for linked_records, and 'legacy' labels for relate/link. However, it does not explicitly state when to use this tool versus alternatives like recall or memory, nor does it provide exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memoryA

Manage individual memories — get, list, search, update importance, archive, hydrate, relevance feedback, fetch a chain-shaped namespace's head, or query revision history.

ACTIONS:

  • "get": Retrieve a single memory by rid.

  • "list": Browse memories with filters.

  • "search": Keyword substring search.

  • "update_importance": Change a memory's importance score.

  • "archive": Move to cold storage.

  • "hydrate": Restore archived memory.

  • "feedback": v0.10 — relevance feedback on a recalled memory (needs rid + feedback="relevant"|"irrelevant"). Call after USING a recalled memory; it tunes future retrieval. (Moved here from recall, which is now read-only.)

  • "chain_head": The CURRENT value of a chain-shaped namespace (narrative / decision / config chains). Use this — not recall — for "what is the current/latest X": similarity search favors the most-similar revision, chain_head returns the newest.

  • "history": v0.8.0 — revision history for a single rid (needs rid).

Args: See action docs above. New args: namespace: Required for chain_head — the chain-shaped namespace. rid: Required for history/feedback — the record acted on. feedback: For feedback — "relevant" or "irrelevant". feedback_query: For feedback — the query that surfaced the memory. feedback_score / feedback_rank: For feedback — retrieval context.

ParametersJSON Schema
NameRequiredDescriptionDefault
ridNo
limitNo
actionYes
domainNo
offsetNo
sort_byNocreated_at
feedbackNo
namespaceNo
importanceNo
memory_typeNo
feedback_rankNo
text_containsNo
feedback_queryNo
feedback_scoreNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds behavioral context beyond annotations, such as that feedback tunes future retrieval, chain_head returns the newest revision, and feedback was moved from recall. Annotations (readOnlyHint false) are consistent with mutation actions described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Structured with a main sentence and bullet list of actions; front-loaded with purpose. Some redundancy (e.g., repeating 'action' in each bullet) and length, but organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (14 parameters, many actions) and that output schema exists, the description covers actions well but lacks full parameter documentation. Missing descriptions for common parameters like limit, offset, memory_type, etc. reduces completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description partially compensates by documenting key parameters for specific actions (namespace for chain_head, rid for history/feedback, feedback-related fields) but omits descriptions for many other parameters (limit, offset, sort_by, domain, etc.).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool manages individual memories and lists multiple specific actions (get, list, search, etc.), clearly distinguishing it from sibling tools like recall (e.g., notes feedback moved from recall, and chain_head vs recall).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage guidance for key actions: feedback should be called after using a recalled memory; chain_head should be used instead of recall for current/latest values. Lacks comprehensive when-not-to-use notes for other actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

packA
Destructive

Signed, portable memory bundles — inspect, install, and trust packs.

A pack is a sealed corpus another agent or vendor published. Mounted pack memories are recallable alongside your own but are DOWN-WEIGHTED (tier_multiplier < 1.0): what the user told you locally always outranks imported knowledge.

READ ACTIONS (always available):

  • "list": Installed + mounted packs (id, name, origin, trust, rows).

  • "inspect": Read a pack file's manifest WITHOUT installing it. path=. Shows origin, signature, embedder, rows — always inspect before you install.

  • "publishers": Public keys this database trusts.

  • "embedder_identity": This database's embedding fingerprint. A pack must be sealed against a matching space to mount.

WRITE ACTIONS (operator-gated; set YANTRIKDB_ENABLE_PACK_WRITES=1):

  • "install": Install + mount a pack. path=.

  • "uninstall": Remove a pack and its rows. pack_id=.

  • "mount"/"unmount"/"unmount_all": Session-scoped mount control.

  • "trust": Trust a publisher key. pubkey=, label=.

  • "untrust": Revoke a publisher key. pubkey=.

Args: action: One of the read/write actions above. path: Pack file path (inspect / install / mount). pack_id: Pack identifier, e.g. "origin@1.0.0" (uninstall / unmount). pubkey: Publisher public key hex (trust / untrust). label: Human label for a trusted publisher (trust). allow_unverified_embedder: Mount despite an unverified embedder. Does NOT override a hard dimension mismatch.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo
labelNo
actionYes
pubkeyNo
pack_idNo
allow_unverified_embedderNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It discloses destructive behaviors (uninstall removes rows, untrust revokes keys), write gating via YANTRIKDB_ENABLE_PACK_WRITES, down-weighting of pack memories, and embedder verification nuances. This goes far beyond the destructiveHint annotation, providing rich context about side effects and trust.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (READ ACTIONS, WRITE ACTIONS) and a concise Args list. It is densely packed with useful information without fluff; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all actions, parameters, environmental prerequisites, security model, and even edge cases like 'Does NOT override a hard dimension mismatch.' Given the tool's complexity, this is thorough, and an output schema exists to handle return details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The Args section explicitly describes each parameter's purpose and permissible actions: 'path: Pack file path (inspect / install / mount)', 'pack_id: Pack identifier, e.g. "origin@1.0.0" (uninstall / unmount)', etc. With schema description coverage at 0%, this fully compensates and adds valuable constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line, 'Signed, portable memory bundles — inspect, install, and trust packs,' clearly identifies the tool's domain and operations. It distinguishes itself from sibling tools like 'remember' and 'skill' by focusing on external, signed memory bundles from other agents/vendors.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly separates READ ACTIONS (always available) from WRITE ACTIONS (operator-gated) and advises 'always inspect before you install.' It also explains the trust hierarchy (local memories outrank packs), but it doesn't explicitly contrast with alternative tools or state when not to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

personalityA
Idempotent

AI personality traits derived from memory patterns.

ACTIONS:

  • "get": Get current personality profile. Use recompute=True to refresh.

  • "set": Set a trait manually (needs trait_name + score).

Traits: warmth, depth, energy, attentiveness (0.0-1.0).

Args: action: "get" or "set". trait_name: For set: warmth, depth, energy, attentiveness. score: For set: 0.0-1.0. recompute: For get: re-derive from memory patterns first.

ParametersJSON Schema
NameRequiredDescriptionDefault
scoreNo
actionNoget
recomputeNo
trait_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the dual nature of the tool (read/write), the trait names and ranges, and the effect of 'recompute'. Annotations indicate idempotentHint=true, which aligns with set being idempotent. No contradiction, and adds value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with clear sections and bullet points for actions, traits, and args. It is somewhat long but well-organized. Every sentence adds value, though some redundancy exists (e.g., repeated trait names).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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), the description need not explain return values. It sufficiently covers all input aspects, including the recompute flag. For a tool with 4 parameters and no schema descriptions, this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description entirely compensates by listing all parameters, their types, defaults, and constraints (e.g., trait names, score range). Could mention default for action is 'get' but it's implied. Adequate for agent understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'AI personality traits derived from memory patterns.' It defines two distinct actions (get and set) with specific effects, and the tool name 'personality' aligns with the description. Different from sibling tools like 'memory' or 'recall'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use 'get' vs 'set' and mentions optional parameters like 'recompute'. However, it does not provide guidance on when NOT to use this tool or compare directly with sibling tools for decision-making.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

procedureA

Procedural memory — learn, surface, and reinforce strategies.

ACTIONS:

  • "learn": Store a procedure (needs text). What worked in a specific context.

  • "surface": Find relevant procedures (needs query). Returns ranked by effectiveness.

  • "reinforce": Update effectiveness (needs rid + outcome 0.0-1.0).

EXAMPLES:

  • procedure(action="learn", text="For this repo, always run tests before committing", domain="work")

  • procedure(action="surface", query="how to handle code review in this repo")

  • procedure(action="reinforce", rid="abc", outcome=0.9)

Args: action: "learn", "surface", "reinforce". text: Procedure description (for learn). query: What you're about to do (for surface). rid: Procedure ID (for reinforce). domain: Task domain. task_context: What kind of task (for learn). effectiveness: Initial effectiveness 0.0-1.0 (for learn). outcome: How well it worked 0.0-1.0 (for reinforce). top_k: Max results (for surface). namespace: Namespace.

ParametersJSON Schema
NameRequiredDescriptionDefault
ridNo
textNo
queryNo
top_kNo
actionYes
domainNogeneral
outcomeNo
namespaceNo
task_contextNo
effectivenessNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false, destructiveHint=false, etc. The description adds behavioral context by explaining that procedures are stored, retrieved, and updated with effectiveness scores. It does not contradict annotations and provides additional details about the reinforcement mechanism.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections (actions, examples, args). It is front-loaded with a clear purpose and uses bullet points and examples efficiently. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 10 parameters and an output schema, the description covers all necessary aspects: actions, parameter roles, examples, and defaults. The existence of an output schema reduces the need to describe return values. The description is complete for an agent to use effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does so excellently by listing each parameter with its purpose and conditions (e.g., 'text' is for learn, 'query' for surface, 'rid' for reinforce). This fully clarifies parameter semantics where the schema is silent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines the tool as 'procedural memory' with three distinct actions (learn, surface, reinforce), each with specific purposes. This differentiates it from sibling tools like 'memory', 'remember', and 'recall', which might have different scopes or behaviors.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit examples and explains when to use each action (e.g., 'learn' for storing, 'surface' for retrieval, 'reinforce' for updating effectiveness). It does not explicitly state when not to use the tool, but the clarity of actions and parameters effectively guides usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recallA
Read-onlyIdempotent

Search memories by semantic similarity, or refine low-confidence results.

MODES:

  • Search (default): recall("project architecture decisions")

  • Refine: recall("PostgreSQL vs MySQL decision", refine_from="database choice", refine_exclude=["rid1"])

ORDER: "recency" | "first_mention" (alias "chronological") | "certainty". Re-sorts the top_k already found; hints omitted. (Relevance feedback moved to memory(action="feedback") in v0.10 — recall is now purely read-only.)

WHEN TO USE: conversation start (summarize the user's first message); when the user references past decisions, people, preferences, or "last time"; when unsure about something the user assumes you know. Refine when first confidence < 0.5. After USING a recalled memory, reinforce it via memory(action="feedback", rid=..., feedback="relevant"). For "what is the CURRENT/latest X", prefer memory(action="chain_head") — similarity favors the most-similar revision, not the newest. For "what happened , in what order" ("tonight", "this week") use temporal(action="range") or since/until here — those words name the time frame, not the content; bare similarity cannot see the window.

QUERY: one short natural-language sentence (5-10 words), NOT a keyword list — keyword stuffing degrades quality. One focused question per call; separate calls for separate topics.

TRUST SIGNALS: each hit's why_retrieved may carry staleness warnings ("aged", "rarely confirmed", "superseded by a newer record"). Treat flagged hits as weak evidence — prefer fresher results or chain_head, and note the flag if you act on one anyway.

Args: query: Short natural language sentence (5-10 words). NOT a keyword list. top_k: Max results (default 10). 3-5 for focused, 10-20 for broad. memory_type: Filter: "semantic", "episodic", "procedural". domain: Filter: "work", "preference", "architecture", "people", etc. source: Filter: "user", "inference", "document", "system". namespace: Filter by namespace. include_consolidated: Include merged memories. include_superseded: v0.10 — recall EXCLUDES superseded records by default (current-by-default). Set True only for history / archaeology over a revision chain. expand_entities: Use knowledge graph boosting (default True). min_score_ratio: Drop hits scoring below this fraction of the TOP hit (0.8 = keep only near-as-good matches). Semantic search always returns top_k, even when one result is relevant and the rest are noise; this trims the tail instead of making you judge it. since: Only memories from this instant on — "2026-08-01", "2026-08-01T14:30:00Z", "6h"/"7d" (ago), or unix seconds. Filters BEFORE ranking: top_k is chosen inside the window. until: Window end (same formats; default now). Alone = up to then. refine_from: Original query text to refine from. query becomes the refinement. refine_exclude: Memory IDs to exclude when refining.

ParametersJSON Schema
NameRequiredDescriptionDefault
orderNo
queryYes
sinceNo
top_kNo
untilNo
domainNo
sourceNo
namespaceNo
memory_typeNo
refine_fromNo
refine_excludeNo
expand_entitiesNo
min_score_ratioNo
include_supersededNo
include_consolidatedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds meaningful behavior: recall excludes superseded records by default, semantic search always returns top_k, since/until filter before ranking, and hits may carry staleness warnings. It explicitly notes the read-only refactor and the order parameter's role as a re-sort, enriching the annotation profile without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long but densely organized under clear headings (MODES, ORDER, WHEN TO USE, QUERY, TRUST SIGNALS, Args). Every section adds operational value and nothing is redundant with the schema; the structure lets an agent fast-path to the relevant section.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter tool with complex behavior, the description is complete: it explains modes, ordering, when to use alternatives, query quality, trust/staleness signals, and every parameter's meaning. The output schema exists, so return-value detail is not required, and the tool's only required param is fully specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden and succeeds: the Args section documents all 15 parameters with formats, defaults, and behavioral nuance (e.g., min_score_ratio trims the tail, include_superseded for archaeology, since/until accepted formats). The query guidance ('5-10 words, not a keyword list') is especially valuable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Search memories by semantic similarity, or refine low-confidence results.' It clearly distinguishes the tool's two modes and contrasts it with sibling tools like memory(action='chain_head') and temporal(action='range'), leaving no ambiguity about what recall does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

A dedicated 'WHEN TO USE' section gives explicit triggers (conversation start, references to past decisions, low confidence) and names alternatives with conditions: prefer memory(action='chain_head') for current/latest and temporal(action='range') for time-window questions. It even instructs to reinforce recalled memories via memory(action='feedback').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rememberA

Store one or more memories in persistent cognitive memory.

WHEN TO USE: Call proactively whenever the conversation reveals something worth remembering — decisions, preferences, facts about people, project context. Do NOT store ephemeral task details, code snippets, or git-derivable info.

SINGLE: remember(text="User prefers dark mode", domain="preference", importance=0.7) BATCH: remember(memories=[{"text": "Alice is DevOps lead", "domain": "people"}, ...]) DRAFT: remember(summary="...long end-of-session summary...") — v0.8.0+ engine atomizes the summary into linked semantic facts; useful for the end-of-session auto-capture pattern.

IMPORTANCE: 0.8-1.0 critical decisions | 0.5-0.7 useful context | 0.3-0.5 background

Args: text: Memory text (for single memory). Be specific and searchable. memory_type: "semantic" (facts), "episodic" (events), "procedural" (how-to). importance: 0.0-1.0. Higher = remembered longer. domain: "work", "preference", "architecture", "people", "infrastructure", "health", "finance", "general". source: "user", "inference", "document", "system". valence: Emotional tone (-1.0 to 1.0). 0.0 neutral. metadata: Optional key-value pairs. namespace: For per-project isolation. certainty: Confidence 0.0-1.0. emotional_state: joy, frustration, excitement, concern, neutral. memories: List of memory dicts for batch. summary: For draft mode — long summary that the engine atomizes. idempotency_key: v0.10 engine — makes the write exactly-once: retrying with the same key + same text returns the SAME rid with no second write; same key + different text is an error. Engine-embedder (bundled) backend only. On batch, the key scopes per item as "{key}:{index}" if the atomic batch path is unavailable. created_at: v0.14 engine — BACKDATE the memory to when it was actually true, not when you imported it. Use for backfill (chat logs, migrations). Without it every imported memory stamps "now", which makes temporal(action="as_of") report history that never happened and flattens staleness/decay. Same formats as as_of: "2026-08-01", "2026-08-01T14:30:00Z", "7d" (ago), or unix seconds. Omit for anything learned in the present conversation.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNo
domainNogeneral
sourceNouser
summaryNo
valenceNo
memoriesNo
metadataNo
certaintyNo
namespaceNodefault
created_atNo
importanceNo
memory_typeNosemantic
emotional_stateNo
idempotency_keyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite minimal annotation detail, the description richly discloses behavior: exact-once write semantics with idempotency_key and version-specific engine behavior, batch key scoping, error conditions on key mismatch, backdating semantics for created_at, and the warning about temporal history distortion. This adds significant context beyond the annotations, which only state readOnlyHint=false and related booleans.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place, covering use cases, modes, parameter semantics, and version-specific behaviors. It is front-loaded with the purpose and WHEN TO USE, uses clear headers, and includes compact examples. The density is justified by the tool's complexity (14 parameters, 3 modes).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex write tool with 14 parameters and no required fields, the description provides comprehensive guidance: all parameters explained, mode selection, idempotency details, backdating semantics, and version notes. The presence of an output schema means return values need not be described, and the description handles the remaining context thoroughly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 every parameter in meaningful terms: types, defaults, value ranges (importance 0-1, valence -1 to 1), example values, and specific usage guidance (e.g., 'Be specific and searchable' for text). It also provides importance bands and created_at format options, which the schema does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear, specific action: 'Store one or more memories in persistent cognitive memory.' It distinguishes between single, batch, and draft modes, which are the primary variants, and explicitly contrasts with sibling tools like recall and forget by defining when to proactively store. This goes well beyond a vague verb+noun, fully differentiating it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit WHEN TO USE guidance: 'Call proactively whenever the conversation reveals something worth remembering...' and negative guidance: 'Do NOT store ephemeral task details, code snippets, or git-derivable info.' It also includes usage patterns (SINGLE, BATCH, DRAFT) and an end-of-session auto-capture pattern, giving clear context and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sessionA

Session lifecycle — start, end, history, active check, stale cleanup, and the v0.9.0 boot-time digest.

ACTIONS:

  • "start": Begin a new session. Returns session_id.

  • "end": End a TRACKED session (needs session_id). Returns stats. This closes session bookkeeping — it does NOT capture memories.

  • "capture": Segment a free-text session summary into atomic candidate memories (needs summary; NO session_id — it operates on the text, not on tracked-session state). Returns drafted rids. Use at end of substantial work so the session leaves a trace.

  • "history": View past sessions.

  • "active": Check if there's a running session.

  • "abandon_stale": Clean up orphaned sessions older than abandon_stale_hours.

  • "digest": One-call boot-time briefing (v0.9.0) — narrative chain head, open decisions/conflicts/triggers, top stale memories. Call this at conversation start instead of N separate recalls. Set include_gaps=True to fold known-unknowns (frequently-asked, poorly-answered queries) into the briefing — the active-learning loop. Set scope to filter content aggregates to one namespace for a per-tenant digest.

Args: action: "start", "end", "capture", "history", "active", "abandon_stale", "digest". session_id: For end. namespace: Memory namespace. client_id: Client identifier. metadata: For start — optional dict. summary: For end — optional closing note. For capture — REQUIRED, the session summary to segment into memories. domain: For capture — domain stamped on drafted memories. limit: For history. abandon_stale_hours: For abandon_stale — max age in hours. narrative_namespace: For digest — namespace for the narrative chain. scope: For digest — filter content aggregates to one namespace (per-tenant isolation); omit for a whole-DB digest. include_gaps: For digest — fold top knowledge gaps into the briefing. max_gaps: For digest — cap on gaps surfaced when include_gaps=True. max_decisions / max_conflicts / max_triggers: For digest — surface caps. snippet_chars: For digest — text-snippet length per item.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
scopeNo
actionYes
domainNogeneral
summaryNo
max_gapsNo
metadataNo
client_idNodefault
namespaceNodefault
session_idNo
include_gapsNo
max_triggersNo
max_conflictsNo
max_decisionsNo
snippet_charsNo
abandon_stale_hoursNo
narrative_namespaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description comprehensively discloses behaviors beyond annotations: e.g., end 'closes session bookkeeping — it does NOT capture memories', and capture 'operates on the text, not on tracked-session state'. Annotations already show readOnlyHint=false, consistent with mutations. No contradictions. Could mention rate limits or permissions but still strong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a summary line, action bullet list, and parameter definitions. It is somewhat long but every sentence adds value. Minor redundancy: 'digest' action description includes parameter details repeated in the arg list, but acceptable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (17 parameters, 7 actions) and the presence of an output schema, the description covers all actions and parameters thoroughly, including edge cases like abandon_stale and gaps in digest. No significant gaps for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 each parameter's purpose per action, e.g., 'summary: For end — optional closing note. For capture — REQUIRED'. All 17 parameters are covered, providing critical context the schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Session lifecycle' and lists seven actions (start, end, capture, history, active, abandon_stale, digest), clearly defining the tool's scope. It differentiates from sibling tools like remember/recall by focusing on session management rather than direct memory operations, though capture could overlap with remember; a clearer distinction would raise the score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance for each action, e.g., 'Use at end of substantial work so the session leaves a trace' for capture, and 'Call this at conversation start instead of N separate recalls' for digest. It contrasts digest with separate recalls, but does not explicitly state when not to use session versus siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

skillA

Substrate-native agent skill catalog — define, surface, record outcomes.

Skills are structured catalog entries (skill_id, applies_to, body, type) — different from loose how-to memories (use procedure for those). Writes go to the skill_substrate namespace so every yantrikdb consumer (this MCP, yantrikdb-hermes-plugin, Lane B SDK, WisePick) sees the same catalog.

Schema-validated at write time:

  • skill_id: lowercase dot-separated segments, e.g. "workflow.git.commit_clean"

  • body: 50–5000 chars

  • applies_to: 1–10 lowercase_underscore identifiers (no hyphens)

  • skill_type: one of procedure | reference | lesson | pattern | rule

ACTIONS:

  • "define": Create a skill (needs skill_id, body, skill_type, applies_to).

  • "surface": Find relevant skills (needs query). Returns ranked by score.

  • "outcome": Append a use outcome (needs skill_id, succeeded).

  • "get": Fetch a single skill by id.

  • "list": Catalog browse (filter by applies_to / skill_type).

EXAMPLE: skill(action="define", skill_id="workflow.git.commit_clean", body="Before commit: run pytest + lint...", skill_type="procedure", applies_to=["git", "release"]) — then surface(query=...) before similar work, and outcome(skill_id=..., succeeded=True/False) after using one.

Args: action: "define", "surface", "outcome", "get", "list". skill_id: Dot-separated id (for define/get/outcome). body: Skill body, 50–5000 chars (for define). skill_type: procedure|reference|lesson|pattern|rule (for define). applies_to: Non-empty identifier list ≤10 entries (for define; optional filter for surface/list). triggers: Optional list of trigger phrases (for define). on_conflict: "reject" (default) or "replace" if skill_id exists. version: Optional semver-shaped version string. supersedes: Optional skill_id this one replaces. query: Natural-language search (for surface). top_k: Max results for surface. succeeded: Outcome boolean (for outcome). note: Optional outcome note. limit: Max results for list.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
noteNo
limitNo
queryNo
top_kNo
actionYes
versionNo
skill_idNo
triggersNo
succeededNo
applies_toNo
skill_typeNo
supersedesNo
on_conflictNoreject

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide no safety hints (all false), so the description carries the burden. It discloses that writes go to the `skill_substrate` namespace, that entries are schema-validated at write time, and that `on_conflict` can reject or replace. This gives useful behavioral context beyond the annotations, though it doesn't cover every edge case like permissions or rate limits, which is acceptable for this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with a summary, action list, example, and Args section. It is not wastefully verbose; every section covers a necessary aspect of a complex multi-action tool. It loses one point because it could be slightly tightened, but overall it remains readable and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-action tool with 14 parameters and zero schema descriptions, the description is comprehensive. It covers all actions, parameter semantics, validation rules, an example, and the sibling differentiation. Since an output schema exists, the lack of return-value details is acceptable. The agent has enough context to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates fully. It lists every parameter with context: action values, skill_id format (dot-separated lowercase), body length constraints, applies_to rules (1–10 lowercase_underscore, no hyphens), skill_type enum, on_conflict options, and which params apply to which action. This adds meaning far beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb-resource statement: "Substrate-native agent skill catalog — define, surface, record outcomes." It also distinguishes itself from sibling 'procedure' by explicitly saying skills are structured catalog entries, not loose how-to memories. This leaves no doubt about what the tool does and how it differs from nearby tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states when to use each action and provides an explicit alternative: "different from loose how-to memories (use `procedure` for those)." It also gives a concrete workflow example (define → surface → outcome) that teaches the agent when to invoke which action, making usage guidance highly actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statsA
Read-onlyIdempotent

Engine statistics, health check, learned weights, privacy/leak audit, and skill substrate counts. Read-only — index maintenance moved to think(maintenance_op=...) in v0.10.

ACTIONS:

  • "stats": Detailed memory statistics (default).

  • "health": Quick health check with latency.

  • "weights": Show adapted recall scoring weights.

  • "audit_leak": v0.8.0 windowed leak-candidate audit — surfaces recent records that may have leaked sensitive content. Use for privacy review.

  • "skill_outcomes": v0.9.0 — total skill outcomes recorded in the durable timeline.

Args: action: One of the actions above. namespace: Filter for stats. max_rids: For audit_leak — max candidate rids to inspect.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNostats
max_ridsNo
namespaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds valuable context: 'Read-only — index maintenance moved to think(maintenance_op=...) in v0.10', which explains the tool's non-destructive nature and where related operations occur.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections for actions and arguments. It uses bullet points for readability, though it is slightly verbose in listing actions. Every sentence adds value, but it could be slightly tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple actions, parameters, and an output schema), the description covers all necessary aspects: purpose, actions, parameter explanations, and behavioral notes. The output schema exists, so return values are not required in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description thoroughly explains each parameter: 'action' with a list of valid values and their meanings, 'namespace' as a filter for stats, and 'max_rids' for audit_leak actions. This fully compensates for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool is for 'Engine statistics, health check, learned weights, privacy/leak audit, and skill substrate counts'. It lists specific actions with distinct purposes, which differentiates it from sibling tools like 'memory' or 'recall'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions 'Read-only' and directs index maintenance to 'think(maintenance_op=...)' in v0.10, providing context on when to use this tool versus alternatives. However, it does not explicitly state when not to use it or name specific sibling alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

taskA
Destructive

Substrate-backed task / chore store (v0.9.0 engine).

A thin general-purpose to-do tracker baked into yantrikdb — survives sessions, lives next to memories so future agents see open tasks at session_digest time.

ACTIONS:

  • "add": Create a task (needs title; optional priority + parent_id).

  • "get": Fetch one task by id.

  • "list": List tasks in a namespace, optionally filtered by status.

  • "update": Update status and/or priority (needs task_id).

  • "delete": Delete a task (needs task_id).

PRIORITY: "low" | "medium" | "high" — priority-ordered in list. STATUS: typically "open" | "doing" | "done" | "blocked".

Args: action: "add" | "get" | "list" | "update" | "delete". namespace: Per-project / per-agent isolation. title: Task description (for add). priority: "low" | "medium" | "high" (for add / update). parent_id: Optional parent task id (for add — sub-task tree). task_id: Task id (for get / update / delete). status: Filter (for list) or new value (for update).

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNo
actionYes
statusNo
task_idNo
priorityNo
namespaceNodefault
parent_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as destructive; the description adds behavioral context beyond annotations, noting persistence across sessions, priority ordering in list results, namespace isolation, and action-specific data requirements. It does not detail delete side effects (e.g., sub-task handling), but action-specific behavior is well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well front-loaded, uses simple headers for actions and valid values, and every sentence contributes operational guidance. There is no redundant fluff or repeated schema data; the Arg list is concise and structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-action CRUD tool with 7 parameters and sparse schema descriptions, this is thorough: it covers all actions, parameter purposes, accepted enums for priority/status, namespace default, and the relation to session digest. The output schema exists, so return-value transcription is unnecessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 by defining each parameter in context of accepted actions. It explains that title is needed for add, task_id for get/update/delete, status is filter-vs-update-value, and parent_id creates a sub-task tree. This is exactly the kind of semantic clarity an agent needs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with 'Substrate-backed task / chore store' and labels it 'a thin general-purpose to-do tracker,' clearly identifying the resource and domain. It enumerates concrete actions (add/get/list/update/delete) and thereby distinguishes this tool from sibling memory/skill utilities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives strong context: tasks persist across sessions, are scoped by namespace, appear at session_digest time, and are used by future agents. However, it does not explicitly state when not to use this tool or name alternative sibling utilities, though the context is sufficiently clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

temporalA
Read-onlyIdempotent

Find stale or upcoming memories, recall the past, or scan a time window.

ACTIONS:

  • "stale": Important memories not accessed recently.

  • "upcoming": Memories with approaching deadlines/events.

  • "as_of": Time-travel recall — excludes anything recorded after as_of, so you see the belief held then, not today's. Engine v0.12+.

  • "range": Everything in a time window, oldest first — the surface for "what happened tonight / this week, in what order". Period and sequence questions are SET queries over a window; similarity search cannot answer them — route them here.

Args: action: "stale", "upcoming", "as_of", or "range". days: Inactivity threshold (stale) or look-ahead window (upcoming). limit: Max results. namespace: Optional filter. query: Search text (required for "as_of"; optional for "range": given = relevance-selected within the window, omitted = the window's newest limit records). as_of: Past instant (required for "as_of"): "2026-08-01", "2026-08-01T14:30:00Z", "7d"/"24h" (ago), or unix seconds. since: Window start (required for "range"), same formats as as_of. until: Window end for "range" — defaults to now.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
as_ofNo
limitNo
queryNo
sinceNo
untilNo
actionYes
namespaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, which align with the description's query-like actions. The description adds behavioral context beyond annotations by explaining that as_of excludes records after the given instant ('so you see the belief held then'), specifies the engine version, and notes that range returns oldest first. This enriches the agent's understanding without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear summary line, an ACTIONS section explaining each mode, and an Args section detailing parameters. It is front-loaded with the main purpose, and every sentence contributes meaningful information—no fluff or redundancy. The density is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 4 actions, 8 parameters, and an output schema (presumably defining return format), the description covers all essential aspects: purpose, action semantics, parameter formats, default behaviors, and routing guidance. It also discloses the engine version constraint for as_of. The presence of an output schema means return-value explanation is unnecessary, and the description sufficiently equips an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description carries full responsibility for parameter meaning. It meticulously explains each parameter: action (allowed values), days (threshold/look-ahead), limit (max results), namespace (optional filter), query (required for as_of, optional for range with behavior for given/omitted), as_of/since/until (formats including relative days), thus exceeding what the bare schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Find stale or upcoming memories, recall the past, or scan a time window' with four named actions (stale, upcoming, as_of, range). It distinguishes from sibling tools like 'recall' by focusing on temporal queries and explicitly contrasts with similarity search for range queries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance for when to use each action. The range action is described as the surface for 'what happened tonight / this week, in what order' and explicitly routes period/sequence questions here, contrasting with similarity search. as_of is described as time-travel recall, and stale/upcoming have clear use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

thinkA

Run incremental cognitive maintenance — processes a small batch per call.

DESIGNED TO BE CALLED OFTEN: Each call processes ~5 memories (configurable). Running regularly (e.g. at end of conversation) gradually maintains the entire database without blocking. Safe to call frequently.

MODES:

  • Default: incremental think() — consolidation + conflict scan + (optional) pattern mining on a small batch.

  • maintenance_cycle=True: run the v0.9.0 autonomous-hygiene "sleep cycle" — think + burn-down-conflicts + prune-triggers + recalibrate-importance + backfill-entities + auto-relate (+ optional split_oversized + repair_artifacts).

  • last_cycle_only=True: just fetch the last persisted maintenance-cycle summary (read-only, no work performed).

  • maintenance_op="backfill_entities"|"rebuild_vec_index"|"rebuild_graph_index": run ONE targeted index-maintenance op and return. (Moved here from stats in v0.10 so stats could become read-only.)

Args: run_consolidation: Merge similar memories (default on). run_conflict_scan: Detect contradictions (default on). run_pattern_mining: Mine cross-domain patterns (default off, slow). consolidation_time_window_days: Only consolidate memories within this window (default 7 days). consolidation_limit: Batch size — max memories to process per call (default 5). Keep small for fast returns. maintenance_cycle: Run the full autonomous hygiene cycle instead. last_cycle_only: Just fetch the last cycle summary (read-only). dry_run: For maintenance_cycle — preview without persisting changes. burn_down_conflicts / prune_triggers_too / max_pending_triggers / recalibrate_importance / backfill_entities / auto_relate_in_cycle / max_auto_relate_edges / split_oversized / split_min_chars / repair_artifacts: Maintenance-cycle knobs.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNo
maintenance_opNo
last_cycle_onlyNo
split_min_charsNo
split_oversizedNo
repair_artifactsNo
backfill_entitiesNo
maintenance_cycleNo
run_conflict_scanNo
run_consolidationNo
prune_triggers_tooNo
run_pattern_miningNo
burn_down_conflictsNo
consolidation_limitNo
auto_relate_in_cycleNo
max_pending_triggersNo
max_auto_relate_edgesNo
recalibrate_importanceNo
consolidation_time_window_daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given annotations only provide shallow hints (readOnlyHint=false, destructiveHint=false), the description carries the behavioral burden and does so thoroughly. It discloses side effects (consolidation, conflict scan, pruning, recalibration), the non-blocking incremental design, the slow pattern-mining option, dry-run behavior, and read-only last_cycle_only mode. This goes well beyond annotations and there is no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although lengthy, the description earns its length through structured sections (MODES, Args) and immediately front-loads the core purpose and operational guidance. There is no redundant filler; each sentence adds necessary information for correct invocation of a complex 19-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for the tool's complexity: it covers default behavior, alternative modes, per-parameter semantics, performance characteristics, read-only vs. mutating operations, and safe call frequency. Since an output schema exists, return-value details are not required. No meaningful gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does: the 'Args' section explains all 19 parameters, including defaults and semantic intent. The MODES section additionally documents maintenance_op's accepted values and behavior. This turns an effectively opaque schema into a usable interface.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Run incremental cognitive maintenance — processes a small batch per call.' It clearly distinguishes the main behavior and further clarifies multiple modes (default, maintenance_cycle, last_cycle_only, maintenance_op), making the tool's purpose unambiguous even among sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use it: 'DESIGNED TO BE CALLED OFTEN' and 'Running regularly (e.g. at end of conversation) gradually maintains the entire database without blocking.' It also explains the different modes and when each is appropriate. It does not explicitly contrast with sibling tools, but the intended call cadence and mode selection provide strong usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

triggerA
Idempotent

Manage proactive triggers + v0.8.0 bounded-backlog pruning.

ACTIONS:

  • "pending": Get pending triggers (default).

  • "history": View past triggers.

  • "acknowledge": Mark trigger as seen.

  • "deliver": Mark as shown to user.

  • "act": Mark as acted upon.

  • "dismiss": Dismiss as irrelevant.

  • "prune": v0.8.0 — expire overdue triggers + evict oldest when over max_pending. Set dry_run=False to actually persist.

Args: action: One of the actions above. trigger_id: Required for acknowledge/deliver/act/dismiss. trigger_type: Filter by type (for pending/history). limit: Max results. dry_run: For prune — preview without persisting. max_pending: For prune — soft cap on the pending backlog (default 64).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
actionNopending
dry_runNo
trigger_idNo
max_pendingNo
trigger_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds behavioral context beyond annotations: it explains that acknowledge/deliver/act/dismiss are marking operations, and prune has a dry_run mode to preview before persisting. Annotations already mark it as idempotent and non-destructive, and the description reinforces this with specifics like 'Set dry_run=False to actually persist'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the overall purpose, then uses bullet points for actions and arguments, making it easy to scan. It is concise but covers all necessary details. Minor redundancy: the args section repeats action and parameter names, but overall it is well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 parameters, multiple actions, and an output schema, the description is largely complete. It explains all actions and parameters, and the output schema fills any return-value gaps. Lacks mention of error conditions or prerequisites, but these are not critical for the agent's immediate use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, so the description bears the full burden. It thoroughly explains each parameter: action lists valid options, trigger_id is required for certain actions, trigger_type filters, limit for max results, dry_run and max_pending specifically for prune. This fully compensates for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool manages proactive triggers and bounded-backlog pruning. It lists specific actions (pending, history, acknowledge, deliver, act, dismiss, prune) that define the resource and operations, distinguishing it from sibling tools which cover different domains like memory or conversation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description details each action's purpose (e.g., 'Get pending triggers', 'Mark trigger as seen'), which implicitly guides when to use each. However, it does not explicitly compare this tool to siblings or provide decision heuristics for choosing alternatives, which would elevate clarity further.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A3.8/5.0
Disambiguation3/5

Many tools share adjacent responsibilities (recall vs memory search vs graph recall_with_links; procedure vs skill; think vs conflict), so an agent could easily pick the wrong one. The extensive descriptions provide routing guidance, but the boundaries are subtle enough that selection requires reading deeply.

Naming Consistency3/5

Names are uniformly lowercase single words, but they mix bare verbs (recall, remember, correct, think) with noun subsystem labels (memory, graph, session, skill, pack). There is no consistent verb_noun pattern, though the names remain short and readable.

Tool Count3/5

With 20 tools, the server sits at the heavy end of a reasonable range. Because many tools are actually multi-action dispatchers, the effective surface area is considerably larger than 20, which makes the toolset feel sprawling.

Completeness4/5

The surface is remarkably thorough: memory CRUD, recall, maintenance, conflicts, triggers, sessions, temporal queries, graph operations, procedures, skills, tasks, packs, and stats are all covered. Minor gaps remain (no deletion for procedures/skills, no category member removal), but core workflows have no dead ends.

Maintenance

ActivityActive
ResponsivenessSyncing

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

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Persistent memory and human approval for any AI agent. Give your AI agents the ability to remember across sessions and ask humans for approval before sensitive actions. Works with Claude, Cursor, OpenClaw, and any MCP-compatible client.
    6
    13
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Zettelkasten-based persistent memory for AI coding agents. Auto-saves atomic knowledge cards with \[\[bidirectional links]] after tasks and auto-recalls before new ones. No vector DB — plain markdown files with git sync. Works as Claude Code plugin or MCP server for Cursor, VS Code Copilot, Codex, and Windsurf.
    198
    140
    MIT
  • F
    license
    A
    quality
    B
    maintenance
    Self-hosted MCP-native agent memory server. Gives AI agents persistent, decay-weighted memory via 83 MCP tools — no cloud, full control. RocksDB+HNSW backend. Works with Claude Code, Cursor, and any MCP-compatible agent.
    14
    8
  • A
    license
    A
    quality
    A
    maintenance
    A local-first MCP server that gives AI coding agents persistent memory and controlled commands. Features a git-backed markdown knowledge vault with FTS5 search, surgical section edits, token-aware context budgeting, and a sandboxed command engine with human approval gates. Works with Claude Code, Cursor, Copilot, Gemini, and more.
    53
    10
    1
    Apache 2.0

Latest Blog Posts

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/yantrikos/yantrikdb-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server