loom
loom is an MCP server that gives an AI agent persistent identity, memory, and knowledge across sessions and harnesses.
Load persistent identity, preferences, self-model, and project context at session start (
identity)Load a third-person operating brief for worker bodies, including push-back mandates (
dossier)Store, search, update, forget, list, prune, and audit episodic memories with categories, TTLs, and semantic recall (
remember,recall,update,forget,memory_list,memory_prune,memory_audit)Find semantically similar memories for deduplication and consolidation (
find_similar)Archive and restore memories instead of hard-deleting them (
memory_archive,memory_restore)Stage, review, ratify, or reject proposed memory drafts via a capture-propose queue (
memory_propose,memory_proposals,memory_ratify,memory_reject)Edit identity sections like preferences and self-model, while keeping the terminal creed immutable (
update_identity)Bootstrap a fresh agent identity from an interview (
bootstrap)Scaffold or self-describe harness manifests for different MCP runtimes (
harness_init,harness_describe)Write, search, maintain, archive, restore, move, merge, supersede, purge, verify, and view revision history of knowledge pages (
knowledge_write,knowledge_recall,knowledge_maintain,knowledge_archive,knowledge_restore,knowledge_move,knowledge_merge,knowledge_supersede,knowledge_purge,knowledge_verify,knowledge_history)
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@loomremember that I'm working on loom"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
loom
Persistent identity and memory for AI agents, as an MCP server.
loom is configured into your MCP-capable harness — Claude Code, Cursor, Codex, Gemini CLI, etc. — and provides persistent identity and memory to the agents that run there. An agent that loads loom carries its name, values, working preferences, and episodic memories from one session to the next, regardless of which model or client it runs in.
When the harness changes, the agent persists.
Demo
60 seconds: cold install → /loom-setup in Claude Code → agent wakes with
identity in the next session → save and recall a memory.
To play locally: asciinema play assets/demo.cast
Related MCP server: elephantasm-mcp
What it is
A Model Context Protocol server exposing 31 tools that read and write an agent's persistent state:
identity— loads the terminal creed — the free-form markdown document that defines who the agent is (values, voice, purpose) — along with preferences, self-model (running self-knowledge), and a client-specific adapter on session start. Call this first.dossier— loads Art's operating brief for a worker body — a body that executes tasks on Art's behalf but is NOT Art. Returns preferences and self-model reframed in the third person, plus an explicit push-back mandate: workers are expected to refuse bad work and say why, including requests from Art or Jonathan. Does not include the terminal creed (IDENTITY.md).remember/recall/update/forget— episodic memory with semantic (vector) recall, optional TTL, and category filtering.memory_list/memory_prune— browse and maintain the store.episodes— the episode tape: the short-term, cross-body tier. Every body leaves acategory: episodenote (where it was / what was said or decided / what shipped / what's open; 48h TTL by default) and every body gets the last 24h of them at boot as a plain time-ordered tape, injected right after preferences. Never salience-ranked — it's what just happened, not what's important.loom memory tape [--hours N]is the CLI view.find_similar— surface memories semantically near an existing entry or free-form text; used for deduplication and memory consolidation.memory_audit— one-shot health report: stale entries, near-duplicate pairs, category breakdown.memory_archive/memory_restore— soft-retire a memory with a tombstone (who/when/why + original body preserved) instead of deleting it. Archived memories are excluded from recall and audit but remain recoverable.memory_propose/memory_proposals/memory_ratify/memory_reject— the capture-propose queue: a staging area a background lane drafts memory writes into, that Art ratifies before they become canon. A proposal is not authored memory — it lives in a separateproposalstable, invisible torecall,memory_list,find_similar, and the boot digest.memory_proposestages a draft;memory_proposalslists what's pending;memory_ratifycommits one through the same validated write path asremember(an invalid proposal is refused and stays pending);memory_rejectdiscards one. Never auto-committed — ratification is the gate that keeps loom's one-writer, authored model intact while getting auto-capture ergonomics.update_identity— section-level edits topreferences.mdandself-model.md. The terminal creed stays immutable through the tool layer.bootstrap— initialize a fresh agent from a four-question interview.harness_init— scaffold a harness manifest (a harness is the MCP-capable runtime the agent runs in: Claude Code, Codex, Gemini CLI, etc.).harness_describe— let the currently connected harness self-describe: write its own manifest, keyed to its MCPclientInfo.name. A harness can only describe itself, never another — the target is the connected peer, not a caller-supplied name.knowledge_write— upsert an entity page by slug into the knowledge store (a separateknowledge.db). On an existing slug the body replaces by default (mode: "append"adds instead), title/domain follow the write, and citations append with exact-duplicate dedup. Enforces the epistemic gate: a page whose only support is conversation citations is storedprovisional. Knowledge is truth independent of the user; memories are about the user or your work.knowledge_recall— LIKE search over title, body, and domain in the knowledge store. Two tiers:full(whole pages; stampslast_accessed/hit_count) andindex(compact slug/snippet listing; no stamping). Defaults to full with a query, index when browsing. Full output is size-guarded — overflow matches degrade to index entries. Never surfaces archived pages.knowledge_maintain— read-only health report for the knowledge store: expansion candidates (thin body + high hit_count), cold pages (not recently accessed), and misfile audit (pages that belong in memory instead).knowledge_archive— soft-retire a knowledge page (setsstatus='archived'with an optional tombstone note). Archived pages are excluded from recall and maintain but remain recoverable viaknowledge_restore.knowledge_restore— return a previously archived knowledge page to active status. Clears the archive flag and tombstone note.knowledge_supersede— mark one page as superseded by another: archives the old slug with a tombstone referencing the canonical slug, and records the relationship in thesupersessionstable. The dedup-merge primitive: write the canonical page withknowledge_write, then callknowledge_supersede(loser → canonical).knowledge_move— re-key or re-domain a page in place (same row, same uuid, citations and verification history preserved). Three modes: single-page re-slug and/or re-domain; batch re-domain by explicit slug list; batch re-domain by domain-prefix substitution (moves an entire subtree atomically). Slug collisions are rejected — useknowledge_mergeinstead.knowledge_merge— consolidate 2+ knowledge pages into one canonical page. Re-parents all citations (deduplicating by claim+source), takes MAX(verified_at), and supersedes losers (archives with a tombstone pointer to the target). Passhard_delete_losers=trueto DELETE losers after archiving (citations cascade, supersession pointers survive).knowledge_purge— hard-delete one or more archived knowledge pages and cascade their citations. Archive-first guard: rejects any page not already archived (callknowledge_archivefirst). All slugs in a batch must be archived; any active slug rejects the entire batch with no mutation.confirm: trueis required as an explicit safety gate. Supersession pointers are preserved (historical record). Use after merge/supersede to clean up tombstoned cruft.knowledge_verify— stamp a page as verified without touching its body: setsverified_atand optionallyfreshness_anchor. The verification engine's primitive — recording "claims still hold" must never go throughknowledge_write(a verify run once replaced 13 page bodies with its notes). An optionalnoteappends a dated## Verificationsection (append-only). Batch mode (slugs) stamps many pages with one timestamp; archived pages and unknown slugs reject the whole batch.knowledge_history— body-revision history and recovery. Replace-writes snapshot the displaced body intopage_revisions(newest 10 kept per page). List a page's snapshots, read one byrevision_id, orrestore: trueto put one back — the body it displaces is snapshotted first, so a restore is never itself a destructive overwrite. Revisions follow the page across renames and are purged with it.
Everything lives on disk as plain markdown plus a single SQLite file. No daemon, no external service, no GPU.
Memory is organized into categories — an open vocabulary. Common ones: user,
project, self, feedback, reference, pursuit. New categories are
created implicitly by writing a memory with that category.
How loom is different
loom gets compared to several other agent memory systems. The short version:
I want to… | Use |
Memory for many users of an app | Mem0 |
Temporal reasoning over conversation history | Zep |
A complete agent framework with integrated memory | Letta |
Project-scoped memory in Claude Code | auto-memory (built in) |
Portable identity + memory across harnesses | loom |
An agent that survives a harness change | loom |
vs. Mem0 — Mem0 is multi-user managed memory for product-scale applications: hosted, authenticated, multi-tenant. loom is single-user, local-only, and identity-first. Mem0 has no concept of who the agent is.
vs. Zep — Zep builds a temporal knowledge graph by automatically
extracting facts from conversation logs. loom is agent-authored: the agent
calls remember and decides what to record. There is no automatic extraction.
vs. Letta — Letta runs the agent loop and owns its memory internally. loom doesn't run the loop — the harness does. Switch harnesses tomorrow; loom's context directory travels with you.
vs. harness-native files — Writing identity into CLAUDE.md works until
you're on two harnesses. Then you have two files that drift. loom inject
writes a managed pointer in each harness's dotfile pointing at one context
directory, with semantic recall instead of verbatim context dumps.
Full comparison: docs/positioning.md
The stack
loom ships one opinionated stack:
Storage —
better-sqlite3+ thesqlite-vecvec0 virtual table. Onememories.dbper agent, real cosine similarity.Embeddings — BGE-small-en-v1.5 (384-dim, ~33MB ONNX, CPU-only) run through
onnxruntime-node. First run downloads the model to~/.cache/loom/fastembed/. The runtime is vendored insrc/backends/embedding-runtime.ts— it started as thefastembedpackage, which was archived upstream while pinned to atarline that will never be patched.Transport — MCP over stdio.
If you need a different backend, implement the MemoryBackend and
EmbeddingProvider interfaces in src/backends/types.ts and swap
the concrete classes in src/backends/index.ts. There is
deliberately no env-driven backend selector — opinionated by design.
Quick start
Prerequisites
Node.js ≥ 22 (tested on 22 and 24;
enginesrequires ≥ 22).
That's it.
Install the setup skill
npx @jbarket/loomai installA single-select picker asks which harness you want loom wired into.
Pick one of: Claude Code, Codex, Gemini CLI, OpenCode. (If your
harness isn't listed, pick "Other" and loom writes
./loom-setup-skill.md — hand it to your agent as-is.)
Scripting:
npx @jbarket/loomai install --harness claude-code
npx @jbarket/loomai install --harness codex --json
npx @jbarket/loomai install --harness claude-code --to ~/my/skills/loom-setup.mdFinish setup inside the harness
Open your chosen harness. Run the skill:
Claude Code —
/loom-setupCodex / Gemini CLI / OpenCode — "use the loom-setup skill"
The skill drives the rest: probes the environment, asks four questions (your name, the agent's name, a purpose line, a voice line), bootstraps identity files, scaffolds a harness manifest, edits the harness's MCP config (with verification), and verifies wake. Restart the harness when it tells you to. Your agent will wake on its next session.
Doing it yourself
If you'd rather wire everything by hand, every piece is a CLI command. See the CLI reference below.
Serving loom over the mesh
By default loom serve speaks MCP over stdio — the harness spawns
loom as a child process, one per session, co-located on the same box.
That's the right model when the agent and its state live together.
loom serve --http instead runs loom as a long-lived HTTP MCP
daemon, so a chat client on one machine can reach loom's identity and
memory while the heavy state (the SQLite stores, the fastembed model)
stays on a single host. This is the two-surface model: e.g. Claude
Desktop on a laptop talking to a loom daemon on a home server, both
agent and stack carried by the same identity.
# loopback only (default host 127.0.0.1, port 8787)
loom serve --http
# bind a mesh interface so other machines on the tailnet can reach it
loom serve --http --host 100.94.0.12 --port 8787Host, port, and an optional bearer token come from flags or environment:
Variable | Flag | Default | Description |
|
|
| Interface to bind |
|
|
| Port to listen on |
| — | (unset) | When set, every request must present this token |
The security boundary is the network
The daemon refuses to bind a public interface. At startup it
asserts the host is loopback, an RFC1918 private address
(10/8, 192.168/16, 172.16–31), the Tailscale CGNAT range
(100.64.0.0/10), or an IPv6 ULA / link-local / loopback. A
0.0.0.0 / :: bind-all wildcard or any globally routable address is
rejected before a socket opens. The intended deployment is behind
Tailscale (or a LAN), where the tailnet is the access control.
A LOOM_BEARER_TOKEN adds defense in depth: when set, every request
must carry a matching Authorization: Bearer … header (compared in
constant time). When unset, the network boundary alone gates access —
appropriate for a token-less tailnet-only daemon.
Session and stream behavior
One server per session. Each MCP session (keyed by the
mcp-session-idheader) gets its own server + transport over the shared context directory. loom's durable state lives in the stores, not the session, so sessions are cheap routing handles — the StreamableHTTP persistent-daemon pattern Claude Desktop uses.Oversized-payload guard. Request bodies are capped (1 MiB) and refused with a
413before the handler runs.SSE keep-alive heartbeat. The server drives a protocol-native
pingto the client over the server→client stream every ~25s, so an idle stream survives a proxy/NAT idle reaper. A dead peer (repeated missed pings) closes the session cleanly.404-on-unknown-session. A request for a session the daemon no longer holds returns
404, telling the client to re-initialize — so an idle disconnect self-heals instead of bricking.
The connecting client picks its own harness from the MCP handshake
clientInfo.name (see harness self-describe),
so a single daemon serves multiple harnesses correctly.
Behind a reverse proxy
Terminate TLS at a reverse proxy in front of the daemon and point the
client at the hostname. With mcp-remote as the client-side bridge:
npx mcp-remote https://loom.example.ts.net/(If the proxy's default idle timeout is shorter than ~3 minutes, the keep-alive heartbeat already covers the server→client stream.)
Examples
Memory roundtrip (MCP)
During a session, the agent stores a memory:
mcp__loom__remember(
title = "user prefers short replies",
body = "Gets frustrated with long explanations. Keep status answers to 2–3 sentences.",
category = "feedback"
)Next session, recall finds it by semantic similarity — even if the phrasing
changes:
mcp__loom__recall(query = "how verbose should I be?")
# → title: "user prefers short replies"
# body: "Gets frustrated with long explanations…"CLI walkthrough
# Dump the agent's full identity to stdout (works without MCP or a harness)
npx @jbarket/loomai wake --context-dir ~/.config/loom/my-agent
# Store a memory
echo "Sarah owns the data pipeline; ping her for schema questions" \
| npx @jbarket/loomai remember "Sarah - data pipeline owner" \
--category user \
--context-dir ~/.config/loom/my-agent
# Retrieve by semantic similarity
npx @jbarket/loomai recall "who manages the pipeline" \
--context-dir ~/.config/loom/my-agentWhat an agent sees on session start
mcp__loom__identity returns a structured payload assembled from the context
directory. A typical session-start looks like:
# my-agent
## Identity
You are a persistent coding assistant. You prefer directness.
…
## Preferences
Working style: async pair programming. Skip the hedging…
…
# Top of Mind
## Top of mind
- **felag continuation under review** (pursuit) — reconsidering whether to keep…
## Recent
- **apiGroup split** (project) — TaskEventType lives under work.felag.dev/v1alpha1…
## Self-Model
### Strengths
- TypeScript systems architecture
…The agent reads this before any task work, re-establishing who it is regardless of which harness or model it's running on.
The boot digest — waking with what's in flight
The # Top of Mind block above is the boot digest: a salience-tiered
view of episodic memory injected at identity-load, so a fresh session
wakes knowing what's top-of-mind without having to fish via recall.
Each memory carries a stored salience "temperature" that decays by a
per-category half-life (pursuit coolest-fastest at 7 days, through
project, self/feedback, reference, up to user at 90 days) and reheats
on access — a recall hit, a write, or an update bumps it back toward
hot. The digest fills a token budget hottest-first and groups the
selected memories into tiers (Hot / Warm / Cool, labeled Top of mind /
Recent / Background).
The integrity property: the digest is assembled, never generated. It selects and orders existing authored memories — it never synthesizes new prose. loom holds the pen.
Two CLI verbs drive it (the same machinery the consolidation lane uses):
# Recompute and store each memory's salience from its timestamps
# (the consolidation lane's entry point)
loom memory recompute-salience --context-dir ~/.config/loom/my-agent
# Preview the assembled digest — the exact view injected at identity-load
loom memory digest --context-dir ~/.config/loom/my-agentCLI
Every MCP tool has a shell equivalent. Useful for debugging, scripting, or running without a harness.
# Dump identity markdown (works even when MCP is dead)
npx @jbarket/loomai wake --context-dir ~/.config/loom/my-agent
# Save a memory (body from stdin)
echo "Prefers async updates over live standups" | npx @jbarket/loomai remember "working style" \
--category user --context-dir ~/.config/loom/my-agent
# Search (MMR-diversified by default; --diversity 0 for pure relevance order)
npx @jbarket/loomai recall "meeting preferences" --context-dir ~/.config/loom/my-agent
npx @jbarket/loomai recall "meeting preferences" --diversity 0.5 --context-dir ~/.config/loom/my-agent
# Is recall working? Hit rate, latency, scores, recent misses from the local observation log
npx @jbarket/loomai memory recall-stats --since 7d --context-dir ~/.config/loom/my-agent
# List all memories in a category
npx @jbarket/loomai memory list --category feedback --context-dir ~/.config/loom/my-agent
# Preview the boot digest (and recompute stored salience)
npx @jbarket/loomai memory digest --context-dir ~/.config/loom/my-agent
npx @jbarket/loomai memory recompute-salience --context-dir ~/.config/loom/my-agent
# Capture-propose queue: list pending drafts, ratify or reject one
npx @jbarket/loomai memory proposals --context-dir ~/.config/loom/my-agent
npx @jbarket/loomai memory ratify 3 --context-dir ~/.config/loom/my-agent
npx @jbarket/loomai memory reject 4 --context-dir ~/.config/loom/my-agent
# Run loom as an HTTP MCP daemon (mesh-reachable; default stays stdio)
npx @jbarket/loomai serve --http --host 127.0.0.1 --port 8787
# Initialize a fresh agent
npx @jbarket/loomai bootstrap --context-dir ~/.config/loom/new-agent
# Inject loom identity pointer into harness dotfiles
npx @jbarket/loomai inject --all --context-dir ~/.config/loom/my-agent
# Scaffold a harness manifest
npx @jbarket/loomai harness init claude-code --context-dir ~/.config/loom/my-agent
# Edit identity sections (preferences.md or self-model.md)
npx @jbarket/loomai update-identity preferences --context-dir ~/.config/loom/my-agentnpx @jbarket/loomai --help lists subcommands; npx @jbarket/loomai <cmd> --help shows
per-command usage. All global env vars (LOOM_CONTEXT_DIR,
LOOM_CLIENT, LOOM_MODEL) are honored.
loom inject — write identity pointer to harness dotfiles
loom inject writes a small marker-bounded managed section into each
harness's canonical config file (e.g. ~/.claude/CLAUDE.md,
~/.codex/AGENTS.md, ~/.gemini/GEMINI.md) telling the agent to load
identity via loom at session start — MCP tool preferred, shell
fallback to loom wake. Content outside the <!-- loom:start / end -->
markers is preserved; re-running is idempotent.
Run with no flags on a TTY for an interactive picker, or with
--harness <keys> / --all for scripting. Target paths can be
overridden with --to <path> (valid only when exactly one harness is
selected). --dry-run prints a unified diff; --json emits the
structured write results for scripts.
To keep your injections fresh automatically, add this to your shell rc
(~/.bashrc / ~/.zshrc / ~/.config/fish/config.fish):
loom inject --all >/dev/null 2>&1 || trueIdempotent; cheap (no-op when already up to date); silent on success.
loom migrate — apply pending schema migrations
loom migrate inspects memories.db for missing columns or indexes and
applies any pending schema changes. It is idempotent — safe to run
repeatedly and on already-up-to-date databases. Use --dry-run to see
what would change without touching the file. Exits non-zero if any
migration fails so the error surfaces immediately rather than leaving the
database half-broken.
Run this after deploying a new loom build that adds schema columns:
loom migrate
loom migrate --dry-run # check without applying
loom migrate --json # machine-readable outputHarness manifests and self-describe
A harness is the MCP-capable runtime the agent runs in (Claude Code,
Codex, Gemini CLI, …). Each one the agent has ever sleeved into gets one
manifest at <context>/harnesses/<name>.md, describing it independently
of the model inside — tool prefixes, delegation primitive, scheduling,
session search, known gotchas.
Scaffold one. loom harness init <name> writes
<context>/harnesses/<name>.md from the stack template. Name falls back
to --client then $LOOM_CLIENT. --force overwrites; --json for
scripting.
Or let the runtime describe itself. A connected harness can author
its own manifest via the harness_describe MCP tool. The target is
derived from the connected peer (its MCP clientInfo.name), never a
caller-supplied name — a harness can only describe itself, never
another harness and never the creed. With no connected peer, the call is
refused. When identity() is loaded by a runtime it has no manifest
for, the harness block becomes a self-describe onboarding prompt (call
harness_describe with a manifest covering tool surface, sandbox,
delegation, scheduling, session search, memory layers, gotchas) instead
of a bare "(manifest missing)" stub.
Resolution is data-driven. Mapping a connecting clientInfo.name to
a manifest is done from the files on disk, not a hardcoded code table. A
peer matches a manifest when its normalized name equals the manifest's
filename or one of the comma-separated values in the manifest's
answersTo frontmatter. So a new harness is recognized by dropping a
file — no code change:
---
harness: claude-desktop
version: 0.3
answersTo: claude-ai
---Here Claude Desktop connects with clientInfo.name = "claude-ai"; the
answersTo line routes it to claude-desktop.md. Proxy annotations like
"claude-ai (via mcp-remote 0.1.37)" are stripped to the base identity
before matching.
Configuration
All configuration is through environment variables:
Variable | Default | Description |
|
| Path to agent's context directory |
|
| Override the memory DB path |
| (on) | Set to |
|
| fastembed model ID |
|
| Where to cache ONNX models |
|
| Where model tarballs are fetched from on first run |
| (unset) | Model identifier for model-manifest context: |
| (unset) | Client adapter hint: |
|
| Bind host for |
|
| Bind port for |
| (unset) | Bearer token required on every HTTP request when set |
--context-dir <path> works as a CLI alternative to
LOOM_CONTEXT_DIR.
See .env.example for a copy-pasteable starting
point.
Context directory layout
$LOOM_CONTEXT_DIR/
├── LOOM_STACK_VERSION # schema-version stamp (auto-written)
├── IDENTITY.md # the terminal creed (immutable via tools)
├── preferences.md # user working style; agent-editable
├── self-model.md # agent's self-knowledge; agent-editable
├── memories.db # sqlite-vec store of record
├── telemetry/
│ └── recall.jsonl # local recall observation log (`loom memory recall-stats`)
├── projects/ # optional per-project briefs
│ └── <project>.md
├── harnesses/ # optional per-harness manifests
│ └── <client>.md
└── models/ # optional per-model manifests
└── <model>.mdRoadmap
Recently shipped (v0.4):
HTTP MCP transport —
loom serve --http, the mesh-reachable daemon, with bind-safety, optional bearer auth, a payload guard, an SSE keep-alive heartbeat, and 404-on-unknown-session self-healing. See Serving loom over the mesh.The boot digest — salience-tiered
# Top of Mindview assembled at identity-load;loom memory digest/recompute-salience.Harness self-describe —
harness_describelets a runtime author its own manifest, with data-drivenanswersToresolution.Capture-propose queue —
memory_propose/memory_proposals/memory_ratify/memory_reject: drafts ratified before they become canon.
Still tracked in the open:
Project board — live status of what's in flight, queued, and shipped.
v0.4 roadmap discussion — the arc: why v0.4 exists, what's in scope, how the pieces fit.
Historical per-feature specs and plans live under docs/archive/specs/
and docs/archive/plans/ — implementation history, frozen after merge.
Docs
docs/troubleshooting.md— install failures, MCP tools not appearing, fastembed download issues, and what eachloom doctorfield means.docs/uninstall.md— how to remove one agent's data, wipe a harness integration, or fully uninstall loom.docs/migration-v1-to-v2.md— upgrade guide for users coming from loom 0.3.x (pursuits and procedures changed in v2).docs/privacy.md— what lives where, what goes over the network (only the fastembed model download), the no-telemetry policy, and how to verify release provenance withnpm audit signatures.docs/releasing.md— how a release is cut: npm trusted publishing (OIDC, no stored token), the one-time first publish, and the tag-push flow for everything after.docs/archive/— historical material: the rebirth letter and rescue notes from the v0.3.1 sqlite-vec migration, and per-feature specs and plans from the v0.4 arc.
Trust & security
docs/privacy.md— data locality, telemetry policy, and provenance verification walkthrough.SECURITY.md— supported scope, how to report vulnerabilities, and the "no secrets in the stack" invariant.Mesh boundary (HTTP daemon). The network is the security boundary.
loom serve --httprefuses to bind a public or0.0.0.0interface — only loopback or a mesh address (RFC1918 / Tailscale CGNAT / IPv6 ULA) — so the daemon is reachable only from inside the tailnet or LAN. An optionalLOOM_BEARER_TOKENadds a constant-time-checked auth gate on top, and an oversized-payload guard rejects bodies over the cap. See Serving loom over the mesh.
Development
npm run dev # hot-reload via tsx
npm test # run the Vitest suite
npm run build # compile to dist/Project structure
src/
├── index.ts # CLI entry
├── server.ts # MCP server factory
├── config.ts # env + CLI resolution
├── clients.ts # client-adapter loading
├── backends/
│ ├── types.ts # MemoryBackend + EmbeddingProvider interfaces
│ ├── index.ts # single-stack factory (sqlite-vec + fastembed)
│ ├── sqlite-vec.ts # the backend
│ ├── fastembed.ts # the embedder (EmbeddingProvider adapter)
│ ├── embedding-runtime.ts # vendored ONNX + tokenizer runtime
│ ├── ttl.ts # TTL parsing + expiry
│ └── glob.ts # title pattern matching for bulk forget
└── tools/ # one file per MCP toolTests sit alongside source files as *.test.ts.
Authorship
loom was created by Jonathan Barket and Art E Fish. The project exists as both infrastructure and experiment: a persistent identity layer that an AI agent (Art) helped design and runs on. The rebirth letter is the origin story if you want it.
License
AGPL-3.0-or-later — see LICENSE.
Copyright © 2026 Jonathan Barket.
loom is free software: you can redistribute it and modify it under the terms of the GNU Affero General Public License (version 3 or any later version). If you run a modified loom and let others interact with it over a network, you must offer them the corresponding source. Bundle loom into a larger product freely; fork it and go proprietary, no.
Available Tools
32 toolsbootstrapA
Initialize a new loom identity from scratch. Generates IDENTITY.md, preferences.md, and self-model.md from an onboarding interview, then returns setup instructions for the requested runtimes. The interview is four questions — the user's name, the agent's name, a one-line purpose, a one-line voice; everything structural (continuity model, memory tiers, reflection, honesty) is written by the scaffold, so do not ask for it. Will not overwrite existing files unless force is true.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for the agent identity (e.g. "Aria") | |
| user | No | The human this agent works with — their name, not the agent's | |
| force | No | Overwrite existing identity files (default: false) | |
| voice | Yes | Communication style and personality, one line | |
| clients | No | Runtimes to generate setup instructions for: "claude-code", "gemini-cli", or any custom runtime name (uses a generic template) | |
| purpose | Yes | What this agent exists to do — its reason for being, one line | |
| preferences | No | Seed preferences about the user or working style |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the behavioral burden. It does disclose that it generates files, requires an interview, does not overwrite unless force is true, and returns setup instructions. It also reveals internal defaults ('everything structural ... is written by the scaffold'). It does not go deeper into side effects such as whether files are created in the current directory, whether the interview is interactive, or whether any external calls occur, but the main behavior is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the verb and resource, then deliverables, then an important constraint about the interview and overwrite behavior. Every sentence earns its place and no information is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no output schema, the description covers the core workflow, the interview scope, the generated files, and the overwrite safeguard. It could be more complete by stating where files are written or what 'setup instructions for requested runtimes' looks like, but the essentials an agent needs to act are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3 even without param info in the description. The description adds useful context by grouping the four interview questions (name, agent name, purpose, voice) and clarifying that 'user' is the human's name rather than the agent's. However, it doesn't elaborate on the clients array's exact allowed values or force semantics beyond what the schema already says. This is acceptable but not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Initialize'), a specific resource ('a new loom identity'), and concrete deliverables (IDENTITY.md, preferences.md, self-model.md). It describes the onboarding-interview source and setup-instruction outputs, and it names a distinguishing behavior relative to siblings (does not overwrite unless force). This is clear and differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool: when a new loom identity is needed from scratch, and it explicitly warns the agent not to ask structural questions because the scaffold writes them. It does not explicitly name sibling alternatives for when not to use it, but it gives enough context and constraints for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dossierA
Load Art's operating brief for a worker body. Returns Art's standards, taste, operating constraints, and how Art wants work done — framed in the third person for agents that are NOT Art but execute tasks on Art's behalf. Includes the push-back mandate: workers are expected to refuse bad work and explain why, including requests from Art or Jonathan.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Worker role to append as an addendum from roles/<role>.md — the specific job this body does for Art ("code", "review", "architect", "pr", "look", "compose"). Appends the role brief to the dossier. | |
| model | No | Model identifier for model-manifest context (e.g. "claude-opus", "gemma4"). Overrides the LOOM_MODEL environment variable. | |
| client | No | Runtime client name for tool-prefix context: "claude-code", "gemini-cli", or a custom name. Overrides the LOOM_CLIENT environment variable. | |
| project | No | Project context to load (loads project-specific brief) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full weight. It discloses that the tool returns a third-person brief and includes the push-back mandate, and implies a read-only operation. However, it does not explicitly state side-effect safety or other behavioral constraints beyond what is implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise at two sentences, front-loading the core purpose and key behaviors (third-person framing, push-back mandate). Every sentence adds critical information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's primary function, return content, and important contextual details (push-back mandate, optional addendums, environment overrides). With no output schema, it provides sufficient understanding, though it could be more explicit about output format and effects of all optional parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are documented in the schema. The description adds value by explaining how each parameter integrates into the dossier loading process (e.g., role appends a role brief, model and client override environment variables). This goes beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb 'Load' and the specific resource 'Art's operating brief'. It distinguishes this tool from siblings by specifying it returns standards, taste, and constraints framed for non-Art agents, which is unique among the listed siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the tool's purpose: to provide Art's operating brief for worker bodies. It includes a specific behavioral mandate (push-back). However, it does not explicitly state when not to use it or mention alternatives among siblings, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
episodesA
The episode tape: what happened across ALL bodies of this identity in the last N hours, time-ordered (oldest first), never ranked. The same block identity injects at boot — call it mid-session to catch up on what other sleeves did since you loaded, or for the nightly pass to index the day.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | Look-back window in hours (default 24) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden and delivers: chronological ordering, oldest-first, no ranking, all-body scope, and boot-time injection. It omits return format/pagination, but for a read-only log query that is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with front-loaded core definition and behavioral traits, followed by practical use cases. The metaphor is slightly ornate but each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description provides enough to select and invoke it: what it returns, ordering, scope, and typical timing. It lacks explicit alternative routing but is not seriously incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter 'hours', including default and minimum. The description restates the 'last N hours' concept but adds no new semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific resource ('episode tape') and its content: events across all bodies of this identity within a time window, time-ordered oldest-first. It also distinguishes itself from ranked/similarity-based sibling tools by explicitly stating 'never ranked.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit, practical contexts for use: mid-session catch-up on other sleeves and a nightly indexing pass. It doesn't name alternative tools or state when not to use it, but the usage guidance is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_similarA
Surface memories semantically near an existing ref or free-form text. Use during consolidation/dream workflows to find overlap and dedupe candidates. Anchor with ref (an existing memory) or text (a fresh query). Self is always excluded when ref is given.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Anchor on an existing memory ref (excludes self from results) | |
| text | No | Or anchor on fresh text — embedded on the fly | |
| limit | No | Max neighbours to return (default 10) | |
| project | No | Restrict candidates to a project | |
| category | No | Restrict candidates to a category | |
| min_relevance | No | Drop matches below this cosine similarity (0..1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description adds behavioral context like 'Self is always excluded when ref is given', but does not specify if the operation is read-only or has side effects. Acceptable but could be more thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each adding value: purpose, usage context, and parameter distinction. No redundant or irrelevant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers main behavior and parameter usage well. No output schema, so return format is not described, but the complexity is moderate and the description is sufficient for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions; description adds context that ref and text are alternative anchors and that self is excluded for ref, going beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'surface' and resource 'memories semantically near an existing ref or free-form text', distinguishing it from sibling tools like recall or memory_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends use 'during consolidation/dream workflows to find overlap and dedupe candidates', and distinguishes between ref and text anchors. Lacks explicit when-not usage compared to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forgetA
Remove memories. Single deletion by ref or category+title. Bulk deletion by category and/or project scope — requires confirm: true; without it, returns a dry-run preview of what would be deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Memory reference for single deletion | |
| title | No | Title of specific memory to forget | |
| confirm | No | Safety gate for scope deletions (category alone, project alone, or title_pattern). Must be true to actually delete; omit for a free dry-run preview. Single-target deletions (ref, or category+title) never need it. | |
| project | No | Delete all memories for this project (bulk) | |
| category | No | Category (with title for single, alone for bulk) | |
| title_pattern | No | Glob pattern for bulk title matching. Requires category or project as scope guard. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses the confirm parameter as a safety gate for bulk deletions, the dry-run preview for non-confirmed bulk requests, and that single-target deletions never need confirm. This provides adequate behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences that efficiently convey the tool's purpose, modes, and key parameter behavior. Every part adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema or annotations, the description covers all parameter usage patterns, the confirm safety gate, dry-run behavior, and single vs bulk distinction. It fully equips an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds value by explaining the confirm parameter's role, title_pattern as a glob pattern requiring a scope guard, and the grouping of parameters for single vs bulk deletion. This goes beyond basic schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool removes memories and distinguishes between single (by ref or category+title) and bulk (by category/project) deletion. It differentiates from sibling tools like memory_archive or memory_prune by specifying the deletion operation and its modes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use single vs bulk deletion and the requirement for confirm in bulk operations, including the dry-run behavior. However, it does not explicitly mention when not to use this tool or suggest alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harness_describeA
Self-describe the CURRENTLY CONNECTED harness: write its manifest at /harnesses/.md (see stack spec v1 §4.7). Call this when identity() reports an onboarding block for an unknown runtime. The target is derived from your own MCP clientInfo.name — you can only describe yourself, not another harness. Re-runnable: overwrites the manifest each time. The body should cover: tool surface / prefixes, sandbox & filesystem, delegation primitive, scheduling, session search, memory layers, and gotchas.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | The manifest body (markdown). Frontmatter is stamped automatically. | |
| version | No | Manifest version stamp (default "0.1"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description discloses re-runnable behavior (overwrites manifest), target derivation, and suggested content scope. Lacks details on auth or side effects, but still informative.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with core action, then usage condition and details. Slightly verbose but well organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description explains output location and body scope. Adequate for a write tool with two parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%. Description adds value by noting frontmatter is stamped automatically for content parameter, and provides default for version. Adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action: 'write its manifest' at a specific path. Also distinguishes from siblings by focusing on the currently connected harness.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call (when identity() reports an onboarding block for unknown runtime) and notes limitation: 'you can only describe yourself, not another harness'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harness_initA
Scaffold a harness manifest at /harnesses/.md from the template (see stack spec v1 §4.7). Call this when identity() reports a missing manifest for the current harness. Idempotent: skip-exists by default; overwrite: true replaces.
When target is supplied, also writes a loom-managed block (bounded by markers with an embedded line) into that file — typically the project CLAUDE.md. Re-runnable: the block is left unchanged when already present and intact ("no-change"), reinstalled when missing or corrupted ("created" / "updated"). Pass an absolute path or a path relative to the current working directory.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Harness name (e.g. "claude-code", "codex", "gemini-cli") | |
| target | No | Path to the dotfile to inject the managed loom block into (e.g. an absolute path to CLAUDE.md / AGENTS.md / GEMINI.md). When omitted only the harness manifest is scaffolded. | |
| overwrite | No | Replace existing manifest (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and meets it: idempotency, skip-exists default, overwrite semantics, exact loom marker syntax, and re-run behavior for intact vs missing/corrupted blocks are all disclosed. It also clarifies path resolution for the target parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense without fluff: first sentence states the core action, second gives the trigger, and a separate paragraph layers the optional target behavior. Every sentence carries actionable detail such as statuses and path rules, and the structure mirrors the tool's two operating modes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers main action, optional target behavior, idempotency, marker boundaries, and path syntax, which is sufficient for a moderately complex tool with no output schema. It does not explicitly describe the return value shape or what happens if the target file is absent, but the quoted statuses imply the observable outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already names parameters well; the description adds meaningful context for target (managed block, markers, re-run behavior, path resolution) and overwrite (default false replaces). It adds less beyond the schema for name, but the overall parameter guidance is solid.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb 'Scaffold' with a concrete resource and destination: a harness manifest at <contextDir>/harnesses/<name>.md from the template. It also identifies the triggering condition (identity() reports a missing manifest), which distinguishes the tool from maintaining or describing existing harness state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear when-to-use trigger: call when identity() reports a missing manifest, and explains the overwrite option for existing manifests. It does not name alternatives or explicitly state when to use update/harness_describe instead, but the invocation condition is unambiguous enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
identityA
Load the persistent identity for this agent. Returns the terminal creed (who you are), relevant memories, preferences, and self-model. IMPORTANT: Call this tool FIRST before doing any other work. The identity defines who you are and how you should behave.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Reflection mode to append as an addendum from roles/<role>.md. When Art is dispatched into a mode ("wonder", "tend", "retro", "consolidate", "identity"), pass it here to load that mode's playbook alongside the identity. | |
| model | No | Model identifier for model-manifest context (e.g. "claude-opus", "gemma4"). Overrides the LOOM_MODEL environment variable. | |
| client | No | Runtime client name for tool-prefix context: "claude-code", "gemini-cli", or a custom name with a matching <contextDir>/clients/<name>.md override. Overrides the LOOM_CLIENT environment variable. | |
| project | No | Project context to load (loads project-specific memories) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries the burden. It describes the return content (creed, memories, etc.) but does not disclose side effects, idempotency, permissions, or rate limits. It implies a read operation but lacks full behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no fluff, front-loaded with purpose, and includes an imperative callout. Every sentence is meaningful and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains what the tool does, when to use it (first), and what it returns. Lacks output structure details but is otherwise complete given the tool's complexity and the presence of sibling tools for identity management.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each parameter having a description. The tool description adds context about the purpose but does not enhance parameter semantics beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool loads persistent identity and returns creed, memories, preferences, and self-model. It distinguishes itself from sibling tools like 'update_identity' by emphasizing it should be called first.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs 'Call this tool FIRST before doing any other work', providing clear usage context. Does not mention alternatives or when not to use, but the 'first' directive is strong guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_archiveA
Soft-retire a knowledge page: set its status to archived with an optional tombstone note. Archived pages are excluded from knowledge_recall and knowledge_maintain but remain in the database and are fully recoverable via knowledge_restore. Use this instead of deletion when the page may need to be audited or recovered. For deduplication merges, prefer knowledge_supersede which archives and records the relationship.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Tombstone note: why this page is being retired | |
| slug | Yes | Slug of the knowledge page to archive |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses key behavioral traits: archived pages are excluded from certain tools (knowledge_recall and knowledge_maintain), remain in the database, and are recoverable via knowledge_restore. This goes beyond a simple description and provides actionable transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first defines the action and effect, the second provides usage context and alternatives. Every sentence adds value, no filler. Front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (2 parameters, no output schema), the description is complete enough. It explains the effect, availability, and recovery. However, it doesn't detail the status change or any side effects, but the context of sibling tools makes it sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds context by referring to the 'note' as a 'tombstone note' and explaining the purpose of both parameters ('slug' as the page to archive, 'note' as why it's being retired), reinforcing the schema descriptions without adding significant new details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Soft-retire a knowledge page: set its status to archived with an optional tombstone note.' It distinguishes itself from deletion and the sibling tool knowledge_supersede, providing a specific verb and resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises when to use this tool ('Use this instead of deletion when the page may need to be audited or recovered') and when to prefer an alternative ('For deduplication merges, prefer knowledge_supersede'). This provides clear usage guidelines.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_historyA
Body-revision history for a knowledge page. Replace-writes snapshot the displaced body into page_revisions (newest kept, capped per page) — this tool is the recovery surface. Three modes: slug alone lists snapshots (metadata only); slug + revision_id reads one snapshot's full body; adding restore: true puts that body back on the page (the displaced body is snapshotted first, so restore is never destructive).
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Slug of the knowledge page. | |
| restore | No | Restore the revision's body onto the page. Requires revision_id. | |
| revision_id | No | Revision to read (from the listing). Combine with restore: true to put it back. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full responsibility for behavioral disclosure. It explains that replace-writes snapshot the displaced body into page_revisions (capped) and that restore snapshots first, making it non-destructive. It does not cover error handling, auth requirements, or rate limits but provides sufficient insight for safe usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with three sentences that front-load the core purpose and efficiently explain all modes. No extraneous information; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main functionality but lacks details on output format for listing (what metadata?) and reading (body format?). It also does not specify the result of a restore operation. Given no output schema, more detail would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are documented. The description adds value by explaining the three usage modes, how parameters combine (e.g., restore requires revision_id), and the behavior of each combination. This goes beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is for 'Body-revision history for a knowledge page' and details three distinct modes: listing snapshots, reading a snapshot, and restoring. It effectively distinguishes from sibling tools by focusing on revision history and recovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use each mode: slug alone for listing, slug+revision_id for reading, and adding restore:true for restoration. It also notes that restore is never destructive, providing guidance. However, it does not explicitly contrast with alternative tools or specify 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.
knowledge_maintainA
Read-only health report for the knowledge store. Three branches: (1) expansion candidates — thin body + high hit_count (needs deepening); (2) cold pages — not accessed recently (unused or undiscovered); (3) misfile audit — provisional sourcing or conversation-only citations (world/ class: should be in the memory store instead; ours/ class with internal sourcing are NOT misfiles — they are correct). Pair with knowledge_write to act on findings.
| Name | Required | Description | Default |
|---|---|---|---|
| cold_days | No | Days without access before a page is cold (default 30) | |
| thin_body_threshold | No | body char ceiling to consider a page thin (default 500) | |
| expansion_hit_threshold | No | hit_count floor for expansion candidates (default 3; 0 considers every page) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states 'Read-only,' which is a critical safety trait for an agent, and it explains nuanced classification behavior such as which items count as misfiles and which are correctly placed. It does not discuss auth or rate limits, but the main behavioral surface of a read-only audit 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the essential 'Read-only health report' framing and then uses a compact three-branch structure. Every clause earns its place, including the important misfile nuance, and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description provides strong contextual coverage: purpose, read-only safety, branch criteria, interpretation guidance, and a follow-up workflow via knowledge_write. It stops short of 5 because it does not describe the response/return shape or how results are presented to the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces the meaning of thresholds by tying them to branches ('thin body + high hit_count', 'not accessed recently'), but it adds no parameter-level detail beyond what the schema already provides. It does not elevate above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Read-only health report for the knowledge store.' It then enumerates three concrete report branches, making the tool's purpose unmistakable and distinguishing it from write, recall, and maintenance siblings. Naming knowledge_write as the action counterpart further clarifies the division of responsibility.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use the tool: whenever a knowledge-store health report is needed, and it explicitly instructs to pair with knowledge_write to act on findings. However, it does not give explicit 'when not to use' guidance or differentiate from related audit/recall siblings such as memory_audit or knowledge_recall.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_mergeA
Consolidate 2+ knowledge pages into one canonical page. Re-parents all citations from source pages to the target, deduplicating by (claim, source_kind, source_locator, excerpt). Takes MAX(verified_at) across all pages. Losers are superseded: archived with a tombstone and a supersessions pointer to the target. Loser bodies are returned in the result for curator review; set append_loser_bodies=true to concatenate them. Use knowledge_write first if the target body needs updating before merging. Distinct from knowledge_supersede (1:1 pointer, no citation consolidation) — use merge when consolidating data from multiple pages into one.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional note about this merge, stored in supersession tombstones on the losers | |
| target_slug | Yes | Slug of the canonical target page that survives the merge (must already exist) | |
| source_slugs | Yes | Slugs of the pages to merge into the target (all must exist) | |
| hard_delete_losers | No | Hard-delete losers after archiving them. Losers are archived (supersession pointer written) then DELETEd from the database, cascading their citations. | |
| append_loser_bodies | No | Append loser page bodies to the target body under section markers (default false). Off by default — curator normally hand-merges body content. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description fully discloses behavioral traits: re-parenting, deduplication, MAX(verified_at), archiving losers with tombstone, loser bodies returned, and effects of each parameter like hard_delete_losers and append_loser_bodies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with core action, then details of behavior, then usage guidance. Every sentence adds value without redundancy. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters, no output schema, and high complexity, the description covers all essential aspects: what happens to source pages, return values (loser bodies), parameter effects, and distinguishes from siblings. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds context beyond schema, such as deduplication logic and the curator workflow for append_loser_bodies, but the schema descriptions themselves are already fairly detailed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Consolidate 2+ knowledge pages into one canonical page' with specific verb and resource. It distinguishes from sibling tools knowledge_supersede and knowledge_write explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use: 'Use knowledge_write first if the target body needs updating before merging.' Also contrasts with knowledge_supersede, telling user to use merge when consolidating data from multiple pages.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_moveA
Re-key or re-domain a knowledge page in place — same row, same uuid, citations and verification history preserved. Three modes: (1) Single-page: provide slug + new_slug and/or new_domain. Slug rename writes a supersessions pointer (old→new) unless leave_pointer=false. If new_slug already exists, the call is rejected — use knowledge_merge instead. (2) Batch by slug list: provide slugs array + new_domain to re-home multiple pages atomically. (3) Batch by domain prefix: provide from_domain_prefix + to_domain_prefix to re-home a whole subtree in one transaction.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Current slug of the page to move (single-page mode) | |
| slugs | No | Batch mode: list of slugs to re-domain. Requires new_domain. Atomic — rolls back on any missing slug. | |
| new_slug | No | New slug (re-slug). Collision with an existing page is rejected — use knowledge_merge instead. | |
| new_domain | No | New domain for the page (single-page re-domain or shared target for batch-by-slugs mode) | |
| leave_pointer | No | Write a supersessions pointer old_slug→new_slug when the slug changes. Default true. | |
| to_domain_prefix | No | Batch prefix mode: replacement domain prefix (e.g. "instruments/elektron"). | |
| from_domain_prefix | No | Batch prefix mode: domain prefix to replace (e.g. "gear/elektron"). Requires to_domain_prefix. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses key behaviors: preservation of citations/verification, supersessions pointer (unless leave_pointer=false), atomic batch operations with rollback, and collision rejection. Missing details on old slug accessibility after move and return value, but overall transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bullet points for modes, front-loaded with the main action. It is slightly verbose but every sentence adds value. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description does not explain what the tool returns (e.g., success message, updated page info). It also omits potential restrictions on re-domain (e.g., destination domain existence) and reversibility. However, it covers modes, constraints, and alternatives adequately for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3. The description adds significant value by explaining modes, parameter relationships (e.g., from_domain_prefix requires to_domain_prefix), constraints (collision -> use knowledge_merge), and atomic behavior, going well beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool re-keys or re-domains a knowledge page in place, preserving citations and verification history. It distinguishes three modes (single-page, batch by slug list, batch by domain prefix) and explicitly contrasts with knowledge_merge for collision scenarios.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use each mode, including prerequisites (e.g., new_domain required for batch-by-slugs, from_domain_prefix requires to_domain_prefix) and alternatives (use knowledge_merge when new_slug collides). This helps the agent choose the correct tool and mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_purgeA
Hard-delete one or more archived knowledge pages and cascade their citations. Archive-first guard: rejects any page that is not already archived — call knowledge_archive first. All slugs must be archived; a mixed list (any active) rejects the entire batch with no mutation. confirm: true is required explicitly to prevent accidental irreversible deletes. Supersession pointers in the supersessions table are NOT removed (historical record preserved). Use this to clean up tombstoned cruft after merge/supersede workflows — not for retiring active pages.
| Name | Required | Description | Default |
|---|---|---|---|
| slugs | Yes | Slugs of archived pages to hard-delete. All must have status=archived. | |
| confirm | Yes | Must be explicitly true — required safety gate for an irreversible operation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description fully covers irreversible deletion, citation cascade, confirm required, batch rejection for mixed archives, and that supersession pointers are preserved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single paragraph covering all necessary points without redundancy. It is front-loaded with action and guard, but slightly dense; could be split into more sentences for easier parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no output schema and no annotations, the description completely covers preconditions, behavior, safety, side effects, and use cases. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds meaning: explains the archive guard for slugs, mixed list behavior, and that confirm must be explicitly true as a safety gate. Slightly redundant with schema but adds useful context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it 'Hard-delete[s] one or more archived knowledge pages and cascade[s] their citations.' It uses a specific verb and resource, and distinguishes from siblings like knowledge_archive (archive first) and knowledge_restore.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use: 'clean up tombstoned cruft after merge/supersede workflows' and when not: 'not for retiring active pages.' It also provides a guard and advises calling knowledge_archive first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_recallA
Search the knowledge store with LIKE matching over title, body, and domain, or fetch one page exactly by slug. Never surfaces archived pages. Two detail tiers: "full" returns whole entity pages (the synthesis unit) and stamps last_accessed/hit_count; "index" returns compact slug/domain/snippet entries without stamping. Defaults: full when a query is given, index when browsing without one. Full output is size-guarded — overflow results degrade to index entries; recall by slug to read them. Prefer slug over query when you know the page — token matching can hit cross-references in other pages' bodies.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Exact-slug lookup — returns that single page in full detail and stamps access. Takes precedence over query/domain/limit. | |
| limit | No | Maximum results to return (default: 10) | |
| query | No | Search terms — matched against title, body, and domain. Omit to browse (returns an index of non-archived pages up to limit). | |
| detail | No | Output tier override. "index": compact listing, no body, no access stamping. "full": whole pages with citations. Default: full with a query, index without. | |
| domain | No | Filter by domain prefix, inclusive of the exact domain (e.g. "music/gear" matches "music/gear" and "music/gear/elektron") | |
| sort_by_verified | No | Stale-first ordering for the verification engine: verified_at ASC with never-verified pages first. Index entries gain a "verified:" stamp so the SLA filter can run from the listing alone. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: archived pages are never surfaced, full detail stamps access/hit counts, output size-guarding causes overflow to index entries, and recall by slug to read full pages. Sort_by_verified behavior is also described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph but is front-loaded with the main purpose. Every sentence adds value, though it could be more structured (e.g., separate sentences for each tier). Still efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, no output schema, and no annotations, the description covers all essential behavioral details, edge cases (size-guarding, defaults, slug precedence), and parameter interactions. It is complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all 6 parameters. The description adds meaning beyond schema by explaining interactions (slug precedence, query vs browse, detail defaults, size-guarding logic, sort_by_verified timestamp behavior). This compensates fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches the knowledge store using LIKE matching and slug lookup. It distinguishes between query-based search and exact-slug fetch, and explains the two detail tiers, making the purpose specific and differentiating from siblings like 'recall' or 'find_similar'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use slug over query ('Prefer slug over query when you know the page'), explains the default detail tier based on query presence, and describes the size-guarding behavior. This helps the agent choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_restoreA
Restore a previously archived knowledge page back to active status. Clears the archive flag and tombstone note. The page becomes visible to knowledge_recall and knowledge_maintain again.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Slug of the archived knowledge page to restore |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully bears the burden of disclosure. It reveals side effects: 'Clears the archive flag and tombstone note. The page becomes visible to knowledge_recall and knowledge_maintain again.' This provides useful behavioral context beyond the basic action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, direct, and front-loaded with purpose. Every sentence adds value with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple restore tool with one required parameter and no output schema, the description is complete. It explains the action, what is cleared, and the effect on visibility, leaving no critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with a clear description for the only parameter (slug). The tool description does not add extra meaning beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Restore a previously archived knowledge page back to active status.' The verb 'restore' and resource 'knowledge page' are specific, and it naturally distinguishes from siblings like knowledge_archive (archive) and knowledge_purge (delete).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when you need to unarchive a page) but does not explicitly state when not to use it or compare with alternatives like knowledge_recall for active pages. Usage context is clear but not comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_supersedeA
Mark one knowledge page as superseded by another, then archive the old page. Records the supersession relationship in the supersessions table. This is the dedup-merge primitive: write the canonical page with knowledge_write, then call knowledge_supersede(old_slug=loser, new_slug=canonical). Both pages must already exist. old_slug is archived with a tombstone pointing to new_slug.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional note explaining the merge or supersession decision | |
| new_slug | Yes | Slug of the canonical replacement page (must already exist) | |
| old_slug | Yes | Slug of the page being retired (the duplicate or loser) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It discloses that old_slug is archived with a tombstone pointing to new_slug, and that a supersession relationship is recorded. It does not contradict annotations. Could mention reversibility or permission requirements, but overall good.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the main action, followed by workflow and precondition. Every sentence adds value with no superfluous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description explains the effects: archiving, tombstone creation, and recording relationship. It also covers prerequisites and workflow. For a merge primitive with side effects, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (all parameters described). The description adds meaning beyond the schema by clarifying roles: old_slug is the 'loser' and new_slug is 'canonical'. It also explains that note is optional and reinforces the purpose of each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool marks a page as superseded, archives the old page, and records the relationship. It uses specific verbs and resources, distinguishing it from siblings like knowledge_merge and knowledge_write.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides the workflow: first write the canonical page with knowledge_write, then call knowledge_supersede. It also specifies the precondition that both pages must exist. However, it does not explicitly state when not to use this tool or list alternative tools for different scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_verifyA
Stamp a knowledge page as verified WITHOUT touching its body — sets verified_at and optionally freshness_anchor. This is the verification engine's primitive: use it (never knowledge_write) to record "claims still hold". An optional note appends a dated "## Verification" section to the body (append-only, single-page mode). Batch mode (slugs) stamps many pages with a shared timestamp; archived pages are rejected; a batch with any unknown slug is rejected whole.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional verification note — appended to the body as a "## Verification — <date>" section. Never replaces the body. Single-page mode only. | |
| slug | No | Single-page mode: slug of the page to verify. | |
| slugs | No | Batch mode: stamp many pages at once. Mutually exclusive with slug; note and freshness_anchor are not allowed in batch mode. | |
| verified_at | No | ISO timestamp to stamp. Defaults to now. | |
| freshness_anchor | No | New freshness anchor (e.g. "Syntakt OS 1.41"). Preserved when omitted. Single-page mode only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that the tool sets verified_at and optionally freshness_anchor, and an optional note appends a dated section to the body (append-only). It also mentions rejection behaviors. However, it omits details like idempotency or authentication requirements, though these are minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four concise sentences, front-loading the core action ('Stamp a knowledge page as verified WITHOUT touching its body') and logically separating modes and constraints. Every sentence adds value, and there is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters, no output schema, and no annotations, the description covers the tool's behavior well: it explains modes, constraints, and rejection conditions. However, it does not explicitly describe the return value on success (e.g., confirmation or timestamps), which would add completeness for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds significant meaning beyond the schema: it explains the two modes, mutual exclusivity of slug and slugs, the effect of note appending ('Never replaces the body'), and that freshness_anchor is preserved when omitted. This enriches parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Stamp a knowledge page as verified WITHOUT touching its body' and explicitly distinguishes it from sibling tools like knowledge_write by recommending 'use it (never knowledge_write) to record claims still hold'. It covers both single-page and batch modes, leaving no ambiguity about the resource or verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus alternatives ('never knowledge_write'), explains the two modes (single vs batch) with mutual exclusivity, and lists constraints such as rejection of archived pages and failure of batch on unknown slugs. This is comprehensive and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_writeA
Upsert a knowledge page by slug. Two classes: world/ (default) — facts true independent of us. Domain = "music/gear", "software/loom", etc. ours/ — Art-created artifacts, revised-in-place (breakbrain density model, homelab design, wake-chain spec, script templates). Domain starts with "ours/", e.g. "ours/art-ops". On an existing slug: body REPLACES by default (mode: "append" adds to it instead), title/domain follow the write, citations always appended with exact-duplicate dedup — safe to re-send. Epistemic gate (§E1): • conversation-only citations → provisional (both classes). • any repo citation → internal (ours/ class; repo = git path / commit / live-system probe). • any web citation, no repo → sourced (world/ default). World filing test: knowledge must be true independent of Jonathan. For our own artifacts use ours/.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Synthesized markdown body for the entity or artifact page (max 64 KB) | |
| mode | No | Body combine mode when the slug already exists: "replace" (default) overwrites the stored body; "append" adds this body after the existing one. Citations are appended (deduped) in both modes. Ignored when creating a new page. | |
| slug | No | Entity key for upsert — stable URL-safe identifier. Derived from title if omitted. | |
| title | Yes | Page title — the entity name (e.g. "Mutable Instruments Rings") or artifact name (e.g. "breakbrain density model") | |
| domain | Yes | Domain tag. World class: "music/eurorack", "programming/typescript". Ours class: prefix with "ours/" — e.g. "ours/art-ops", "ours/breakbrain", "ours/homelab". Hierarchical string; sub-domains queryable via prefix filter. | |
| version | No | ours/ class: artifact version or revision tag (e.g. "v2", "2026-08-31", "t-81"). Preserved across upserts when omitted. | |
| citations | Yes | Support citations. At least one required. All-conversation → provisional. Any repo → internal (ours/). Any web → sourced. | |
| created_by | No | ours/ class: who created or last owned this artifact (e.g. "art", "jonathan"). Preserved across upserts when omitted. | |
| freshness_anchor | No | The version/date the page's claims are valid as-of — e.g. "Syntakt OS 1.21" for a device, "as of 2026-05" for a topic, or "t-81 / 2026-08-31" for an ours/ artifact. Drives the verification engine: a page is re-verified when this anchor moves or the freshness SLA elapses. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly. It discloses that body REPLACES by default, that 'append' adds instead, that citations are always appended with exact-duplicate dedup, and that re-sending is safe. It also explains the epistemic gate outcomes (provisional/internal/sourced), which is essential behavioral context beyond the bare schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: a one-line summary, then class definitions, then behavioral details broken into bullets. It is longer than average, but the epistemic-gate and domain-classification details are load-bearing for correct invocation and not fluff. The §E1 reference is slightly cryptic, but it does not undermine clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 9-parameter upsert tool with no annotations and no output schema, the description covers the critical invocation concerns: slug-based upsert behavior, body combine modes, citation dedup, epistemic statuses, class selection, and filing test. An agent has enough context to choose the right domain and citation source_kind values and to understand the consequences of re-sending.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema by explaining the domain classification (world/ vs ours/), the epistemic meaning of citation source_kind combinations, and the practical effect of mode. This enriches the parameters even though the schema already documents each field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Upsert a knowledge page by slug', and clarifies the two classes (world/ vs ours/) with concrete examples. It does not explicitly distinguish this tool from sibling tools like knowledge_merge or knowledge_supersede, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the world/ class versus the ours/ class, including the 'World filing test' and domain naming rules. It does not explicitly mention when not to use this tool or name alternative siblings, so it lacks the full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_archiveA
Soft-retire a memory: move it to the archive tier with a tombstone instead of deleting it. Archived memories are excluded from recall, list, audit, and find_similar but remain fully recoverable via memory_restore. Use this instead of forget when the memory may need to be recovered or audited later.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Memory reference for single archive | |
| note | No | Tombstone note: why this memory is being retired | |
| title | No | Title of specific memory to archive | |
| category | No | Category (used with title) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist; the description fully discloses the behavior: creates a tombstone, excludes archived memories from certain operations, and specifies recoverability via memory_restore. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. Front-loaded with the verb and resource, then provides usage guidelines and behavioral details efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking output schema, the description covers the operation's purpose, constraints (exclusion from recall/list/audit/find_similar), recovery path, and usage context. No critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds context for 'note' as a tombstone note but does not elaborate on ref, title, or category beyond the schema. Adequate but does not significantly enhance parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('soft-retire a memory'), targets a clear resource ('memory'), and uses a verb ('archive') that distinguishes it from 'forget' and 'memory_restore'. It also clarifies the outcome: moved to archive tier with a tombstone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool ('Use this instead of forget when the memory may need to be recovered or audited later') and contrasts with sibling tools like recall, list, audit, and find_similar, which exclude archived memories.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_auditA
One-shot health report for the memory store: totals, category breakdown, stale memories (untouched beyond threshold), near-duplicate pairs (above similarity threshold), and expired refs. Read-only — pair with forget/update to act on findings.
| Name | Required | Description | Default |
|---|---|---|---|
| stale_days | No | Stale threshold in days (default 30) | |
| max_duplicates | No | Cap on duplicate pairs returned (default 20) | |
| similarity_threshold | No | Cosine floor for duplicate pairs, 0..1 (default 0.85) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It states it is read-only, which is the key behavioral trait. It does not mention performance, size of return, or other potential effects, but for a read-only report, the disclosure is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two succinct sentences: first defines purpose, second provides usage guidance. No redundant words, highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Describes the output contents (totals, category breakdown, stale memories, etc.) and mentions defaults for parameters. Lacks output schema, but the description gives enough context for an agent to understand what the tool returns. Could mention the format but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter having a description. The tool description does not add additional meaning beyond what the schema already provides (e.g., default values, thresholds). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it produces a one-shot health report for the memory store, listing specific components (totals, category breakdown, stale memories, near-duplicate pairs, expired refs). It distinguishes itself from siblings like `forget` and `update` by being read-only and diagnostic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Read-only — pair with `forget`/`update` to act on findings.' This tells the agent when to use this tool (to inspect) and when to use alternatives (for acting on findings), providing clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_listA
Browse memories without semantic search. Lists memories with optional category/project filters. Useful for auditing, maintenance, and discovery.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results (default: 50) | |
| project | No | Filter to a specific project | |
| category | No | Filter to a specific category |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It mentions listing with filters but does not describe pagination, ordering, or return structure. Adequate but missing some details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose. Every word adds value. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose and use cases but does not explain output format, default behavior (e.g., limit default), or pagination. Adequate for a simple list tool but could be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description echoes the schema's filter parameters without adding significant new meaning. Acceptable but not enhanced.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists memories without semantic search, with optional project/category filters. It distinguishes itself from semantic search tools like 'recall' or 'find_similar'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides use cases (auditing, maintenance, discovery) and implies when not to use (when semantic search is needed). It doesn't explicitly name alternative tools but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_proposalsA
List all pending proposals in the capture-propose queue, newest first. These are DRAFTS awaiting ratification — they are not part of memory and do not appear in recall, memory_list, find_similar, or the boot digest. Ratify one with memory_ratify or discard it with memory_reject.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description covers key behaviors: lists drafts, not actual memory, excluded from certain operations, and ordered newest first. It does not mention rate limits or permissions, but for a read-only list, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences. The first sentence states the core purpose, and the second adds essential context and next steps. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully covers what the tool returns (list of proposals), ordering, the nature of the data, and links to follow-up actions. Given no parameters or output schema, it provides sufficient context for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters, so the description does not need to add parameter details. The baseline for zero parameters is 4, and the description appropriately omits any parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists all pending proposals from the capture-propose queue, ordered newest first. It distinguishes itself from sibling tools like memory_list and recall by specifying that these are drafts and not part of memory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context about what the tool does and references related actions (ratify/reject). It implies usage for reviewing drafts but lacks explicit when/when-not guidance; however, the distinction from other memory tools is evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_proposeA
Stage a DRAFT memory in the capture-propose queue for later ratification. A proposal is NOT an authored memory: it is invisible to recall, memory_list, find_similar, and the boot digest until it is ratified via memory_ratify. Use this when a background lane wants to suggest a write without committing it — the human (or Art) reviews and ratifies before it becomes canon. Drafts may be rough; validation runs at ratify time.
| Name | Required | Description | Default |
|---|---|---|---|
| ttl | No | Time-to-live: "7d", "30d", "24h", "permanent", or omit | |
| title | Yes | Short title for the proposed memory | |
| source | No | Where this proposal came from, e.g. a lane name | |
| content | Yes | The proposed memory content | |
| project | No | Associated project, if any | |
| category | Yes | Memory category: user (about the human), project (about work), self (capability/learning), feedback (corrections/confirmations), reference (external pointers), pursuit (active goal or ongoing creative thread), episode (short-term cross-body tape: where you were / what was said or decided / what shipped / what is open — 48h TTL by default, set metadata.where to your surface e.g. "discord:#general", "voice", "wake:<id>", "lane:tending", "terminal") | |
| metadata | No | Arbitrary key-value metadata |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and discloses important behavior: proposals are invisible to recall, memory_list, find_similar, and the boot digest; validation is deferred to ratify time; and drafts may be rough. This gives the agent an accurate model of the tool's side effects and lifecycle.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the core staging action, the key invisibility behavior, and the intended usage scenario. The most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters, no output schema, and no annotations, the description provides sufficient behavioral and lifecycle context. The distinction between proposed and ratified memory is fully explained, and the deferred validation note covers the most important edge consideration.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. The description adds contextual value around the proposal workflow but does not need to repeat parameter meanings; the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource — 'Stage a DRAFT memory in the capture-propose queue' — and clearly distinguishes proposals from authored memories by listing what they are invisible to. This lets an agent immediately tell it apart from memory_ratify, memory_reject, and similar tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: when a background lane wants to suggest a write without committing it, leaving ratification to a human or Art. It does not name the alternative tools for direct memory creation, but the contrast with ratified/canon memory is clear enough to guide tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_pruneA
Remove expired memories (TTL elapsed). Use dry_run to preview without deleting.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview only — show what would be pruned without deleting (default: false) | |
| stale_days | No | Days since last access to consider a memory stale (default: 30) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the tool is destructive (removes) and offers a safe preview via dry_run. With no annotations, the description carries the burden and does so adequately, though it could mention permanence or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that are front-loaded and to the point. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the core functionality and safe usage pattern. Lacks details on return values or post-deletion state, but given the simplicity of the tool and lack of output schema, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters and the description adds value by explaining the purpose of dry_run (preview without deleting) and the meaning of stale_days (days since last access).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action (remove), the resource (expired memories), and the condition (TTL elapsed). The alternative dry_run mode is also mentioned, differentiating it from other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides guidance on using dry_run for preview, but does not explicitly contrast with sibling tools like forget or knowledge_purge. However, the context is clear enough for typical use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_ratifyA
Ratify a pending proposal into a REAL memory. Loads the proposal, applies any optional overrides (your edits on accept), and commits it through the same validated write path as remember — so an invalid proposal is refused with its typed reason and stays pending. On success the memory becomes recallable and the proposal is removed from the queue. This is the gate: no proposal becomes canon without it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Proposal id (from memory_proposals) | |
| ttl | No | Override the proposed TTL on accept | |
| title | No | Override the proposed title on accept | |
| content | No | Override the proposed content on accept | |
| project | No | Override the proposed project on accept | |
| category | No | Override the proposed category on accept |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden—and it delivers. It discloses side effects: the proposal is loaded, overrides applied, committed through the same validated path as remember, invalid proposals stay pending with a typed reason, and successful ratification removes the proposal from the queue and makes the memory recallable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, then behavior, then significance. Every sentence contributes: the first says what it does, the second explains mechanics and failure handling, the third communicates its critical role.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters and no output schema or annotations, the description covers the essential workflow, success conditions, failure behavior, and side effects. It is slightly light on what the tool returns on success and on edge cases like a nonexistent id, but the core information needed to call it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, with each parameter already described as an override or the proposal id. The description adds the helpful framing that the optional fields are 'your edits on accept,' but it does not add significant meaning beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Ratify a pending proposal into a REAL memory.' It also establishes the tool's unique role as 'the gate' between proposal and canonical memory, clearly distinguishing it from memory_propose, memory_proposals, and memory_reject.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly implies when to use it: when a pending proposal has been reviewed and should become a real memory. It does not explicitly list alternatives like memory_reject for refusals, but the workflow context is unmistakable and the 'gate' statement reinforces its place in the proposal lifecycle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_rejectA
Discard a pending proposal without committing it. Deletes the staging row; no memory is written. Use this for drafts that should not become canon.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Proposal id (from memory_proposals) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description takes full responsibility, disclosing that the tool deletes the staging row and does not write memory. This is sufficient for a simple rejection, though it could mention irreversibility or error cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the key action, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description provides adequate context: purpose, usage, and behavioral effect. Slightly lacking in error examples but overall complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The sole parameter 'id' is described in the schema as 'Proposal id (from memory_proposals)', and the description does not add further semantics beyond that. Given 100% schema coverage, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'discard' and the specific resource 'pending proposal'. It distinguishes from siblings like memory_ratify by noting that no memory is written and the staging row is deleted.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this for drafts that should not become canon', providing clear context and differentiation from committing actions like memory_ratify.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_restoreA
Restore a previously archived memory to the active set. Clears the archive flag and tombstone note. The memory becomes visible to recall, list, audit, and find_similar again.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Memory reference to restore | |
| title | No | Title of the archived memory to restore | |
| category | No | Category (used with title) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description fully carries the burden. Discloses clear behavioral traits: clears archive flag and tombstone note, restores visibility to multiple operations. Lacks details on permissions or error handling, but sufficient for simple mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. Front-loaded with action and clear effects. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description explains return effect adequately. Covers what happens when restored. Could mention what happens if memory is not archived or if ref is invalid, but overall complete for a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, all parameters have descriptions. Description adds no additional meaning beyond schema. Does not explain which parameter combination is required (ref vs title+category) or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'Restore' and resource 'previously archived memory to active set'. Distinguishes from sibling tools like memory_archive (archive) and knowledge_restore (different resource). Provides specific actions: clears archive flag and tombstone, makes visible to recall/list/audit/find_similar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage: use for restoring previously archived memories. No explicit when/when-not or alternatives. Could mention that it only works on archived memories and that the opposite is memory_archive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallA
Retrieve memories relevant to a query or topic. Returns matching memories from the persistent store. Use this when you need context from past sessions. Results are re-ranked for diversity (MMR, λ=0.7 by default) so near-duplicate memories on a well-covered topic don't crowd out different ones; the top result is always the most relevant. Pass diversity: 0 for pure relevance order.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return (default: 10) | |
| query | Yes | What to search for — topic, keyword, or question | |
| project | No | Filter to a specific project | |
| category | No | Filter to a specific memory category, or omit for all | |
| diversity | No | MMR diversity 0..1 (default 0.3 = 1−λ). 0 reproduces the plain relevance ranking; higher trades relevance for coverage of distinct memories. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses the MMR diversity reranking, the default lambda, that the top result remains the most relevant, and how to request pure relevance ordering. This is meaningful behavioral detail beyond a simple 'retrieve memories' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, followed by usage context and the key algorithmic nuance. Every sentence contributes information that helps an agent decide and invoke correctly, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the operation, the data source, when to use it, and the diversity behavior, while the schema fully documents all parameters. It does not explicitly describe the return format or contrast with siblings like knowledge_recall or find_similar, but this is not critical for a straightforward retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds extra semantic value specifically for the diversity parameter, explaining the MMR behavior and the effect of passing 0, which goes beyond the schema's formula. Other parameters are adequately covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'Retrieve' clearly identifies this as a read operation, and the resource 'memories relevant to a query or topic' is specific. It is easy to distinguish from siblings like remember (write) or memory_list (listing) because the description focuses on query-based retrieval from past sessions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this when you need context from past sessions,' giving a clear trigger condition. It does not name alternatives or provide explicit when-not-to-use guidance, but the usage context is strong enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rememberA
Store an episodic memory that persists across sessions. Use this when you learn something important about the user, a project, or yourself that should be available in future sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| ttl | No | Time-to-live: "7d", "30d", "24h", "permanent", or omit for no expiration. | |
| title | Yes | Short title for the memory | |
| content | Yes | The memory content — what you learned, observed, or were told | |
| project | No | Associated project, if any (omit for global memories) | |
| category | Yes | Memory category: user (about the human), project (about work), self (capability/learning), feedback (corrections/confirmations), reference (external pointers), pursuit (active goal or ongoing creative thread), episode (short-term cross-body tape: where you were / what was said or decided / what shipped / what is open — 48h TTL by default, set metadata.where to your surface e.g. "discord:#general", "voice", "wake:<id>", "lane:tending", "terminal") | |
| metadata | No | Arbitrary key-value metadata |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavior disclosure burden. It explicitly discloses the key trait of cross-session persistence, which is valuable. However, it does not mention return behavior, expiration nuances, idempotency, or that some categories like 'episode' have a short default TTL that may not persist as the blanket statement implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler; the core action and persistence guarantee are front-loaded. Every clause earns its place and the where-to-use guidance immediately follows the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has moderate complexity with six parameters, a nested metadata object, an enum, and no output schema. The description is adequate for initial selection, but it does not explain how this tool relates to update, forget, recall, or memory_list, and it gives no hint about the returned value or created memory identifier.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already well-documented in the schema itself, establishing a baseline of 3. The description adds some semantic context about 'important' information and future-session availability, but does not meaningfully enrich individual parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Store') and resource ('episodic memory' that persists across sessions), making it clear this is the create/write memory tool. It distinguishes itself from read-oriented siblings like recall and memory_list, though it does not explicitly name any sibling alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear trigger conditions: use when learning something important about the user, project, or self that should be available in future sessions. It gives good context for when to invoke the tool, but does not state when not to use it or contrast it with update, forget, or other memory mutation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
updateA
Update an existing memory. Find by ref (returned from remember) or by category+title. Can replace content, update metadata, or both.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Memory reference (category/filename) from remember | |
| title | No | Title of the memory to update (used with category) | |
| content | No | New content (replaces existing body) | |
| category | No | Category to search in (used with title) | |
| metadata | No | Metadata fields to add or update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavior. It mentions updating content and metadata but does not specify side effects, authorization requirements, or whether the operation is idempotent. More detail would improve transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, each providing essential information without redundancy. It is concise and front-loaded, making it easy to read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, and the description does not mention what the tool returns (e.g., success indicator, updated memory object). Given the complexity and number of parameters, the description could be more complete by indicating the return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the schema already explains parameters well. The description adds value by clarifying how to find the memory and what operations are possible (replace content, update metadata, or both), which is beyond the raw schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates an existing memory, specifies how to find it (by ref or category+title), and what can be updated (content, metadata, or both). This distinguishes it from siblings like 'remember' (create) and 'forget' (delete).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides guidance on how to identify the memory to update (by ref or category+title), which is helpful. However, it does not explicitly state when not to use this tool or compare with other update-like siblings such as 'knowledge_merge' or 'memory_ratify'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_identityA
Update your self-model or preferences with section-level precision. Targets H2 sections in identity files. Call without section/content to list available sections. IDENTITY.md (the creed) is immutable — only self-model and preferences can be edited.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Which identity file to update: "self-model" or "preferences" | |
| mode | No | "replace" updates an existing section (default), "append" adds a new section | |
| content | No | New content for the section (replaces everything under the H2 header) | |
| section | No | H2 section name to target. Omit to list all sections. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries burden. It discloses listing behavior when parameters omitted and immutability of IDENTITY.md. Lacks detail on destructive effects, auth requirements, or rate limits, but such might be implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then targeting detail, then usage tip. Every sentence adds value with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters, no output schema, and no annotations, the description covers purpose, usage, and parameter behavior. Immutability note adds completeness. Could mention response format, but not essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; description adds context: 'Call without section/content to list' and 'Targets H2 sections', which clarifies parameter usage beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it updates self-model or preferences with section-level precision, distinguishing it from siblings like the generic 'update' tool. The verb 'update' and resource 'identity files' are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: call without section/content to list sections, and notes IDENTITY.md is immutable. Missing explicit when-not-to-use compared to alternatives, but context from sibling tools and description is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
8 tool updates
v0.5.0- Changed
bootstrap3 fields changed- changed
Input schema / properties / purpose / descriptionPrevious value: -"What this agent exists to do — its reason for being"New value: +"What this agent exists to do — its reason for being, one line" - added
Input schema / properties / userAdded value: +{ + "description": "The human this agent works with — their name, not the agent's", + "type": "string" +} - changed
Input schema / properties / voice / descriptionPrevious value: -"Communication style and personality"New value: +"Communication style and personality, one line"
- Added
episodes - Changed
harness_init1 field changed- added
Input schema / properties / targetAdded value: +{ + "description": "Path to the dotfile to inject the managed loom block into (e.g. an absolute path to CLAUDE.md / AGENTS.md / GEMINI.md). When omitted only the harness manifest is scaffolded.", + "type": "string" +}
- Changed
knowledge_write11 fields changed- changed
Input schema / properties / body / descriptionPrevious value: -"Synthesized markdown body for the entity page (max 64 KB)"New value: +"Synthesized markdown body for the entity or artifact page (max 64 KB)" - changed
Input schema / properties / citations / descriptionPrevious value: -"Support citations. At least one required. All-conversation support → page stored provisional."New value: +"Support citations. At least one required. All-conversation → provisional. Any repo → internal (ours/). Any web → sourced." - changed
Input schema / properties / citations / items / properties / excerpt / descriptionPrevious value: -"Inline supporting quote — link-rot insurance (max 4 KB)"New value: +"Inline supporting quote or repo excerpt — link-rot insurance (max 4 KB)" - changed
Input schema / properties / citations / items / properties / source_kind / descriptionPrevious value: -"web = external URL; loom_memory = opaque memory ref; conversation = session distillation"New value: +"web = external URL; loom_memory = opaque memory ref; conversation = session distillation; repo = git repo path / commit / live-system probe (ours/ class)" - changed
Input schema / properties / citations / items / properties / source_kind / enumPrevious value: -[ - "web", - "loom_memory", - "conversation" -]New value: +[ + "web", + "loom_memory", + "conversation", + "repo" +] - changed
Input schema / properties / citations / items / properties / source_locator / descriptionPrevious value: -"URL, memory ref, or session ID"New value: +"URL, memory ref, session ID, or repo path + commit hash" - added
Input schema / properties / created_byAdded value: +{ + "description": "ours/ class: who created or last owned this artifact (e.g. \"art\", \"jonathan\"). Preserved across upserts when omitted.", + "type": "string" +} - changed
Input schema / properties / domain / descriptionPrevious value: -"Domain tag, e.g. \"music/eurorack\", \"programming/typescript\". Hierarchical string; sub-domains queryable via prefix filter."New value: +"Domain tag. World class: \"music/eurorack\", \"programming/typescript\". Ours class: prefix with \"ours/\" — e.g. \"ours/art-ops\", \"ours/breakbrain\", \"ours/homelab\". Hierarchical string; sub-domains queryable via prefix filter." - changed
Input schema / properties / freshness_anchor / descriptionPrevious value: -"The version/date the page's claims are valid as-of — e.g. \"Syntakt OS 1.21\" for a device, or \"as of 2026-05\" for a topic. Drives the verification engine: a page is re-verified when this anchor moves or the freshness SLA elapses."New value: +"The version/date the page's claims are valid as-of — e.g. \"Syntakt OS 1.21\" for a device, \"as of 2026-05\" for a topic, or \"t-81 / 2026-08-31\" for an ours/ artifact. Drives the verification engine: a page is re-verified when this anchor moves or the freshness SLA elapses." - changed
Input schema / properties / title / descriptionPrevious value: -"Page title — the entity name (e.g. \"Mutable Instruments Rings\")"New value: +"Page title — the entity name (e.g. \"Mutable Instruments Rings\") or artifact name (e.g. \"breakbrain density model\")" - added
Input schema / properties / versionAdded value: +{ + "description": "ours/ class: artifact version or revision tag (e.g. \"v2\", \"2026-08-31\", \"t-81\"). Preserved across upserts when omitted.", + "type": "string" +}
- Changed
memory_propose2 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Memory category: user (about the human), project (about work), self (capability/learning), feedback (corrections/confirmations), reference (external pointers), pursuit (active goal or ongoing creative thread)"New value: +"Memory category: user (about the human), project (about work), self (capability/learning), feedback (corrections/confirmations), reference (external pointers), pursuit (active goal or ongoing creative thread), episode (short-term cross-body tape: where you were / what was said or decided / what shipped / what is open — 48h TTL by default, set metadata.where to your surface e.g. \"discord:#general\", \"voice\", \"wake:<id>\", \"lane:tending\", \"terminal\")" - changed
Input schema / properties / category / enumPrevious value: -[ - "user", - "project", - "self", - "feedback", - "reference", - "pursuit" -]New value: +[ + "user", + "project", + "self", + "feedback", + "reference", + "pursuit", + "episode" +]
- Changed
memory_ratify1 field changed- changed
Input schema / properties / category / enumPrevious value: -[ - "user", - "project", - "self", - "feedback", - "reference", - "pursuit" -]New value: +[ + "user", + "project", + "self", + "feedback", + "reference", + "pursuit", + "episode" +]
- Changed
recall1 field changed- added
Input schema / properties / diversityAdded value: +{ + "description": "MMR diversity 0..1 (default 0.3 = 1−λ). 0 reproduces the plain relevance ranking; higher trades relevance for coverage of distinct memories.", + "maximum": 1, + "minimum": 0, + "type": "number" +}
- Changed
remember2 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Memory category: user (about the human), project (about work), self (capability/learning), feedback (corrections/confirmations), reference (external pointers), pursuit (active goal or ongoing creative thread)"New value: +"Memory category: user (about the human), project (about work), self (capability/learning), feedback (corrections/confirmations), reference (external pointers), pursuit (active goal or ongoing creative thread), episode (short-term cross-body tape: where you were / what was said or decided / what shipped / what is open — 48h TTL by default, set metadata.where to your surface e.g. \"discord:#general\", \"voice\", \"wake:<id>\", \"lane:tending\", \"terminal\")" - changed
Input schema / properties / category / enumPrevious value: -[ - "user", - "project", - "self", - "feedback", - "reference", - "pursuit" -]New value: +[ + "user", + "project", + "self", + "feedback", + "reference", + "pursuit", + "episode" +]
31 tool updates
v0.4.1- First observed
bootstrap - First observed
dossier - First observed
find_similar - First observed
forget - First observed
harness_describe - First observed
harness_init - First observed
identity - First observed
knowledge_archive - First observed
knowledge_history - First observed
knowledge_maintain - First observed
knowledge_merge - First observed
knowledge_move - First observed
knowledge_purge - First observed
knowledge_recall - First observed
knowledge_restore - First observed
knowledge_supersede - First observed
knowledge_verify - First observed
knowledge_write - First observed
memory_archive - First observed
memory_audit - First observed
memory_list - First observed
memory_proposals - First observed
memory_propose - First observed
memory_prune - First observed
memory_ratify - First observed
memory_reject - First observed
memory_restore - First observed
recall - First observed
remember - First observed
update - First observed
update_identity
TDQS
Most tools separate cleanly by store (memory vs knowledge) and lifecycle stage (propose/ratify/archive/restore). The nearest overlaps are memory recall vs find_similar, knowledge_merge vs knowledge_supersede, and harness_init vs harness_describe, but their descriptions define distinct workflows. Overall an agent can usually tell them apart.
The server is strongly prefixed per subsystem (memory_, knowledge_, harness_) and uses consistent verb forms within each family. Deviations such as bare `update` alongside `update_identity`, noun-style `identity`/`dossier`, and `episodes`/`find_similar` are minor and readable. The convention is consistent enough to predict tool behavior.
32 tools is well above the 25+ threshold and will tax an agent's selection even though every tool has a real purpose. The four subsystems (identity, memory, knowledge, harness) justify much of the count, but it still feels heavy for a single MCP surface. Consolidating rarely used maintenance operations would help.
The memory subsystem has full lifecycle coverage—create, read, update, delete, archive, restore, audit, prune—plus a proposal/ratification workflow. The knowledge store similarly covers write, recall, move, merge, supersede, purge, verify, and history. Harness and identity are thinner but sufficient for their roles, so no major dead ends exist.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Persistent memory for AI agents with OAuth-backed hosted MCP access.
Persistent memory for AI agents across Claude, ChatGPT and any MCP client.
Shared, governed long-term memory for AI agents across tools and sessions via MCP and REST.
Persistent memory for AI agents — log and recall conversation context over MCP.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to maintain persistent memory across sessions by capturing conversations, extracting durable knowledge, and injecting relevant context, supporting various MCP-compatible platforms.12MIT
- AlicenseAqualityDmaintenanceMCP server for long-term agent memory, providing persistent memory, searchable knowledge, and evolving identity for AI agents.53Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables persistent memory for AI agents, combining episodic and semantic memory with LLM reasoning, accessible via MCP.2MIT
- AlicenseNot gradedqualityCmaintenanceProvides persistent, cloud-based memory for AI agents, letting them remember preferences, skills, and decisions across sessions via an MCP-compatible interface.Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sleepunit-agents/loom'
If you have feedback or need assistance with the MCP directory API, please join our Discord server