Skip to main content
Glama

DuDuClaw

English · 繁體中文 · 日本語

DuDuClaw turns AI command-line tools such as Claude Code, Codex and Antigravity into AI employees who actually deliver: they staff eleven messaging apps like Telegram, LINE, and Discord, an independent judge reviews their work before it ships, and every dollar they spend gets logged.

All you need is one Rust binary. Channel routing, conversation memory, multi-account rotation, behavioral guardrails, local inference, and a web dashboard are built in; swap the AI brain between eleven CLI backends (Claude Code, Codex, Antigravity, Grok and others) or any OpenAI-compatible API whenever you like, and your config and memory stay on your own machine. The core is Apache 2.0.

CI Version npm Glama MCP server score License: Apache-2.0

Quick start (needs Node.js 20+; prefer a desktop app? see Install):

npm install -g duduclaw
duduclaw run                  # then open http://localhost:18789

Table of contents

Related MCP server: tentra

Why DuDuClaw?

If you run claude or gemini in a terminal now and then, the native CLIs are all you need. The moment you want an AI staffing your LINE official account, covering your team's Discord, or running several agents with different jobs, you end up building a whole infrastructure layer yourself. DuDuClaw ships that layer:

Need

Native CLI

DuDuClaw

Telegram / LINE / Discord access

Terminal only

11 channels, per-agent bot tokens

Multi-LLM failover

Manual restart

4 rotation strategies + cross-provider failover

Context survives switching LLMs

Lost

Preserved

Conversation memory and knowledge base

Single session

SQLite temporal memory + layered wiki, auto-injected

Tools shared across LLMs

Rewrite per vendor

247 MCP tools written once, reachable from the Claude, Codex, Antigravity, Grok and OpenAI-compatible runtimes

Guardrails / audit / secret management

Build it yourself

Policy kernel + OS sandbox + AES-256-GCM built in

A whole box to hand to a customer

Install Linux yourself, manage updates and tamper resistance yourself

DuDuClaw OS image: A/B update with rollback + read-only root, plug in and go; a desktop shared by a person and the AI without getting in each other's way

Architecture at a glance

The AI runtime is the brain, DuDuClaw is the plumbing, and MCP (JSON-RPC 2.0) is the bridge. Swap the brain, keep the plumbing:

AI Runtime (brain) — Claude Code / Codex / Antigravity / Grok / … (11 CLIs) / OpenAI-compat
  ↕ MCP Protocol (JSON-RPC 2.0, stdin/stdout)
DuDuClaw (plumbing)
  ├─ Channel Router — Telegram / LINE / Discord / Slack / WhatsApp / Feishu
  │                    / Google Chat / Microsoft Teams / WeCom / DingTalk / WebChat
  ├─ Multi-Runtime — 12 runtime ids (11 CLIs + OpenAI-compat), auto-detected, per agent
  ├─ Session Memory — native --resume + temporal memory + key facts + layered wiki
  ├─ MCP Server — 247 tools (channels, memory, agents, skills, tasks, wiki, ERP)
  ├─ Evolution Engine — prediction-driven + AEE playbook rules + MistakeNotebook
  ├─ Security — PolicyKernel reference monitor + OS sandbox + redaction vault
  ├─ Inference Engine — OpenAI-compatible local server (llama-server / Ollama / vLLM) / llamafile
  ├─ Account Rotator — OAuth + API key rotation, budgets, health checks
  └─ Web Dashboard — React 19 SPA, embedded via rust-embed

The Rust workspace is 24 crates: the duduclaw-core foundation, the duduclaw-gateway service layer, the duduclaw-llm unified API layer, duduclaw-inference for local models, duduclaw-memory for cognitive memory, duduclaw-security, and more. Full design in ARCHITECTURE.md.

Experimental calibrated local routing uses Varun Kotte's UCCI (arXiv:2605.18796). See UCCI calibrated cascade for configuration and data preparation.

The same gateway + dashboard also ships as a whole machine: DuDuClaw OS is a Yocto-built appliance image. Its Yocto layer and release pipeline live in their own repo and vendor this repo's Rust workspace as a trimmed snapshot; see the Install section below.

Prerequisites

DuDuClaw doesn't ship its own LLM — you need an AI brain first. Pick one (you can also set this up later in the browser wizard):

  • Install one of the supported AI CLIs, such as Claude Code, Codex or Antigravity (the full list is in multi-runtime); Gemini CLI is no longer a DuDuClaw runtime. Anthropic's policy does not permit third-party products to offer Claude.ai login, route requests through Free/Pro/Max plan credentials on their users' behalf, or store those credentials, and Anthropic may enforce this without notice (users have reported suspended accounts). Google's Antigravity terms (section 6) say that accessing its service from third-party software may get the account suspended or terminated. An API key is the supported path; subscription sign-in stays available behind a risk notice you have to accept

  • Bring an API key for any OpenAI-compatible provider

  • Or run a local model behind an OpenAI-compatible server (llama-server, Ollama, vLLM, llamafile) — no cloud account needed

In the Dashboard, one-click login supports Claude, Codex, Grok, Kimi, Copilot, Kiro and OpenCode when the CLI is installed. Codex uses codex login --device-auth: open the verification page shown by the CLI, enter its device code, and wait for completion. The browser does not need access to a Docker callback port, and pasting a callback URL code into the Dashboard does not authenticate. On the Accounts page, the API Token card can delete a saved account after you confirm its account id; revoke the key separately at its provider if needed.

Install

A native Tauri build that starts the local gateway automatically when you launch it — no terminal required — and shares ~/.duduclaw with the CLI. Download from Releases:

Platform

File

Notes

macOS (Apple Silicon / Intel)

DuDuClaw_*.dmg

Signed + Apple notarized, opens cleanly

Windows x64

DuDuClaw_*_x64_en-US.msi

No Authenticode certificate yet, so SmartScreen warns; click "More info" then "Run anyway" to install — unblock details in docs/guides/desktop-unblock.md

Linux

*_amd64.AppImage / .deb

No signing needed

The macOS desktop build is available again from v1.68.1 (signed and notarized). v1.67.0 through v1.68.0 have no macOS build; Windows and Linux builds exist for those versions.

Open it and you're done — the in-app wizard walks you through picking an AI backend and creating your first agent, no commands needed.

npm (advanced / server use, all platforms including Windows)

For running on a server, scripting automation, or if you just prefer the command line. The only prerequisite is Node.js 20+:

npm install -g duduclaw

This installs a prebuilt binary for your platform (macOS ARM64/x64, Linux x64/ARM64, Windows x64). No compiler, no Rust.

⚠️ If the install asks you for Rust / MSVC Build Tools and a 1.5-hour compile, you took a wrong turn. That path is "build from source" for contributors; regular users should use the npm command above.

DuDuClaw OS (appliance image, pre-GA)

If you would rather not dedicate a computer, get a box that runs the moment you plug it in: DuDuClaw OS is a Yocto-built Linux operating system in which the AI agent is a native resident: it boots into its own desktop (compositor / shell, lock screen, Cmd+K delegation bar), so a person and the AI share one x86-64 box without getting in each other's way — the agent's GUI work runs in a shadow workspace by default, and the moment you touch the keyboard or mouse, whatever it was driving on your desktop yields. The desktop edition ships with A/B atomic updates and rollback, a read-only root, and preloaded Chromium / LibreOffice (Steam installs from Flathub) plus a Chinese IME; Secure Boot signing, dm-verity and TPM2 are build-time overlay options that remain disabled as of the current v0.4.0 release, so boot with Secure Boot turned off in the BIOS/UEFI.

The current release is v0.4.0 (embedding platform v1.73.4). The gateway now runs as a non-root user with its containers on rootless Podman, SSH is off by default, and the base image gets the same firewall as the desktop edition. The upgrade is one-way: once v0.4.0 has booted successfully, a device cannot roll back to v0.3.0 or earlier, which stay on the Releases page only as older releases. Download the whole-disk .wic.zst (desktop edition), the installer-desktop installer .iso (writes the desktop edition), or the plain installer .iso (writes the base image, without the app layer) from DuDuClaw-OS Releases; every file comes with a .sha256 and a minisign signature, and the verification commands are on the OS README on the docs site. This is a bring-up line (0.x): QEMU-verified, not yet booted on real hardware, and upgrading an existing v0.3.0 box through the A/B update has not been verified yet. Hardware requirements and compatible machines: docs/guides/hardware-requirements.md; product overview: docs/features/50-duduclaw-os-appliance.md.

Build from source

Prerequisites: Rust 1.85+, Node.js 20+.

git clone https://github.com/zhixuli0406/DuDuClaw.git
cd DuDuClaw
cd web && npm ci --legacy-peer-deps && npm run build && cd ..
cargo build --release -p duduclaw-cli -p duduclaw-gateway --features duduclaw-gateway/dashboard
./target/release/duduclaw run

Python SDK (optional library)

The core gateway/CLI is a Rust binary and needs no Python. The duduclaw package on PyPI is a pure library for import duduclaw (agents / channels / mcp / memory_eval modules) with no command-line entry point, which is why pipx install duduclaw fails by design. If you need it:

pip install duduclaw

Quick start

  • Desktop app: just open it — the gateway starts automatically and the wizard appears right inside the app.

  • npm / build from source:

    duduclaw run                  # start everything (gateway + channels + scheduler + dispatcher)
    open http://localhost:18789   # open the dashboard

Either way, the first visit takes you through a wizard: pick an AI backend, create your first agent, then chat with it in the built-in WebChat — no need to run duduclaw onboard from a terminal first. Later, paste a bot token on the Channels page to put the same agent on Telegram, LINE, Discord, and the rest, without restarting.

Useful next steps:

duduclaw agent create      # create more agents
duduclaw wizard            # industry-template setup
duduclaw status            # system health snapshot
duduclaw update            # check for and install updates
duduclaw service install   # start on boot (launchd / systemd)

Feature overview

Area

What's built in

Read more

Channels

11 channels (Telegram / LINE / Discord / Slack / WhatsApp / Feishu / Google Chat / Teams / WeCom / DingTalk / WebChat), per-agent bots, hot start/stop, platform-native formatting, typing indicators, live task-progress boards; Telegram voice messages are transcribed through the OpenAI Whisper API. Discord voice channels are a non-default build feature and are not in the release binaries

docs/features

Multi-runtime

12 runtime ids: Claude Code / Codex / Antigravity / Grok / Qwen Code / Kimi Code / GitHub Copilot CLI / Kiro / Cursor / Mistral Vibe / OpenCode plus OpenAI-compat; auto-detected, per-agent config, context survives backend switches

docs/features/13

Unified LLM API layer

duduclaw-llm covers 4 native protocols (Anthropic Messages / OpenAI Responses / Gemini / OpenAI-compat) with one normalized request, plus 8 OpenAI-compat presets (DeepSeek / MiniMax / Groq / Together / Mistral / OpenRouter / xAI / Qwen), a pricing registry, and cross-provider fallback

ARCHITECTURE.md

MCP server

247 tools: channels, memory, agent orchestration, skill market, task board, shared wiki, Odoo ERP, computer use, live forking; stdio and HTTP/SSE transports; an external client key gets a 7-tool baseline unless the operator grants it memory, wiki or messaging scopes, and connector, execution and admin tools are never exposed externally

docs/api

Memory

SQLite temporal memory (fact supersession chains), HippoRAG-lite knowledge-graph retrieval (Personalized PageRank), Ebbinghaus forgetting-curve archival, cross-agent shared wiki

docs/features

Self-evolution

Prediction-driven (by design most conversations end without an LLM call) + AEE playbook evolution: SOUL.md is read-only for agents, learned behavior is small rules that each link an eval case, a rule is committed only if it matches or beats the current playbook and is settled on its own after 24h; MistakeNotebook cross-turn memory

evolution-engine.md

Security

PolicyKernel reference monitor (zero-LLM, fail-closed), macOS Seatbelt / Linux Landlock native sandbox (per agent, off by default), container sandboxes (task sandbox: Docker only, off by default; script sandbox: Docker, with WSL2 tried first on Windows), secret redaction vault, CONTRACT.toml behavioral contracts + red-team CLI

SECURITY.md

Accounts and cost

OAuth + API key rotation (4 strategies), rate-limit and billing cooldowns, cost telemetry with cache-efficiency analytics. Each call runs the official CLI as a fresh process (the PTY session pool was removed in 2026-09; a one-shot pseudo-terminal remains for CLIs that require a TTY, such as Grok). Anthropic's policy does not permit third-party products to route requests through Claude subscription credentials, and Google's Antigravity terms say third-party access through a subscription OAuth login may get the account suspended or terminated, so use API keys; subscription sign-in stays available behind an explicit risk acknowledgment (multi-runtime)

docs/features

Local inference

Any OpenAI-compatible local server (llama-server / Ollama / vLLM / SGLang) or llamafile, with three-tier confidence routing

docs/features

Fine-tuning

Build SFT / DPO datasets (ShareGPT / Alpaca) from this machine's conversations, task results and approval decisions, train them on your own GPU host (SSH + LLaMA-Factory) or Together's cloud, then import the GGUF / LoRA back into the local models directory. No local training — integrated graphics cannot train — and data leaving the machine requires an explicit acknowledgement

docs/features/54

Live forking

RFC-26: fork an in-progress task into N competing branches, each in a copy-on-write isolate, with an AI judge picking the winner to merge (off by default; in v1.67.0 do not enable it on Windows, see CHANGELOG)

docs/rfc

Auto-update

One click from the dashboard or unattended (auto_update = true); SHA-256 + Ed25519 verification, in-place restart, open tabs reload themselves

deployment-guide.md

Web dashboard

React 19 + TypeScript SPA embedded in the binary; zh-TW / en / ja

docs/features

ERP

Odoo bridge with 17 MCP tools (CRM / sales / inventory / accounting), CE/EE auto-detection, per-agent credential isolation

docs/rfc

DuDuClaw OS

Yocto appliance image (current release v0.4.0, embedding platform v1.73.4): own compositor / shell with keyboard shortcuts, human–AI co-driving (dedicated agent seat, shadow workspace, human input freezes the agent, Super+Esc emergency stop; compiled in, off by default), A/B atomic update with rollback (no rollback below v0.4.0), read-only root, non-root gateway with rootless Podman containers, SSH off by default, first-boot provisioning + LAN dashboard, app compatibility layer (Flatpak / Bottles / Waydroid); Secure Boot signing / dm-verity / TPM2 are build overlay options (still not enabled as of v0.4.0); separate repo and version line, pre-GA

docs/features/50 · 52

Full feature list in docs/features/feature-inventory.md; version history in CHANGELOG.md.

CLI commands

duduclaw onboard             # first-run setup; the browser wizard covers this now, use for headless/scripted setups (--yes to skip prompts)
duduclaw run                 # start everything (gateway + channels + heartbeat + cron + dispatcher)
duduclaw agent               # interactive chat; subcommands create / list / inspect / pause / resume / run
duduclaw wizard              # industry-template setup
duduclaw status              # system health snapshot
duduclaw doctor              # diagnostics
duduclaw test <agent>        # red-team security test (9 built-in scenarios)
duduclaw eval                # run the agent behavior eval suite
duduclaw update              # check for and install updates
duduclaw service install     # install as a system service; also start / stop / status / logs / uninstall
duduclaw export / import     # export / import ~/.duduclaw (portable personal data)
duduclaw migrate from openclaw   # painless migration from OpenClaw / Hermes / paperclip (dry-run by default, --apply to write)
duduclaw mcp-server          # start the MCP server (stdio JSON-RPC 2.0)
duduclaw http-server         # start the MCP HTTP/SSE transport (Bearer auth)
duduclaw acp                 # start the Agent Client Protocol server (Zed / JetBrains / Neovim agent panels)
duduclaw acp server          # start the A2A server (agent-to-agent interop)
duduclaw license             # license management (activate / status / redeem / rebind / …)

Run duduclaw --help for the full command list and subcommands; developer topics are in the development guide.

Trust and security

What you install is fully transparent:

  • What's in the npm package: a small JS wrapper plus platform binaries (@duduclaw/<platform> optionalDependencies). postinstall only checks that the platform package is present (install.js); nothing is downloaded from arbitrary URLs or executed

  • No telemetry: no usage data or conversation content is sent to us. The gateway checks GitHub Releases for updates every 6 hours; with a paid license installed it also refreshes the license with the license server (every 3–7 days depending on tier) and fetches the revocation list daily. Without a license file there is no licensing traffic. Secrets stay on your machine, encrypted with AES-256-GCM

  • No privilege escalation: runs entirely in user space

  • Maintainer: Dudu Technology Ltd. (registered in Taiwan, tax ID 94139082)

  • High-risk actions in chat: an employee asks for approval of a high-risk computer-use step in its channel, and you answer with the request's full ID. An operation whose result is unknown is never re-sent automatically; an Admin settles it in the dashboard. See the operator guide

Every release asset ships with three kinds of verification: a SHA-256 checksum, a cosign keyless signature, and a minisign Ed25519 signature (the built-in auto-updater enforces this one and refuses unsigned or tampered releases):

# SHA-256
shasum -a 256 -c duduclaw-darwin-arm64.tar.gz.sha256

# minisign (the same public key is pinned inside the binary)
minisign -Vm duduclaw-darwin-arm64.tar.gz \
  -P RWTh5pOpk0YmdBgm3VyB2bzxFtajNLXr7zFDhbcc75TgM8YfeV+NSzXh

Don't trust prebuilt binaries? Building from source takes three commands. Report vulnerabilities via SECURITY.md.

Why does a "new" package start at version 1.3x? DuDuClaw spent months in a private repo (400+ commits) before going public; the full history is in the git log.

Comparison

DuDuClaw

OpenClaw

IronClaw

Dify

Language

Rust

TypeScript

Rust

Python

Channels

11

25+

8

0 (API)

Multi-runtime

12 runtime ids (11 CLIs + OpenAI-compat)

single

single

multi-LLM

MCP server

247 tools

no

no

no

Self-evolution engine

AEE playbook rules (prediction-driven)

no

no

no

Local inference

OpenAI-compatible local server / llamafile + confidence routing

no

no

no

Behavioral contracts

CONTRACT.toml + red team

no

WASM sandbox

no

License

Apache 2.0 (open core)

MIT

open source

$59+/mo

Documentation

License

Open core: the core is Apache License 2.0, free to use, modify, and distribute. Commercial add-ons (commercial/, not in this repository), such as the premium industry packs, are closed source and paid; a license key unlocks them. The license-verification client (crates/duduclaw-license) is part of the Apache 2.0 core. See LICENSING.md.

Commercial licenses, enterprise rollout, training and support are provided by our authorised distributor, Future Corp (未來企業股份有限公司). We do not sell directly.

Available Tools

24 tools
code_mapA
Read-only

Rank a local repo's source files by relevance to a query (tree-sitter symbol graph + PageRank) and summarise their key symbols. Read-only. Use to find where code lives; it does not return file bodies.

ParametersJSON Schema
NameRequiredDescriptionDefault
rootNoRepository root to scan (default: current working directory)
queryYesNatural-language or identifier query (e.g. a function/type name)
max_filesNoMax ranked files to return (default 15, 1 to 100)
chat_filesNoRepo-relative paths already in context; their symbols bias the ranking. Either this or query must be non-empty

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the "Read-only" claim is partly redundant. However, the description adds genuinely useful behavioral detail the annotations cannot: the ranking mechanism, the summarisation output shape, and the negative constraint that file bodies are not returned.

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

Conciseness5/5

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

Two tight sentences with no waste: the first front-loads what the tool does and how, the second gives usage guidance and the key exclusion. Nothing is padded.

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

Completeness4/5

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

With no output schema and four parameters, the description still covers enough: it indicates the return shape (ranked files plus summarised key symbols) and what is not returned. It is nearly complete for a read-only query tool, though it does not mention result counts or ordering guarantees beyond max_files.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter (root, query, max_files, chat_files) is already documented in the schema. The description adds no syntax, format, or inter-parameter detail beyond that, so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb (rank/summarise) and resource (a local repo's source files) plus the mechanism (tree-sitter symbol graph + PageRank). None of the sibling tools (memory_*, wiki_*) do repo ranking, so the scope is unambiguous.

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

Usage Guidelines4/5

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

"Use to find where code lives" gives clear usage context, and "it does not return file bodies" explicitly rules out a plausible alternative expectation (reading file contents). No sibling tool is named as an alternative, but the sibling set is disjoint so this is a minor gap.

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

memory_alias_addA
DestructiveIdempotent

Fold a surface form into a canonical entity (e.g. '老闆' -> 'Wang Ming') so recall treats them as one. Lowercased; chains flattened; re-adding an alias re-points it. See memory_alias_list.

ParametersJSON Schema
NameRequiredDescriptionDefault
aliasYesSurface form to fold into the canonical entity
canonicalYesCanonical entity name to keep

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds real behavioral context beyond them: input is lowercased, alias chains are flattened (transitive resolution), and re-adding an alias silently re-points rather than erroring — which is the detail that explains the destructive hint.

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

Conciseness5/5

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

Three tight clauses, front-loaded with the core action and an example, then the behavioral caveats, then the sibling pointer. Nothing is redundant or padding.

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

Completeness4/5

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

For a 2-parameter mutation tool with annotations covering the safety profile and no output schema, the description covers action, normalization, re-point semantics, and verification via a sibling. Return/confirmation behavior is left implicit but is minor for this tool.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds meaningful semantics the schema lacks: the alias value is normalized to lowercase and alias chains are collapsed. It does not clarify whether the canonical value is normalized the same way, leaving a minor gap.

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

Purpose5/5

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

States a specific verb+resource (fold a surface form into a canonical entity) with a concrete bilingual example that removes ambiguity. It also names the sibling memory_alias_list, so an agent can separate this write-side tool from the read-side listing tool without opening either schema.

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

Usage Guidelines4/5

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

"so recall treats them as one" gives the condition that motivates using this tool, and "See memory_alias_list" routes the agent to the complementary sibling for inspection. It stops short of explicit when-not guidance (e.g. alias vs. creating a separate entity), so it is clear context without exclusions.

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

memory_alias_listA
Read-only

List your memory's entity aliases as {canonical, alias} pairs plus a total. Check here before memory_alias_add so you do not re-point an existing alias by accident.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds beyond that by describing the result payload (canonical/alias pairs plus a total) and flagging the duplicate-alias hazard it helps avoid. It does not discuss size limits or ordering, but that is minor against the annotation coverage.

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

Conciseness5/5

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

Two short sentences with zero filler; the output shape is front-loaded and the usage rationale follows immediately. Every clause earns its place.

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

Completeness4/5

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

With no parameters, no output schema, and read-only annotations, the description is nearly complete: it states what comes back and why to call it. It stops short of noting pagination, ordering, or behavior on an empty alias set, which a caller might still want to know.

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

Parameters4/5

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

The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing in the schema to explain and the description correctly says nothing about inputs, though it also does not mention any implicit filtering (e.g. scope of 'your memory').

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

Purpose5/5

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

Specific verb (list) plus specific resource (entity aliases), and it even names the return shape: {canonical, alias} pairs plus a total. It explicitly distinguishes itself from sibling memory_alias_add, so an agent can tell them apart without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit precondition ('Check here before memory_alias_add') and a concrete reason ('so you do not re-point an existing alias by accident'), naming the alternative tool it complements. Nothing about when to reach for this versus memory_alias_add is left to inference.

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

memory_fetch_batchA
Read-only

Fetch up to 100 of your memory entries by id in one call. Returns {memories, missing_ids}; unknown or foreign ids go to missing_ids instead of failing. Use instead of repeated memory_read.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesMemory entry ids (UUIDs), 1 to 100
include_metadataNoAlso return tags, layer and created_at (default false)

TDQS

A4.7/5.0
Behavior4/5

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

Annotations only declare readOnlyHint/openWorldHint, and the description adds genuinely new behavior: the return shape {memories, missing_ids} and the partial-failure tolerance that unknown or foreign ids land in missing_ids rather than aborting the call. That is exactly the kind of non-obvious error semantics an agent needs. It stops short of covering ordering or permission expectations, so a 4 rather than 5.

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

Conciseness5/5

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

Three short sentences, zero filler, and the batch scope plus return/error contract are front-loaded before the routing advice. Every clause earns its place.

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

Completeness5/5

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

With no output schema present, the description carries the return-value burden and does so: it names both response fields and the failure mode. Nothing an agent needs to invoke this two-parameter read tool correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so both parameters are already documented, giving a baseline of 3. The description adds meaning beyond the schema by tying the '1 to 100' cap and the unknown/foreign-id behavior to how ids are interpreted, which helps the agent construct a safe batch call.

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

Purpose5/5

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

States a specific verb and resource ('Fetch ... memory entries by id'), gives the batch cap (up to 100), and names the sibling it replaces ('Use instead of repeated memory_read'), so an agent can distinguish it from memory_read/memory_search without opening any schema.

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

Usage Guidelines5/5

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

Explicitly routes the agent: use this instead of repeated memory_read when fetching many entries by id. The single-read alternative and the condition that selects the batch form are both stated, leaving nothing to inference.

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

memory_get_atA
Read-only

The single (subject, predicate) fact valid at one instant by world time, or found:false. Safe with out-of-order ingestion. Full change log: memory_get_history; free-text recall: memory_search.

ParametersJSON Schema
NameRequiredDescriptionDefault
atYesThe instant to query, RFC3339 (e.g. '2026-07-20T00:00:00Z')
subjectYesThe triple subject
predicateYesThe triple predicate

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely new context beyond that: the return is a single fact or found:false, and it is 'Safe with out-of-order ingestion' — an important temporal-ingestion trait an agent cannot infer from annotations.

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

Conciseness5/5

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

Two dense sentences with zero waste. The core behavior and return shape are front-loaded, and the sibling routing is packed into the tail rather than padding the lead.

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

Completeness4/5

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

For a read-only, three-parameter lookup, the description is nearly complete: purpose, return shape, temporal semantics, and sibling routing are all present, and annotations plus 100% schema coverage fill the rest. Without an output schema the exact return object could be clearer, but 'or found:false' covers the key ambiguity.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (subject, predicate, at) are already documented with format examples. The phrase 'by world time' adds light semantic framing for the 'at' parameter, but the description otherwise adds no syntax or constraint detail beyond the schema. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource: retrieving the single (subject, predicate) fact valid at one instant by world time, with a stated return shape ('or found:false'). It distinguishes itself from memory_get_history and memory_search by naming them explicitly, so an agent can tell it apart from siblings without opening any schema.

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

Usage Guidelines4/5

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

Routes clearly to the right alternatives: 'Full change log: memory_get_history; free-text recall: memory_search,' which implies when this point-in-time lookup is the correct choice. It stops short of an explicit when-not statement (e.g. latest-state vs point-in-time), so it is a strong 4 rather than a 5.

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

memory_get_historyA
Read-only

Every value a (subject, predicate) fact has had, oldest to newest, expired rows included, showing which write superseded which. For the value at one instant use memory_get_at.

ParametersJSON Schema
NameRequiredDescriptionDefault
subjectYesThe triple subject (e.g. 'user:main', 'person:me')
predicateYesThe triple predicate (e.g. 'prefers_language', 'spouse')

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds real behavioral detail beyond them: expired rows are included, results are ordered oldest to newest, and the supersession chain between writes is exposed. It does not mention result size limits or pagination for long histories.

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

Conciseness5/5

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

Two sentences, no filler, and the most decision-relevant content (what is returned, including expired rows) is front-loaded before the alternative-tool pointer.

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

Completeness4/5

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

With no output schema and a safe read operation, the description does the work of explaining the returned sequence, its ordering and its supersession semantics. Only the absence of any volume/pagination note for potentially long histories keeps it from being fully complete.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are documented with examples in the schema, so the description carries no extra parameter burden. It frames the two params as a fact pair but adds no syntax or format meaning beyond the schema.

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

Purpose5/5

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

States a specific verb/resource: it returns the full historical sequence of values for a (subject, predicate) fact. It also explicitly differentiates itself from the sibling memory_get_at, which covers the point-in-time case.

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

Usage Guidelines5/5

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

Directly routes the agent: 'For the value at one instant use memory_get_at,' which tells the agent when to pick the sibling over this tool. The condition selecting each tool is stated rather than implied.

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

memory_improveA
Read-only

Reflect over your memories about a topic and get a clustered proposal scaffold for consolidated rules. Returns candidates only — review, then persist with memory_store. Writes nothing itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax memories to examine (default 40, max 100)
topicYesThe area to reflect on (e.g. 'refund handling', 'deploy mistakes')

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true and openWorldHint=false, and the description reinforces this with 'Writes nothing itself' and 'Returns candidates only', which is meaningful for an agent that might otherwise assume aggregation also persists. It does not cover rate limits or cost of scanning up to 100 memories, so it adds context but not exhaustively.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action and output, then the workflow constraint, then the safety clarification. No filler or repetition.

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

Completeness4/5

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

With no output schema, the description is responsible for describing the return, and it does so at a high level ('clustered proposal scaffold', 'candidates only'). Behavior, follow-up path, and read-only nature are all covered; only a slightly richer description of the scaffold shape would make it fully complete.

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

Parameters3/5

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

Schema description coverage is 100%, so both the topic and limit parameters are already documented in the schema, including the default and cap for limit. The description adds no parameter-level detail beyond 'about a topic', so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('reflect over your memories about a topic') and names the concrete output ('clustered proposal scaffold for consolidated rules'). It is clearly distinguishable from read-only siblings like memory_search and the write sibling memory_store.

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

Usage Guidelines4/5

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

Gives explicit workflow guidance: this returns candidates only, you review, then persist with memory_store. That routes the agent to the correct follow-up tool. It lacks a direct 'use memory_search instead if...' exclusion, so it stops short of full when-not coverage.

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

memory_readA
Read-only

Read one of your memory entries by id (from memory_store or memory_search): content, tags, layer, importance, created_at. Unknown or foreign ids are refused. Several ids: memory_fetch_batch.

ParametersJSON Schema
NameRequiredDescriptionDefault
memory_idYesMemory entry id (UUID) returned by memory_store or memory_search

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds non-trivial behavior beyond that: unknown or foreign ids are refused, and the exact fields returned (content, tags, layer, importance, created_at). It doesn't cover output pagination or error shape, but for a single-id lookup this is solid.

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

Conciseness5/5

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

Two compact sentences with the core action front-loaded, followed by validity rules and the batch alternative. Every clause carries information; no filler.

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

Completeness5/5

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

With no output schema, the description compensates by listing the returned fields. Combined with the id-validity rule and the batch escape hatch, an agent has everything needed to call this correctly for a simple read tool.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents memory_id as a UUID from memory_store or memory_search, so the description's id provenance largely repeats structured data. It does hint at id validity semantics via the foreign-id refusal, which is a small addition over the schema.

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

Purpose5/5

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

States a specific verb ('Read') and resource ('one of your memory entries by id') and enumerates the returned fields. It also distinguishes itself from the sibling memory_fetch_batch by routing multi-id reads there.

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

Usage Guidelines5/5

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

Explicitly names where valid ids come from (memory_store or memory_search), states the failure condition (unknown or foreign ids refused), and points to memory_fetch_batch for the multi-id case. Both the when-to-use and the alternative are spelled out.

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

memory_storeA

Save one free-text note to your own memory; memory_search finds it and later prompts get it injected. Returns memory_id. Never overwrites. Per-user preferences go to user_profile_record.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoOptional tags (array, or a comma-separated string); memory_search can filter on them
contentYesThe note, plain text; stored as one entry

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, and the description adds real value on top: 'Never overwrites' clarifies the mutation semantics, and 'Returns memory_id' fills in a return value that has no output schema. It doesn't cover anything like rate limits, dedup, or size limits on the note, which leaves a modest gap.

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

Conciseness5/5

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

Four short clauses, front-loaded with the action, and each sentence carries distinct information: what it stores, how it's retrieved, what it returns, and where the sibling use case goes. No filler.

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

Completeness5/5

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

For a two-parameter, single-purpose write tool with a fully documented schema and no output schema, the description covers storage semantics, retrieval path, return value, and alternative routing. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both content and tags are already documented in the schema, including the comma-separated-string fallback. The description adds only the framing that content is a single plain-text note; it says nothing about tags. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb+resource ('Save one free-text note to your own memory') and pins down scope: one note, one entry, own memory. It explicitly names sibling interactions (memory_search finds it, user_profile_record for preferences), so the agent can distinguish it from neighboring tools without opening schemas.

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

Usage Guidelines5/5

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

Gives both when-to-use and when-not-to-use with named alternatives: use this for free-text notes, and route per-user preferences to user_profile_record instead. It also explains the downstream payoff (memory_search and prompt injection), which tells the agent why to store at all.

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

user_code_profileA
Read-only

Compile your user-as-code profile from current memory facts: typed preference and constraint rules, unresolved conflicts, untyped-row count. Read-only. One user's view: user_profile_get.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the description's 'Read-only' is redundant and adds nothing. Its real contribution is naming the return contents (typed rules, unresolved conflicts, untyped-row count), which matters because no output schema exists. That is useful but modest, so a 3 sits above the annotation-only baseline without reaching rich behavioral disclosure.

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

Conciseness4/5

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

Short, front-loaded, and dense with the component list up front. The one wasted element is the redundant 'Read-only' sentence, which merely echoes the annotation.

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

Completeness4/5

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

With no output schema, the description must convey what compiling returns, and it lists the three components reasonably well. It does not describe the shape of the compiled profile or ordering, but for a zero-parameter read-only tool this is close to sufficient.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. No parameter information is needed or missing.

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

Purpose4/5

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

States a specific verb ('Compile') and resource ('your user-as-code profile from current memory facts') and enumerates the components it produces (typed preference/constraint rules, unresolved conflicts, untyped-row count). It also distinguishes itself from the sibling user_profile_get. The only drag is the slightly opaque 'user-as-code' framing, which assumes prior context.

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

Usage Guidelines3/5

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

The line 'One user's view: user_profile_get' routes the agent to an alternative and implies this tool is the compiled whole-profile view. However, it never states when to use this tool itself, and no other siblings (e.g. user_profile_record, user_profile_get) are contrasted beyond the single hint.

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

user_profile_getA
Read-only

One user's currently-valid preference facts plus the rendered '## About This User' block injected into replies to them. Read-only. Add or change facts with user_profile_record.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesStable per-user id from the channel

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already carry readOnlyHint=true and openWorldHint=false, and the description confirms rather than contradicts that. It adds real behavioral context beyond the annotations: only *currently-valid* facts are returned (superseded ones are excluded) and the rendered block is what gets injected into replies. No auth or rate-limit details, hence not a 5.

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

Conciseness4/5

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

Two short sentences, front-loaded with the resource and return content, with zero filler. The standalone 'Read-only.' sentence largely duplicates the readOnlyHint annotation, a minor redundancy that keeps it off a 5.

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

Completeness5/5

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

For a one-parameter read tool with no output schema, the description covers what is returned, how it is scoped, and where the write alternative lives. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, with user_id documented as a 'Stable per-user id from the channel', so the baseline is 3. The description only reinforces single-user scoping ('One user's') and adds no format or sourcing detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource (one user's currently-valid preference facts) and describes precisely what comes back, including the rendered '## About This User' block. It is unmistakably distinct from the sibling write tool user_profile_record, which it names.

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

Usage Guidelines4/5

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

Explicitly routes mutation to the alternative: 'Add or change facts with user_profile_record.' Clear context for a read, but it doesn't spell out the trigger condition (e.g., before composing a reply to that user), leaving when-to-call slightly implied.

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

user_profile_recordA

Record one durable preference of a specific end user (timezone, language, 'prefers tea'). Same predicate again supersedes the old value, history kept. Notes not tied to a user: memory_store.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesThe attribute value (e.g. 'tea', 'Asia/Taipei', 'zh-TW')
user_idYesStable per-user id from the channel (e.g. the Telegram/LINE/Discord sender id)
predicateYesThe attribute name (e.g. 'prefers', 'timezone', 'language', 'pronouns')
origin_trustNoConfidence 0 to 1 in this observation (default 1.0; stored at most 0.6, the AI-record ceiling)

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=false, which already signal a safe non-destructive write), the description discloses genuinely non-obvious behavior: re-recording the same predicate supersedes the prior value rather than duplicating, and history is retained. That supersede-and-keep-history semantics is the key thing an agent must know before writing and is not derivable from the annotations.

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

Conciseness5/5

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

Two compact sentences, zero filler. The core action and its examples are front-loaded, and the sibling routing note is placed last where it does least to interrupt the primary instruction.

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

Completeness4/5

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

For a write tool with no output schema, the description covers what gets written, what happens on conflict, and where non-user notes belong. It omits what the call returns and does not mention the origin_trust ceiling behavior, which the schema documents but the description never reinforces.

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

Parameters3/5

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

Schema description coverage is 100%, so predicate/value/user_id are already fully documented with their own examples. The description's examples largely restate the schema, with only the supersede rule adding real semantics to 'predicate'. Baseline 3 is appropriate when the schema carries the parameter burden.

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

Purpose5/5

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

States a specific verb and resource: 'Record one durable preference of a specific end user', with concrete examples (timezone, language, 'prefers tea'). It also distinguishes itself from memory_store ('Notes not tied to a user') and implicitly from user_profile_get, so an agent can separate it from its closest siblings without opening a schema.

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

Usage Guidelines4/5

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

The description names an explicit alternative with its selection condition: notes not tied to a user should go to memory_store. It implies the tool is for per-user preference capture, but does not state when to prefer it over user_profile_get or how it relates to memory_get_history for reading history.

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

wiki_dedupA
Read-only

Find likely duplicate wiki pages by title and tag similarity; returns pairs with each page's trust and the reason. Read-only, merges nothing: merge by hand with wiki_write.

ParametersJSON Schema
NameRequiredDescriptionDefault
agent_idNoAgent name (default: main agent)

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds value: it discloses that the operation is non-destructive ('merges nothing') and what the result contains (pairs with trust and reason). It does not mention cost, scale limits, or performance for a similarity scan, which keeps it short of a 5.

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

Conciseness5/5

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

Two dense sentences with no filler, and the core purpose is front-loaded before the read-only/merge guidance. Every clause earns its place.

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

Completeness5/5

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

With no output schema, the description correctly compensates by describing the return content (duplicate pairs with trust and reason). Combined with the safety annotations and the merge hand-off, an agent has everything needed to call and act on this tool.

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

Parameters3/5

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

Only one optional parameter (agent_id) with 100% schema description coverage, so the schema already carries the semantics. The description adds nothing about agent_id or its default behavior, which matches the baseline 3 for fully documented schemas.

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

Purpose5/5

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

States a specific verb and resource ('Find likely duplicate wiki pages'), the detection mechanism ('by title and tag similarity'), and the return shape ('pairs with each page's trust and the reason'). It also draws a clear boundary with the write sibling, so an agent can distinguish it from wiki_read/wiki_write at a glance.

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

Usage Guidelines5/5

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

The description explicitly states the limit of the tool ('Read-only, merges nothing') and names the alternative that performs the follow-up action ('merge by hand with wiki_write'). That is an explicit when-not plus a named alternative, which is exactly what routing guidance needs.

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

wiki_exportA
DestructiveIdempotent

Export a wiki (yours by default) under /exports as one HTML file (default) or an Obsidian vault folder; returns the path. Overwrites the previous export, never the wiki itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNo'html' (default, one file) or 'obsidian' (a folder of .md files with wikilinks)
agent_idNoAgent name (default: main agent)

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description meaningfully scopes that destructiveness: it explains that the previous export is overwritten while the wiki itself is never touched, which is precisely the risk an agent needs bounded. It also discloses the return value ('returns the path'). It stops short of covering permissions or failure modes, but it adds real context beyond the annotations.

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

Conciseness5/5

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

Two compact sentences, front-loaded with the action and destination, followed by the safety-critical caveat. Every clause earns its place and nothing is repeated.

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

Completeness5/5

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

For a two-parameter, no-required-params tool with no output schema, the description covers destination, format options, defaults, return value, and the destructive side effect. Nothing an agent needs in order to invoke this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are fully documented in the schema (format's html/obsidian meanings, agent_id's default). The description restates the same defaults ('yours by default', 'one HTML file (default)') without adding syntax or behavior not already in the schema, so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Export a wiki'), names the output location (<home>/exports), both output formats with defaults, and the return value. There is no sibling export tool to confuse it with, so no differentiation is needed, and none of the sibling read/write/lint tools could be mistaken for this.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: 'yours by default' signals the agent_id parameter lets you target another agent's wiki, and the format defaults are given. However, there is no explicit when-to-use guidance, no mention of prerequisites, and no note on when the Obsidian versus HTML format should be chosen beyond the raw format descriptions.

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

wiki_graphA
Read-only

Render the wiki link graph as a Mermaid diagram (nodes = pages, edges = related links), or only pages within depth hops of center. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoMax hops from center (default 2, capped at 10; ignored without center)
centerNoCenter page path for focused view (e.g. 'entities/customer.md')
agent_idNoAgent name (default: main agent)

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description redundantly restates 'Read-only,' which earns no credit. However, with no output schema, describing the return as a Mermaid diagram with nodes=pages and edges=related links is genuinely valuable behavioral context the annotations do not supply.

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

Conciseness5/5

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

A single front-loaded sentence that conveys purpose, output format, the optional focused mode, and the read-only nature with no wasted words.

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

Completeness4/5

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

For a read-only render tool with no output schema and fully documented parameters, the description covers purpose, output shape, and the optional narrowing mode adequately. It stops short of describing diagram size limits or a concrete output sample, a minor gap.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (depth, center, agent_id) are already documented in the schema with defaults, caps, and the 'ignored without center' caveat. The description only lightly restates the depth/center relationship, adding no syntax or format detail beyond the schema.

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

Purpose5/5

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

States a specific verb (Render) and resource (the wiki link graph) plus the output format (Mermaid diagram) and the node/edge semantics. An agent can distinguish it from wiki_ls, wiki_search, or code_map without opening a schema.

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

Usage Guidelines3/5

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

The description implies two usage modes — full graph vs. a focused view around `center` within `depth` hops — which is useful implied guidance. But it names no alternatives and gives no explicit when-to-use/when-not criteria versus sibling tools like wiki_ls or code_map.

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

wiki_lintA
Read-only

Audit the wiki for orphan pages, broken links and stale pages; returns a report and changes nothing. scope="shared" audits the shared wiki and its frontmatter schema. Totals only: wiki_stats.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNo"agent" (your own wiki, the default) or "shared" (the cross-agent knowledge base). Shared writes honour the namespace SoT policy — check wiki_namespace_status first.
agent_idNoAgent name (default: main agent). Ignored when scope="shared".

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so 'changes nothing' mostly restates structured data. The description does add value beyond that: it discloses the return form ('returns a report') and that shared-scope auditing also validates the frontmatter schema. Minor gaps remain about report contents or any cost/size limits.

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

Conciseness5/5

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

Three short sentences, front-loaded with the audit action and its defect categories, followed by scope behavior and the sibling pointer. No filler or hedging; every clause carries information.

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

Completeness4/5

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

For a side-effect-free audit tool with no output schema, an agent knows what it checks, what it does not change, and which scope to pick. The only real omission is the shape of the returned report (sections, severity fields), which would help an agent parse results, but that is a modest gap given annotations cover the safety profile.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters (scope, agent_id) are already fully documented, including the namespace SoT caveat. The description's scope="shared" sentence largely duplicates the schema text and says nothing about agent_id, so this is the baseline-3 case where the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb (Audit) and resource (the wiki) plus the exact defect classes checked: orphan pages, broken links and stale pages. It also disambiguates from the closest sibling by noting 'Totals only: wiki_stats', so an agent can separate auditing from aggregate counting without opening either schema.

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

Usage Guidelines4/5

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

Gives a clear condition for the scope parameter's non-default path (scope="shared" audits the shared wiki and its frontmatter schema) and routes totals-seeking callers to wiki_stats. It stops short of saying when an agent should lint versus rebuild (wiki_rebuild_fts) or dedup (wiki_dedup), so the alternative mapping is partial rather than exhaustive.

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

wiki_lsA
Read-only

List wiki pages as a directory tree with titles and last-updated dates. scope="shared" lists the cross-agent wiki. Use to browse; to find pages by content use wiki_search.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNo"agent" (your own wiki, the default) or "shared" (the cross-agent knowledge base). Shared writes honour the namespace SoT policy — check wiki_namespace_status first.
agent_idNoAgent name (default: main agent). Ignored when scope="shared".

TDQS

A4/5.0
Behavior3/5

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

readOnlyHint=true already tells the agent this is a safe read, so the description needn't restate safety. It adds the scope="shared" cross-agent meaning, which is useful, but says nothing about pagination, result limits, or truncation behavior for large wikis. Adequate but not rich against annotations that already carry the safety profile.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action and return format, then the scope nuance, then the routing hint. Every sentence earns its place with no filler.

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

Completeness4/5

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

With no output schema, the description usefully sketches the return shape (tree with titles and dates). For a zero-required-parameter browse tool with fully documented params, this is close to complete; only pagination/limit expectations for very large wikis are unaddressed.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters (scope, agent_id) are already fully documented in the schema, including the namespace SoT policy. The description's mention of scope="shared" duplicates rather than extends the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('List wiki pages') plus the return shape ('directory tree with titles and last-updated dates'), and names the sibling it is not (wiki_search). An agent can distinguish it from wiki_read and wiki_search without opening any schema.

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

Usage Guidelines4/5

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

'Use to browse; to find pages by content use wiki_search' gives an explicit condition and names the primary alternative. It does not mention wiki_read (to open a specific page), leaving one routing decision to inference, but the core browse-vs-search split is unambiguous.

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

wiki_readA
Read-only

Read a wiki page (frontmatter + body). Use wiki_ls or wiki_search to find page paths first. Pass scope="shared" to read from the cross-agent shared wiki.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNo"agent" (your own wiki, the default) or "shared" (the cross-agent knowledge base). Shared writes honour the namespace SoT policy — check wiki_namespace_status first.
agent_idNoAgent name (default: main agent). Ignored when scope="shared".
page_pathYesPage path relative to wiki/ (e.g. 'entities/wang-ming.md')

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the useful fact that the return is frontmatter plus body, but the shared-scope/namespace behavior it hints at is already detailed in the schema, so it adds only modest context.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action and return shape, followed by prerequisite routing and the shared-scope tip. No filler or redundancy.

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

Completeness4/5

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

It is a read-only tool with no output schema, and the description covers the action, the returned content type, and how to obtain the required page_path. Nothing essential is missing, though a note on behavior when a page is absent would complete it.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters are already documented, including scope's agent/shared semantics and agent_id's ignore rule for shared writes. The description's mention of scope="shared" merely echoes the schema rather than adding new syntax or constraints; baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Read a wiki page') and even specifies the return payload ('frontmatter + body'). It contrasts with the discovery-oriented siblings wiki_ls/wiki_search, so an agent can distinguish it without opening any schema.

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

Usage Guidelines4/5

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

Explicitly routes the agent to wiki_ls or wiki_search to obtain a page path first, which is exactly the prerequisite an agent needs. It also explains the shared-scope usage, though it gives no explicit 'when not to use this' beyond that routing.

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

wiki_rebuild_ftsA
Idempotent

Rebuild the wiki full-text index from the pages on disk; returns the page count. Safe to repeat. Use only when wiki_search misses pages you know exist, e.g. after files were edited directly.

ParametersJSON Schema
NameRequiredDescriptionDefault
agent_idNoAgent name (default: main agent)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, so 'Safe to repeat' largely restates structured data, but the description adds real context: the index is derived from on-disk pages, and the call returns a page count. It does not disclose rebuild cost/duration or any auth requirements, which keeps it below a 5.

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

Conciseness5/5

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

Three tight clauses with zero filler; the purpose and return value are front-loaded and the usage restriction follows. Nothing can be trimmed without losing signal.

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

Completeness4/5

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

For a single-parameter, low-complexity maintenance tool with no output schema, the description covers purpose, return value, safety, and triggering conditions. Only minor gaps remain (no mention of rebuild cost or failure modes), so it is essentially complete.

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

Parameters3/5

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

Schema coverage is 100% and the single agent_id parameter is fully documented in the schema, so the description adds no parameter-level information. Baseline 3 applies when the schema carries the full burden.

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

Purpose5/5

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

States a specific verb ('rebuild') and resource ('the wiki full-text index from the pages on disk'), plus the return value. It is clearly distinguishable from siblings like wiki_search, wiki_lint, or wiki_dedup, which act on different aspects of the wiki.

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

Usage Guidelines5/5

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

Explicitly scopes when to use it ('only when wiki_search misses pages you know exist') and gives a concrete trigger ('after files were edited directly'). It even names the alternative tool (wiki_search) and the condition under which that alternative fails.

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

wiki_shareA
Destructive

Publish a summary of one of your wiki pages to the shared wiki at sources/--.md with attribution; re-sharing overwrites it. Secret-scanned. Full shared pages: wiki_write scope=shared.

ParametersJSON Schema
NameRequiredDescriptionDefault
summaryNoText to publish (default: first 500 characters of the page body)
page_pathYesPage path in your own wiki, relative to wiki/ (e.g. 'concepts/return-policy.md')

TDQS

A4.2/5.0
Behavior4/5

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

Adds real behavior beyond the annotations: re-sharing overwrites the existing file (explaining the destructiveHint=true), content is secret-scanned, and attribution is added. These are meaningful operational facts an agent cannot infer from readOnlyHint=false/destructiveHint=true alone.

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

Conciseness5/5

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

Three terse clauses, front-loaded with the action and destination; no filler. Every clause carries distinct information (destination, overwrite, scan, alternative).

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

Completeness4/5

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

For a publish tool with no output schema, the description covers destination, overwrite semantics, the secret scan, and the full-page alternative. Minor gaps remain (e.g., whether the published page is editable/removable afterward), but nothing critical for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented (including the summary default of the first 500 characters). The description adds only the destination filename pattern, so baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb (Publish) and resource (a summary of one of your wiki pages), plus the exact destination path template sources/<you>--<name>.md. It is clearly distinguishable from the sibling wiki_write, which handles full pages.

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

Usage Guidelines4/5

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

Explicitly routes the agent: this tool publishes a summary, while full shared pages should use wiki_write scope=shared. That names the alternative and the condition that selects it, though it does not spell out when-not to share at all.

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

wiki_statsA
Read-only

Wiki totals: pages, index entries, recent activity, health score (shared scope adds per-contributor counts). Read-only. To see the problems behind the score use wiki_lint.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNo"agent" (your own wiki, the default) or "shared" (the cross-agent knowledge base). Shared writes honour the namespace SoT policy — check wiki_namespace_status first.
agent_idNoAgent name (default: main agent). Ignored when scope="shared".

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the 'Read-only' statement is largely redundant. The description does add one genuine behavioral detail not in annotations: shared scope adds per-contributor counts, which changes the return shape. No mention of cost, auth, or caching, so it is adequate but not rich.

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

Conciseness5/5

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

Three short sentences, zero filler, and the metric list is front-loaded ahead of the sibling routing. Every clause earns its place.

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

Completeness4/5

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

There is no output schema, so the description carries the burden of describing returns, and it does so by enumerating the four metric categories plus the shared-scope variation. Combined with full schema coverage and read-only annotations, an agent has enough to call it correctly; only exact output shapes remain unstated.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents scope and agent_id fully, including the default and the ignore rule. The description adds only the per-contributor-counts effect of shared scope, which is marginal beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.

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

Purpose4/5

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

The description names the resource (wiki) and enumerates exactly what the tool returns: pages, index entries, recent activity, health score. It also explicitly distinguishes itself from the sibling wiki_lint, which computes the underlying problems. A specific verb is implied rather than stated, but an agent can identify this as a read-only stats tool without opening the schema.

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

Usage Guidelines4/5

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

It explicitly names an alternative and the condition that selects it: 'To see the problems behind the score use wiki_lint.' That routing is clear. It lacks any when-not to use this tool or prerequisites, but for a simple read-only stats call that is a minor gap.

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

wiki_writeA
Destructive

Create or overwrite a whole wiki page (content incl. YAML frontmatter); atomic, updates _index.md and _log.md. scope="shared" obeys the namespace policy. To edit, wiki_read the page first.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNo"agent" (your own wiki, the default) or "shared" (the cross-agent knowledge base). Shared writes honour the namespace SoT policy — check wiki_namespace_status first.
contentYesFull page content including YAML frontmatter
agent_idNoAgent name (default: main agent)
page_pathYesPage path relative to wiki/ (e.g. 'concepts/return-policy.md')
update_indexNoAdd the page to _index.md (default true). Ignored when scope="shared".

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true, so the safety profile is known. The description adds genuinely non-obvious behavior on top: the write is atomic and has side effects on _index.md and _log.md, and shared writes are governed by the namespace policy. Auth/error behavior is still unstated, keeping it below a 5.

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

Conciseness4/5

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

Front-loaded with the create/overwrite verb and packed into three short clauses with no filler. It is slightly dense with semicolons, but every clause (side effects, scope policy, edit prerequisite) earns its place.

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

Completeness4/5

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

For a destructive write tool with no output schema, the description covers atomicity, side effects, scope policy, and the read-before-edit prerequisite, while annotations carry the safety signal. Remaining gaps (permissions, failure modes) are minor.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all five parameters (scope, content, agent_id, page_path, update_index). The description reiterates content-is-full-page and the namespace constraint on scope but adds no syntax or format detail beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb pair (create/overwrite) and resource (wiki page), and clarifies the unit is the whole page including YAML frontmatter. It also names the sibling wiki_read for the editing path, so an agent can distinguish the write from the read without opening a schema.

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

Usage Guidelines4/5

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

Gives an explicit rule for the edit case ('To edit, wiki_read the page first') and a conditional behavior for scope="shared". It stops short of routing the agent among the other write-adjacent siblings (wiki_share, wiki_dedup), which is why it isn't a 5.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv1.74.0
    • Changedcode_map5 fields changed
      • changedInput schema / properties / chat_files / description
        Previous value: -"Array of repo-relative paths already in context; their symbols bias the ranking"New value: +"Repo-relative paths already in context; their symbols bias the ranking. Either this or query must be non-empty"
      • addedInput schema / properties / chat_files / items
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / chat_files / type
        Previous value: -"string"New value: +"array"
      • changedInput schema / properties / max_files / description
        Previous value: -"Max ranked files to return (default 15, cap 100)"New value: +"Max ranked files to return (default 15, 1 to 100)"
      • changedInput schema / properties / max_files / type
        Previous value: -"string"New value: +"integer"
    • Changedmemory_fetch_batch5 fields changed
      • changedInput schema / properties / ids / description
        Previous value: -"Array of memory entry UUIDs to fetch (max 100)"New value: +"Memory entry ids (UUIDs), 1 to 100"
      • addedInput schema / properties / ids / items
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / ids / type
        Previous value: -"string"New value: +"array"
      • changedInput schema / properties / include_metadata / description
        Previous value: -"Include full metadata (tags, layer, created_at). Default false"New value: +"Also return tags, layer and created_at (default false)"
      • changedInput schema / properties / include_metadata / type
        Previous value: -"string"New value: +"boolean"
    • Changedmemory_improve1 field changed
      • changedInput schema / properties / limit / type
        Previous value: -"string"New value: +"integer"
    • Changedmemory_read1 field changed
      • changedInput schema / properties / memory_id / description
        Previous value: -"Memory entry UUID from memory_store"New value: +"Memory entry id (UUID) returned by memory_store or memory_search"
    • Changedmemory_search3 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Max results (default 10, max 100)",
        +  "type": "integer"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Search query"New value: +"Keywords or a short phrase to match"
      • addedInput schema / properties / tags
        Added value: +{
        +  "description": "Only entries carrying at least one of these tags (array, or a comma-separated string)",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedmemory_store4 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"Memory content"New value: +"The note, plain text; stored as one entry"
      • changedInput schema / properties / tags / description
        Previous value: -"Comma-separated tags"New value: +"Optional tags (array, or a comma-separated string); memory_search can filter on them"
      • addedInput schema / properties / tags / items
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / tags / type
        Previous value: -"string"New value: +"array"
    • Changeduser_profile_record2 fields changed
      • changedInput schema / properties / origin_trust / description
        Previous value: -"Confidence 0..1 in this observation (default 1.0; stored at most 0.6, the AI-record ceiling)"New value: +"Confidence 0 to 1 in this observation (default 1.0; stored at most 0.6, the AI-record ceiling)"
      • changedInput schema / properties / origin_trust / type
        Previous value: -"string"New value: +"number"
    • Changedwiki_export1 field changed
      • changedInput schema / properties / format / description
        Previous value: -"Export format: 'obsidian' or 'html' (default: html)"New value: +"'html' (default, one file) or 'obsidian' (a folder of .md files with wikilinks)"
    • Changedwiki_graph2 fields changed
      • changedInput schema / properties / depth / description
        Previous value: -"Max hops from center (default: 2, ignored without center)"New value: +"Max hops from center (default 2, capped at 10; ignored without center)"
      • changedInput schema / properties / depth / type
        Previous value: -"string"New value: +"integer"
    • Changedwiki_search6 fields changed
      • changedInput schema / properties / expand / description
        Previous value: -"1-hop expand via related/backlinks (true/false, default: false). Ignored when scope=\"shared\"."New value: +"Also return pages one related/backlink hop away (default false). Ignored when scope=\"shared\"."
      • changedInput schema / properties / expand / type
        Previous value: -"string"New value: +"boolean"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (default: 10)"New value: +"Max results (default 10, max 100)"
      • changedInput schema / properties / limit / type
        Previous value: -"string"New value: +"integer"
      • changedInput schema / properties / min_trust / description
        Previous value: -"Minimum trust score filter (0.0-1.0)"New value: +"Drop pages whose trust is below this, 0.0 to 1.0"
      • changedInput schema / properties / min_trust / type
        Previous value: -"string"New value: +"number"
    • Changedwiki_share2 fields changed
      • changedInput schema / properties / page_path / description
        Previous value: -"Page path in your own wiki to share"New value: +"Page path in your own wiki, relative to wiki/ (e.g. 'concepts/return-policy.md')"
      • changedInput schema / properties / summary / description
        Previous value: -"Optional custom summary (default: first 500 chars of body)"New value: +"Text to publish (default: first 500 characters of the page body)"
    • Changedwiki_write2 fields changed
      • changedInput schema / properties / update_index / description
        Previous value: -"Update _index.md automatically (default: true). Ignored when scope=\"shared\"."New value: +"Add the page to _index.md (default true). Ignored when scope=\"shared\"."
      • changedInput schema / properties / update_index / type
        Previous value: -"string"New value: +"boolean"
  2. 24 tool updatesv1.73.3
    • First observedcode_map
    • First observedmemory_alias_add
    • First observedmemory_alias_list
    • First observedmemory_fetch_batch
    • First observedmemory_get_at
    • First observedmemory_get_history
    • First observedmemory_improve
    • First observedmemory_read
    • First observedmemory_search
    • First observedmemory_store
    • First observeduser_code_profile
    • First observeduser_profile_get
    • First observeduser_profile_record
    • First observedwiki_dedup
    • First observedwiki_export
    • First observedwiki_graph
    • First observedwiki_lint
    • First observedwiki_ls
    • First observedwiki_read
    • First observedwiki_rebuild_fts
    • First observedwiki_search
    • First observedwiki_share
    • First observedwiki_stats
    • First observedwiki_write

TDQS

A4/5.0

Scored across 24 tools

Disambiguation4/5

Descriptions actively cross-reference each other (e.g. memory_read vs memory_fetch_batch, memory_get_history vs memory_get_at, memory_search vs wiki_search), making boundaries clear. A few pairs are close (user_profile_get vs user_code_profile, memory_read vs memory_fetch_batch) but the descriptions resolve them. No two tools appear to do the same thing.

Naming Consistency4/5

Consistent snake_case with clear prefix namespacing (memory_*, wiki_*, user_profile_*, code_map). Minor deviation: most are prefix_verb but memory_alias_add/memory_alias_list are prefix_noun_verb, and some wiki tools are prefix_verb_fts style. Still highly readable and predictable.

Tool Count4/5

24 tools is on the heavy side but spans four distinct subsystems (memory, wiki, user profile, code), so the count is defensible. Wiki alone accounts for 11 tools, which could arguably be trimmed, but each has a distinct read-only or mutating role.

Completeness4/5

Broad coverage: memory store/read/search/batch/history/aliases/reflection, full wiki lifecycle (write/read/ls/search/export/graph/lint/stats/dedup/reindex/share), profile record/get/compile, plus code mapping. Main gap is the absence of any delete operation for memory or wiki entries (relies on overwrite), and code tooling stops at mapping with no file-body access.

Maintenance

ActivityNo data
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers