kontexta
Kontexta is a local-first MCP server that gives AI coding agents a persistent, git-backed markdown memory ("Brain"), a sandboxed command surface ("Hands"), and a journaling feedback loop ("Eyes").
Brain / knowledge base — create, read, update, move, delete and search (SQLite FTS5 + regex) markdown files across a global vault and registered projects, with token estimates on every response.
Surgical context reads — fetch a file's outline, a single heading's body, or a line range instead of whole files;
files_describe/projects_mapinspect structure without paying body tokens.Batch operations — up to 200 files per create/read, 500 per delete, plus bulk filtering by project, tag, folder, favorite, or content class.
Versioning — git history, diffs between commits, restore to a prior commit, and committed backups pushed to a remote.
Journaling (Eyes) — write append/note/intent events, distill raw events into per-topic summaries, check backlog, run retention housekeeping, and mark subagent upgrades.
Session context — read the user profile, refresh the session snapshot (profile, upcoming events, conflicts), and check what changed since a timestamp.
Project registration — register projects, index their markdown, refresh/detect index drift, and inject agent workflow rules (CLAUDE.md, AGENTS.md, .cursor/rules, etc.) or copy those files into the KB.
Hands commands — list/reload project-defined
kontexta.jsontools, view the authoring schema, and approve high-risk invocations via single-use tokens.Tagging — add/remove tags, set favorites, list the tag taxonomy, suggest tags by corpus mining, find related files, and bulk-tag by search query.
Calendar — manage tracked entities and dependency links, add/update/delete events, detect overlaps and insufficient buffers, and export ICS.
Resources & web clipping — attach binary assets to reports, list/delete them, export HTML reports as PDF/PNG, and clip external URLs into the knowledge base (with auth-header support).
Provides an optional Docker-based web UI for visual knowledge base management.
Allows pushing knowledge base changes to a remote Git repository via the commit_backup tool.
Supports GitHub Copilot by injecting agent rules and providing MCP tools for knowledge management.
Kontexta is a local-first Model Context Protocol (MCP) server that gives your AI coding agents — Claude Code, Cursor, Cline, GitHub Copilot, Gemini, Antigravity — a persistent memory and a controlled command surface. Learn more at kontexta.dev
Instead of agents losing context between sessions or inventing their own shell commands, Kontexta provides:
Brain: A git-backed markdown vault with FTS5 search and surgical section edits.
Hands: A sandboxed command engine defined by you in
kontexta.json.Eyes: A feedback loop that journals results back into the brain.
The Unique Value
Most AI tools trap context inside their own chat window. Kontexta moves that context to your own SSD, providing six core advantages:
1. Cross-Agent Handoff
Switch agents mid-project: Claude Code journals a decision; Cursor reads it 5 minutes later.
Unified command surface: Author your
kontexta.jsononce; every agent uses the same validated tools and approval gates.Multi-agent collaboration: Different agents working on different tasks contribute to the same indexed knowledge base.
Zero-touch onboarding:
projects_register+admin_onboard_agentinjects a fenced, version-stamped workflow rules block intoCLAUDE.md/AGENTS.md/GEMINI.md/.cursor/rules/.continue/rules/.clinerules/.github/copilot-instructions.mdso every new conversation — on any agent — wakes up already knowing how to use kontexta.
2. Cross-Project Awareness
Global reach: An agent working in Project A can instantly search and read the documentation, context, and states of Project B.
Shared standards: Solve a problem once, document it, and let your agent apply that solution across all your other projects automatically.
Heads-up on sensitivity: Because the vault is global, every registered project is readable by any agent session you start. If you mix client work with personal projects, keep sensitive material in a separate vault (
KONTEXTA_DATA_DIR) rather than registering it alongside everything else.
3. Deterministic Context Retrieval
SQLite FTS5 Power: Instead of unpredictable vector-based RAG, Kontexta uses high-performance full-text indexing for deterministic, local-first context discovery.
Reliable Discovery: Fast, exact keyword and regex-based search ensures you find what you're looking for without the "hallucination" risk of third-party embedding providers.
4. Token-Optimized Context Economy
Surgical fetching: Instead of indiscriminately dumping whole directories into the LLM's context window, Kontexta provides tools to fetch specific file outlines, sections, or targeted search excerpts.
Budget awareness: Every tool response includes
est_tokensso agents can smartly budget what they pull into memory.
5. Separation of Code and Context
The "Context.md" Killer: Stop littering your source tree with
CONTEXT.mdorAI_NOTES.mdfiles that clutter your PRs and get stale.Global Knowledge Vault: Keep your main codebase pristine. Architectural decisions, agent journals, and cross-project standards live in a separate, dedicated global vault accessible by any agent instance.
6. Compounding Intelligence
Continuous learning: Through the "Eyes" and journaling system, your AI agents document their decisions, successes, and mistakes.
Smarter next time: A problem solved today is saved in the Brain, meaning tomorrow's session starts with the benefit of yesterday's experience.
Related MCP server: MindOS
Architecture: Brain → Hands → Eyes
Kontexta builds a closed feedback loop that makes every turn smarter than the last.
1. Brain — The Context Engine
A markdown knowledge vault optimized for context-window economy.
FTS5 Search: Instant local keyword search.
Surgical Edits: Tools for reading and updating specific markdown sections without pulling entire files.
Token-Aware: Every response includes
est_tokensandsize_bytesso agents can budget their context.
2. Hands — The Command Engine
A project-defined command surface that replaces "unrestricted shell access" with a sandboxed contract.
Explicit boundaries: You declare exactly what an agent can do via
kontexta.json. There is no unrestricted shell access.Sandboxed: Locked working directory, clean environment, and ring-buffered output.
Human-in-the-loop: High-risk commands can require a cryptographic one-time token, pausing execution until you explicitly approve it.
The sandbox enforcesyour contract — it doesn't infer risk on its own. A command only requires approval if you mark it high-risk in kontexta.json; anything else runs unattended within the sandbox. Treat kontexta.json like a permissions file: the security posture is exactly as careful as your authorship of it.
3. Eyes — The Feedback Engine
Closes the loop by capturing Hands' output and journaling learnings back into the Brain.
Live Observation: Tools like
admin_overview({mode: "whats_new"})andfiles_diff_against_disklet agents see what actually changed.Automatic journaling: Every MCP tool call is captured to a per-project, append-only event log (Layer 1). The
journal_distilltool — or the lenient-mode auto-fallback — collapses raw events into per-topic markdown summaries (Layer 2) indexed alongside the rest of the knowledge base.journal_write(kind: "note"/"intent") lets agents enrich the log with decisions and topic pivots. Phase 2 also addsjournal_housekeep(retention/archival),journal_commit_upgrades(closes the subagent dispatch loop), strict mode (configurable per project — blocks read tools when backlog exists), and an opt-in WebUI scheduler that runs mechanical distillation on a 15-minute clock when the dashboard is installed. Learn more about Journaling modes and configuration in docs/JOURNAL.md.
How it Works in Practice
Imagine you are switching from Claude Code to Cursor mid-way through a feature.
The Problem: The "Context Gap"
Claude Code knows why you chose that specific library.
Cursor doesn't. You have to copy-paste or re-explain everything.
CONTEXT.md files help, but they get stale, they clutter your PRs, and they don't capture live decisions.
The Kontexta Solution
Journaling: As Claude Code works, kontexta automatically captures every tool invocation and decision to a structured event log.
Persistence: Those logs are saved in your local Kontexta brain, not the chat window. The
journal_distilltool consolidates raw events into per-topic markdown entries that are searchable alongside your knowledge base.Seamless Handoff: When you open Cursor, it immediately sees the recent journal entries and architectural state via the Kontexta MCP.
Zero Re-explanation: Cursor "wakes up" with the exact same context Claude had.
How Kontexta Compares
Kontexta doesn't try to replace your favorite agent or memory library — it sits in a different spot. Here's an honest read of where it overlaps and where it doesn't:
Capability |
| Vendor memory (Cursor rules, Claude Projects) | mem0 | Zep | Kontexta |
Setup cost | None — just a file | None — built in | SDK integration in your app | SDK + service | MCP server + |
Cross-agent portability | Per-agent flavored files drift apart | Locked to one vendor | App-level, not agent-level | App-level, not agent-level | Same MCP surface for Claude Code, Cursor, Cline, GitHub Copilot, Gemini, Antigravity |
Retrieval model | Whole file dumped into context | Whole file / vendor-managed | Vector + graph (semantic) | Temporal knowledge graph (semantic) | Deterministic FTS5 + regex; surgical section reads |
Token accounting | None | None | None exposed to agent | None exposed to agent | Every response carries |
Command execution | N/A | Vendor-defined tools | N/A (memory only) | N/A (memory only) | Sandboxed |
Storage | Repo file (clutters PRs) | Vendor cloud | Self-host or hosted, vector DB | Self-host or hosted | Local SQLite + markdown vault, with an optional relay for backup and multi-machine sync |
Best at | Static project conventions | Zero-config personal memory | Semantic recall inside one app | Long-running conversational memory | Multi-agent handoff + governed local execution |
Honest tradeoffs:
If you only use one agent and one project,
CLAUDE.mdor vendor memory is simpler — reach for Kontexta when you're switching agents or coordinating across projects.mem0 and Zep do semantic recall that FTS5 doesn't; Kontexta trades fuzzy matching for determinism and local-only operation.
Kontexta's
Handssandbox has no equivalent in the memory tools above — that's the unique surface, not the memory itself.
Quick Start (One Command)
Requires Node 22.x LTS. That's it — no Docker, no pnpm, no build.
npx kontexta startBoots the dashboard on http://localhost:23002 (opens in your browser) and starts the MCP server. First run walks you through master password, data location, and project registration in the browser.
Enable the coding agents you use in the dashboard and kontexta installs lightweight hooks so the journal also captures your conversation and shell commands — see docs/HOOKS.md.
Add to your AI client (MCP-only)
If you only want the MCP server (no dashboard), point your AI client at:
{
"mcpServers": {
"kxta": {
"command": "npx",
"args": ["-y", "kontexta", "mcp"]
}
}
}Or install automatically via Smithery:
npx -y @smithery/cli install safiyu/kontexta --client claudeNo MCP? Use the skill
If your AI client can't load MCP servers (e.g. managed installs that block user-added servers), the skills/kontexta agent skill exposes every kxta tool through a small Python bridge the agent runs from its shell. See skills/kontexta/README.md.
Alternative: Docker
For containerized deployments, see docs/INSTALL.md#docker-hub-compose.
Your Brain on More Than One Machine (Optional)
Everything Kontexta knows about you and your work (knowledge files, projects, profile, journals, calendar, tags) is your brain. It lives on your machine as markdown files and SQLite, and works fully offline. If you use Kontexta on more than one machine, or want a copy that survives a lost laptop, connect your brain to a remote.
A relay hosts any number of brains, each fully separate. For your brain it is two things at once: the durable copy of everything (nothing is ever pruned, a brain remembers) and the sync engine between your machines. Teammates can use the same relay, each with their own brain; nobody sees anyone else's.
The remote cannot read your brain. Payloads (file contents, paths, tags, journal entries, calendar data) are encrypted on your machine with AES-256-GCM before they leave it. The key is derived from your share id and never sent anywhere; the relay only ever sees a derived routing id, plus the metadata it needs to order ops (record ids, op kinds, which machine, timing and size). If a relay is compromised or misconfigured, an attacker gets ciphertext. The flip side: lose every copy of the share id and the data is unrecoverable, and revoking a machine stops its access to the relay but not its ability to decrypt data it already holds (for that, create a new brain).
Machines exchange fine-grained operations (file create, update, delete, move, tags, favorites, projects, calendar, journal) over short polling, so a decision made on one machine appears on the others without merging repositories or database files. A machine that never connects simply works locally.
Run a relay
The relay is kontexta-relay: a plain, stateless short-polling HTTP service with one SQLite file and one port (23010). Run it with Node or Docker.
# With Node (any box, VPS or Cloud Run):
KXTA_RELAY_PEPPER="$(openssl rand -hex 32)" \
KXTA_RELAY_ENROLL_SECRET="$(openssl rand -hex 16)" \
npx kontexta-relay
# With Docker (published image, no clone needed):
docker run -d --name kontexta-relay -p 127.0.0.1:23010:23010 -v kontexta-relay-data:/data \
-e KXTA_RELAY_PEPPER="$(openssl rand -hex 32)" -e KXTA_RELAY_ENROLL_SECRET="$(openssl rand -hex 16)" \
ghcr.io/safiyu/kontexta-relay:latest
# Or with compose, from the repo root (pulls the image, or builds it with --build):
docker compose -f docker-compose.relay.yml up -dIt is ready once http://127.0.0.1:23010/health answers.
Variable | Default | Purpose |
|
| Where it listens. |
|
| Docker compose only: the published port and interface. |
| (empty) | HMAC pepper bound into token and share id hashes. Required for any non-loopback deployment. |
| (empty) | Secret needed to create a brain. Joining an existing brain needs only its share id. |
|
| Path to the SQLite file (the Docker image keeps it at |
| (unset) |
|
| (unset) |
|
Set bothKXTA_RELAY_PEPPER and KXTA_RELAY_ENROLL_SECRET for anything beyond local experiments. The server refuses to start on the default pepper when bound beyond loopback, and without the enrollment secret nobody can create a brain. Put TLS in front of it (nginx, Caddy, Cloudflare Tunnel, Cloud Run) as you would for any endpoint that issues credentials.
All brains, their full history and their machines live in one SQLite file (the Docker volume kontexta-relay-data). Back that file up; to wipe everything, docker compose -f docker-compose.relay.yml down -v.
Connect a machine (kontexta brain)
The share id is what identifies a brain, and it is also the secret for joining it and the root of its encryption key. Kontexta generates it when you create a brain; you paste it on your other machines.
# First machine: create a brain (prints the share id once, save it):
kontexta brain connect https://brain.example.com --create --name "My brain" \
--enroll-secret "$KXTA_RELAY_ENROLL_SECRET"
# Another machine (or a replacement for a lost one): join with the share id:
kontexta brain connect https://brain.example.com --share-id ABCD-EFGH-...
# Brain name, relay, machines, outbox depth, skipped ops, cursor:
kontexta brain status
# List the machines in your brain, or revoke one:
kontexta brain machines
kontexta brain machines remove <machine-id>
# Show the full share id again (asks first):
kontexta brain share
# Sync on demand, or run the loop in the foreground on a machine without the web app:
kontexta brain push
kontexta brain pull
kontexta brain run
# Stop syncing (everything stays on this machine):
kontexta brain disconnectThe same flow is on the Brain page of the web app. Add --json to any subcommand for machine-readable output. --no-keep-share-id keeps the share id off this machine, and --data-dir / --timeout target a specific vault or bound a request. The Kontexta web app and the MCP server start the sync loop for you once a machine is connected.
Joining. Creating a brain on an empty relay makes your current vault its first content. Joining an existing brain on a new machine pulls the brain's current state instead of replaying its history. A machine that already has content keeps files that match, and where a file differs from the brain's version both are kept and a conflict copy appears for you to resolve.
How the cadence works. A connected machine short-polls: 15 s while active, 60 s while idle, and exponential backoff up to 5 minutes on failure.
Ordering and conflicts. The relay assigns every op a sequence number, the only source of ordering (client clocks are never trusted). Each machine tracks the version of each record it has seen and sends it with every edit, so an edit made on top of everything the machine has pulled is accepted. When two machines edit the same record without having seen each other's change, the relay keeps both. Neither machine overwrites its own file: each gets a conflict copy next to the canonical file (<name> (from <machine label>).<ext>) and lists it in the Conflict Manager, where you choose keep server, keep mine, keep both, or a merged version. Every resolution is pushed so your machines converge. Two machines creating the same path independently produce a path conflict instead of swapping content.
Journals merge instead of conflicting. The daily journal (knowledge/journal/journal-YYYY-MM-DD.md) is append-only, so when two machines write the same day their entries are merged into one sorted union on every machine. No conflict copy, nothing lost, and every machine ends with identical content.
Portable ops. Ops never carry machine-local ids or absolute paths. Records are referenced by global id (<id>@<machine>), and file paths travel relative to the data directory. A remote op that points outside the data directory is refused, and files in project repos never sync (only your knowledge base does).
Skipped ops. An op that cannot be applied on a machine (an unsafe path, a record that machine does not have) is recorded in the local sync_skipped_ops table and skipped so it cannot block the rest of the log. Other apply errors are retried a few polls first. A malformed op still stops the pull, so a version mismatch between machine and relay is noticed rather than hidden.
Security & Network Exposure
Kontexta's dashboard is designed for local-first use — running on localhost or on a trusted machine you control. The threat model is:
Default safe: A master password protects the UI. Sessions are HMAC-signed cookies, passwords are scrypt-hashed.
IP bypass is opt-in per IP. During setup you can allowlist IPs (e.g.
127.0.0.1) to skip the login prompt from trusted addresses.Reverse-proxy mode is opt-in. If you put Kontexta behind nginx, Caddy, or Cloudflare Tunnel, enable "Trust
X-Forwarded-Forheaders" during setup. Without this flag, those headers are ignored — so a LAN attacker cannot spoof an allowlisted IP.kontexta.jsonis your responsibility. The Hands engine executes shell commands you declare in this file. The sandbox limits where and how those commands run (path traversal blocked, ReDoS-proof regex, locked CWD, stripped PATH), but the what is whatever you wrote. Review anykontexta.jsonyou didn't author yourself — same caution you'd apply to a Makefile, GitHub Actions workflow, or shell snippet from the internet.
Do not expose the dashboard to the public internet without a trusted reverse proxy in front. The auth layer is sufficient for localhost and LAN use; it is not hardened against direct internet exposure (no rate limiting, no brute-force lockout, no MFA).
Demo & Walkthrough
In this demo:
System audit and web clipping.
Local RAG and context gathering.
The Brain/Hands/Eyes loop in action.
No-install demo: Try the MCP endpoints interactively right from your browser on the Glama Kontexta page.
Project Status & Transparency
Why the high version number on a fresh repository? If you look at the commit history, you might wonder how a repository with so few commits reached its current major version.
Kontexta wasn't built over a weekend. It began over a year ago as a private, monolithic toolchain used to manage complex, multi-agent coding workflows. The versioning reflects its true architectural maturity.
Recently, I undertook a major effort to industrialize and modularize this engine, restructuring it into the three core pillars you see today: Brain, Hands, and Eyes. This process involved decoupling the core from private infrastructure and moving to a clean, open-source monorepo. The condensed git history is the result of this clean extraction—leaving behind internal legacy commits to publish only the battle-tested, production-ready framework available today.
Roadmap
What's deliberately deferred and what triggers will pull it forward lives in docs/ROADMAP.md. Notable open items: per-call project resolution in journaling, server-side LLM upgrade for the WebUI scheduler, and Layer 3 (embeddings + graph + semantic clustering).
Features Breakdown
Brain
Global vault: local-first knowledge store with git-backed history and version rollbacks.
58 MCP tools tuned for context economy.
Batch operations (up to 500 files/call), grep, and regex support.
Web clipping with auth-wall detection.
Full git-backed versioning:
files_get_history,files_get_diff,files_restore.Agent context rules onboarding:
projects_registerdetects existingCLAUDE.md/AGENTS.md/GEMINI.md/.cursor/rules/*.mdc/.continue/rules/*.md/.clinerules/.github/copilot-instructions.mdand recommends a follow-up. Theadmin_onboard_agenttool injects an idempotent, version-fenced workflow rules block (or scaffolds one for the right agent) so every new conversation starts already aware of kontexta's conventions.
Hands
Project-specific
kontexta.jsontools map.Strict sandbox: realpath-verified CWD, stripped
PATH, and hard timeouts.ReDoS-proof parameter validation via
re2.CSPRNG-bound confirmation tokens for high-risk commands.
Dashboard
Built-in
/docspage with a searchable catalogue of all 66 core tools.Form-based
kontexta.jsoneditor with live validation.Real-time status bar streaming git activity over WebSockets.
Calendar
Generic, dependency-aware calendar for tracking events across anything you name — a server, a delivery van, a store location, a piece of equipment, a room, or anything else you schedule against.
Automatic conflict detection: overlapping windows on the same entity, overlapping windows on linked entities, and events scheduled too close together (configurable buffer).
Month, week, and agenda views in the dashboard, matching the rest of the UI; click to add or edit events, manage entities and their dependency links.
Export any date range as a standard
.icsfile for Outlook, Google Calendar, or Apple Calendar.11 MCP tools so agents can schedule, link, and check conflicts straight from chat.
Publish
CLI-driven documentation generation. Turn your knowledge base into polished documentation sites, API references, and LLM-readable docs.
Render blocks. Composable output blocks for endpoints, glossary, mermaid diagrams, navigation, LLMs, markdown, and more.
Seed templates. Pre-built templates for common documentation patterns — get started in minutes.
Pipeline architecture. Pluggable pipeline with configurable sources, renderers, and output targets.
Deleting a project file in Kontexta only un-indexes it from the AI's memory. Your physical source code is never touched.
Contributing
Kontexta is a project for developers, by developers. If you'd like to contribute new tools, improve the core engine, or refine the dashboard, please see our CONTRIBUTING.md for architecture guidelines and local setup instructions.
Built with care for the future of agentic coding. License: Apache-2.0
Available Tools
58 toolsadmin_commit_backupA
SIDE-EFFECTFUL: TOUCHES THE NETWORK. Sync the project's KB data into its git backup directory, create a commit, and git push to origin. AUTH: relies on the local user's git credentials (SSH agent, credential helper, etc.), there is no in-server auth. Kontexta does not rate-limit, but the remote may. Idempotent in steady state: a no-op commit is skipped, but the push still runs. Throws if the project has no configured backup repo or if push fails (network, auth, conflict). Returns {success, copied_files_count, copied_paths}. Use after a batch of KB writes to get changes off-machine.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so thoroughly: it flags side effects and network access, explains the auth model (local git credentials, no in-server auth), notes remote rate-limit potential, describes idempotency (no-op commit skipped but push still runs), and lists failure modes (missing repo, network/auth/conflict push failures).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the critical side-effect warning, then moves efficiently through purpose, auth, idempotency, errors, return shape, and usage. Every sentence carries distinct, useful information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description provides the return shape ({success, copied_files_count, copied_paths}), the auth model, failure conditions, and idempotency behavior. An agent has everything needed to invoke and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single project_id parameter, so the schema already documents the parameter fully. The description adds no syntax or format detail beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states specific verbs and resources: syncing KB data into a git backup directory, creating a commit, and pushing to origin. It is immediately distinguishable from sibling tools like journal_commit_upgrades or admin_refresh_session_context because it names the exact backup/git-push behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use: 'Use after a batch of KB writes to get changes off-machine.' This tells the agent when the tool is appropriate. However, it does not name alternatives or explicitly state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admin_get_profileA
Return the user profile stored in the Knowledge Base. The profile helps AI agents understand the user's context, role, preferences, and goals. Read-only; no side effects, auth, or rate limits. Returns existence status, full content, list of missing required sections, and a hint for new users. Use at session start to understand who you're working with.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so well: it declares the operation read-only with no side effects, no auth requirement, and no rate limits, and it enumerates the return payload (existence status, full content, missing required sections, new-user hint). This is exactly the behavioral context an agent needs before calling a 0-parameter read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with what the tool returns before the when-to-use guidance. Every sentence adds information, though the safety sentence ('Read-only; no side effects, auth, or rate limits') is slightly list-like and could be folded into the purpose statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description compensates by describing both the side-effect profile and the shape of the response, including the existence/missing-sections case. Nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate and the baseline of 4 applies. The description correctly does not waste words on parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Return the user profile stored in the Knowledge Base,' and clarifies what a profile contains (context, role, preferences, goals). The purpose is unambiguous, but it does not differentiate itself from nearby siblings such as admin_overview or admin_refresh_session_context, which an agent could plausibly confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use at session start to understand who you're working with' gives explicit timing and intent for invocation. It stops short of naming when NOT to use it or pointing to an alternative tool for related needs (e.g., admin_refresh_session_context).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admin_onboard_agentA
Write or update the kontexta workflow rules block in a project's agent context file(s). Idempotent: uses fenced markers + version to skip no-op writes.
MANDATORY: This tool modifies project configuration files. You MUST seek explicit user consent before calling this tool. Set 'confirm: true' only after the user has agreed.
PARAMETERS:
project_id: number, required.
confirm: boolean, required. Must be true to proceed.
files: string[], optional. Paths relative to project root. For update mode, defaults to recommendation.target_files. Ignored when files is empty AND target_agent is provided (create mode).
target_agent: enum claude-code | codex | gemini | cursor | continue | aider | cline | copilot | generic. Required when files is empty AND no context file currently exists. Picks the canonical filename and the starter scaffold.
hooks: boolean, optional. With target_agent set, also enables that agent and installs its conversation-capture hooks (npx/source installs) or returns the host docker command (Docker). Ask the user before setting it.
RETURNS: { written: [{ path, action: created|updated|skipped, version }], skipped: [{ path, reason }], hooks_install?: { agent, mode, enabled, outcome?, docker_command?, note?, error? }, hooks?: { install_mode, alerts, prompt } }
| Name | Required | Description | Default |
|---|---|---|---|
| files | No | Project-relative paths to update; defaults to detected context files | |
| hooks | No | With target_agent, also enable that agent and install its conversation-capture hooks (npx/source) or return the host docker command. Ask the user first. | |
| confirm | Yes | MANDATORY: Set to true only after obtaining explicit user consent to modify context files. | |
| project_id | Yes | Project ID returned from register_project | |
| target_agent | No | Required when files is empty AND no context file exists. Picks the canonical filename + scaffold. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses idempotency (fenced markers + version skip no-op writes), that this is a mutation of project config files, the mandatory user-consent requirement, and that hooks install conversation-capture tooling or return a docker command. It omits permission scope and failure/partial-write behavior, so 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, followed by the idempotency trait and then the mandatory-consent warning, so the most important constraints come early. The RETURNS block is useful given no output schema, though confirm semantics are repeated in both description and schema, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex, 5-parameter mutating tool with no annotations and no output schema, so the description must do a lot. It covers consent, idempotency, mode conditions, and even an explicit RETURNS shape, leaving it nearly complete; only permission scope and edge-case failure handling are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters, and the baseline is 3. The description adds marginal framing (update mode defaults to recommendation.target_files; target_agent is ignored/required under stated conditions) but does not add syntax or value detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Write or update the kontexta workflow rules block in a project's agent context file(s).' This is far more specific than the generic files_update sibling, so an agent can infer the distinct scope. It stops short of explicitly naming or contrasting a sibling alternative, so it lands at a strong 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides mode-level guidance (update mode vs create mode, when files is empty, when target_agent is required) and a mandatory consent step, which implies correct usage. However, it never states when to choose this tool over files_update or admin_transfer_agent_context, so the guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admin_overviewA
Vault-state snapshot. mode: 'stats' = aggregate counts for a scope: file_count, untagged_count, favorite_count, top_tags. With project_id omitted (everything), also returns by_project breakdown. include_token_total: true stat()s every matching file on disk to compute a body-size estimate, measurably slower on large vaults; default false. mode: 'whats_new' = list files created or modified since a checkpoint (since, REQUIRED for this mode, ISO-8601 like 2025-01-15T00:00:00Z or relative durations like 1h/7d/2w; invalid formats throw); CAVEAT: hard-deleted files are NOT surfaced, only mtime-driven changes. Both modes: project_id: null = KB only; omit = everything. Read-only; no side effects, auth, or rate limits. Use stats as a cheap dashboard or to spot untagged content for cleanup (for live disk-vs-index drift use files_diff_against_disk); use whats_new at session start to catch up.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Which snapshot to return. 'whats_new' requires `since`. | |
| limit | No | mode='whats_new' only: max files returned. Default 200. | |
| since | No | REQUIRED for mode='whats_new'. ISO 8601 timestamp or relative duration (e.g. "1h", "7d", "2w"). | |
| top_tags | No | mode='stats' only: how many top tags to return (default 10) | |
| project_id | No | Filter to a single project. Pass null for KB-only. Omit for everything. | |
| include_tags | No | mode='whats_new' only: attach tags[] to each file. Default true. | |
| include_token_total | No | mode='stats' only: if true, stat every matching file on disk to compute total est_tokens. Default false (cheap). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does: 'Read-only; no side effects, auth, or rate limits', a performance warning that include_token_total stat()s every file and is 'measurably slower on large vaults', a correctness caveat that hard-deleted files are NOT surfaced, and a throw-on-invalid-format behavior. This is materially beyond what a schema could convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the resource then branches by mode, and every sentence carries information (defaults, caveats, routing). It is dense with backtick-quoted identifiers and layered clauses, so it reads more like compact reference notes than clean prose, but there is little genuine filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description fully compensates: it names the returned fields per mode, the perf tradeoff of include_token_total, the whats_new deletion caveat, and the auth/rate-limit profile. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real cross-parameter meaning: mode-dependent applicability of since/limit/include_tags/include_token_total, the ISO-8601 vs relative-duration accepted formats, and the null-vs-omit distinction for project_id. Slightly redundant on the since-required point already stated in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a precise noun for the resource ('Vault-state snapshot') and then enumerates the two modes and the exact fields each returns (file_count, untagged_count, top_tags, by_project). An agent can distinguish it from files_list, files_diff_against_disk, and other admin tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use for both modes ('cheap dashboard or spot untagged content for cleanup', 'use whats_new at session start to catch up') and names the alternative for the adjacent job (files_diff_against_disk for live disk-vs-index drift). Nothing 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.
admin_refresh_session_contextA
Re-read the session context (profile, upcoming events within 7d, conflicts, freshness nudge) as it stands NOW. Call this when the user just edited their profile or added/moved calendar events and you want the current picture instead of the snapshot taken at session start. Read-only; no side effects. Returns the same block Kontexta sent as MCP instructions at session start.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it declares 'Read-only; no side effects' and explains the return payload is the same block sent as MCP instructions at session start. It stops short of stating latency/cost or whether the re-read is cached, but the core safety and idempotency profile is covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action, then the trigger, then the return/safety note. Slightly redundant phrasing ('as it stands NOW' plus 'current picture') but no wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by naming the return block's contents. For a zero-param read tool, everything an agent needs to call it correctly is present; only freshness/caching semantics are left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to describe; baseline is 4. The description correctly does not invent parameters or imply filtering/config options that the empty schema does not support.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (re-read) and resource (session context), and enumerates exactly what the context block contains (profile, upcoming events within 7d, conflicts, freshness nudge). This clearly distinguishes it from the session-start snapshot behavior and from sibling admin tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger conditions ('user just edited their profile or added/moved calendar events') and the goal ('want the current picture instead of the snapshot taken at session start'). The alternative — doing nothing and using the stale snapshot — is implied and understandable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
admin_transfer_agent_contextA
COPY existing agent context files (CLAUDE.md, AGENTS.md, .cursor/rules/*.mdc, etc.) from a project's repo into Kontexta's per-project knowledge base so they're indexed by FTS5 and can be git-synced through Kontexta's own backup engine.
This tool ONLY COPIES. It never deletes or modifies the originals in your repo. After a successful transfer, the response includes the list of source paths so the user can manually remove them if desired. No tool argument, no flag, and no code path in this tool ever calls a destructive filesystem operation against project.path.
MANDATORY: This tool writes new files into Kontexta's data dir. You MUST seek explicit user consent before calling. Set 'confirm: true' only after the user has agreed.
PARAMETERS:
project_id: number, required. Project ID returned from register_project.
confirm: boolean, required. Must be true.
files: string[], optional. Project-relative paths to transfer. Omit or pass [] to transfer all detected agent context files (uses the same detection list as register_project / onboard_agent).
RETURNS: { transferred: [{ source_path, kb_id, kb_path, est_tokens }], skipped: [{ source_path, reason }], next_action } Skip reasons: "missing" | "symlink" | "outside_project" | "already_transferred_same_content" | "read_error" | "write_error".
IDEMPOTENT: re-running with the same files copies nothing if the content is unchanged, duplicate transfers are detected via SHA-256 hash comparison against existing project KB rows.
| Name | Required | Description | Default |
|---|---|---|---|
| files | No | Project-relative paths to transfer. Omit to transfer all detected context files. | |
| confirm | Yes | MANDATORY: Set to true only after obtaining explicit user consent. | |
| project_id | Yes | Project ID returned from register_project |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden and does so thoroughly: it emphasizes COPY-only, guarantees no destructive filesystem operation, explains the response includes source paths for manual cleanup, flags the consent requirement, lists skip reasons, and states SHA-256 idempotency. This is exactly the behavioral context an agent needs for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then layered guarantees, consent requirement, parameters, returns, and idempotency. Every section is labeled and earns its place, though it is on the longer side with some redundancy between the description and schema for confirm/project_id.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no annotations and no output schema, the description fully describes return shape, skip reasons, and idempotent behavior, so an agent has everything needed to call it correctly. Complete for a consent-gated mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3, but the description adds value beyond the schema: it explains the omit-vs-empty-array default for files, the source of project_id, and the consent intent behind confirm. The added nuance about transfer-all semantics is the most useful contribution.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (COPY) and resource (agent context files: CLAUDE.md, AGENTS.md, .cursor/rules/*.mdc) plus the destination (Kontexta per-project knowledge base with FTS5 indexing and git-sync). An agent can instantly tell this apart from sibling admin tools like admin_commit_backup or admin_onboard_agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly requires seeking user consent before calling and setting confirm:true only after agreement, and clarifies the default behavior (omit files to transfer all detected context files, same list as register_project/onboard_agent). It stops short of naming an explicit alternative tool or when-not-to-use condition, but the guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_entities_addA
SIDE-EFFECTFUL. Create a new tracked entity: any named thing you schedule events against (a server, a delivery van, a store location, a piece of equipment, a room, etc.). Not idempotent: a duplicate name (case-insensitive) throws. Returns {entity}. Use calendar_entities_link afterwards to record dependencies for conflict detection.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Freeform category, e.g. 'server', 'vehicle', 'location', 'equipment'. | |
| name | Yes | Unique display name for the entity (case-insensitive). | |
| notes | No | Freeform notes. | |
| timezone | No | Optional IANA timezone (e.g. 'Europe/Berlin') for display only, does not affect stored event times. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it flags SIDE-EFFECTFUL, declares non-idempotency, and specifies that a duplicate name throws — exactly the failure mode an agent needs. It omits auth/permission requirements and whether the operation is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with the critical warning (SIDE-EFFECTFUL, not idempotent) front-loaded; no filler and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param creation tool with no output schema, the description covers the essential: what it creates, the side effect, the duplicate-name failure, the return shape `{entity}`, and the follow-up call. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema, making 3 the baseline. The description restates the case-insensitive uniqueness constraint on `name` rather than adding new semantic detail about `kind`, `notes`, or `timezone`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new tracked entity') and defines the concept with concrete examples (server, delivery van, store location, room) so an agent knows exactly what qualifies. It is clearly distinguishable from calendar_entities_update/delete/list/link siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent forward: 'Use `calendar_entities_link` afterwards to record dependencies for conflict detection.' This tells the agent the tool is a prerequisite step in a workflow, but it does not state when NOT to use it (e.g. when the entity already exists, or as an alternative to update).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_entities_deleteA
DESTRUCTIVE. Permanently delete an entity AND cascade-delete every event and link attached to it. Not idempotent: deleting an unknown id throws. Returns {success, deleted_events, deleted_links}. To deactivate without losing history, use calendar_entities_update with active: false instead.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity id to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so well: it discloses irreversibility ('Permanently delete'), non-idempotency ('deleting an unknown id throws'), the cascade side effect on events and links, and the response payload. These are exactly the traits an agent needs to reason about before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences with zero waste; the destructive warning is front-loaded and capitalized so it cannot be skimmed past. Each subsequent sentence adds a distinct fact (cascade, idempotency, return shape, alternative) rather than repeating itself.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description still specifies the return shape ({success, deleted_events, deleted_links}), which closes that gap. For a single-parameter destructive tool with no annotations, the only unaddressed area is authorization or permission requirements, a minor omission against otherwise thorough coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter exists and the schema documents it at 100% coverage ('Entity id to delete.'), so the schema does the heavy lifting. The description reinforces which id is targeted and notes that unknown ids throw, adding a small amount of meaning beyond the schema, but does not specify id format or where ids come from.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete an entity') and immediately scopes it with cascade semantics ('AND cascade-delete every event and link attached to it'). This clearly distinguishes it from calendar_events_delete and calendar_entities_update, which an agent can tell apart without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative ('To deactivate without losing history, use `calendar_entities_update` with `active: false` instead') and the condition under which that alternative should be chosen. When-to-use and when-not-to-use are both present with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_entities_linkA
SIDE-EFFECTFUL. Create or update a directed dependency edge between two entities (e.g. "A feeds B"), or remove one with remove: true. Idempotent, upserts the label on repeat calls; removing an absent link is a no-op. Used by calendar_events_conflicts/calendar_events_list to flag overlaps across connected entities (one hop, either direction). Returns {link} or {removed}.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target entity, name (case-insensitive) or numeric id. | |
| from | Yes | Source entity, name (case-insensitive) or numeric id. | |
| label | No | Freeform label for the relationship, e.g. 'feeds', 'depends on'. | |
| remove | No | If true, remove the link instead of creating/updating it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations, the description carries the full burden and does so well: it flags 'SIDE-EFFECTFUL' up front, discloses idempotency ('upserts the label on repeat calls'), and explains the no-op removal case ('removing an absent link is a no-op'). It also documents return shapes ('Returns `{link}` or `{removed}`'), which is exactly the behavioral context an agent needs for a mutation with no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense and front-loaded: the critical 'SIDE-EFFECTFUL' warning opens the text, and every subsequent clause adds distinct value (upsert, no-op, usage context, return shape). No padding or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param mutation tool with no annotations and no output schema, the description supplies the mutation semantics, idempotency, no-op behavior, usage context, and return values. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents from, to, label, and remove in detail. The description adds the 'A feeds B' example and the remove behavior, but this is marginal over the schema. Baseline 3 is appropriate when structured fields do the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Create or update a directed dependency edge between two entities... or remove one.' It even gives a concrete example ('A feeds B'), so an agent immediately understands the operation. It stops short of explicitly distinguishing itself from entity-level siblings like calendar_entities_add/update, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context for when the tool matters: 'Used by calendar_events_conflicts/calendar_events_list to flag overlaps across connected entities (one hop, either direction).' It also states the remove switch. However, it offers no explicit exclusions or comparison to the entity CRUD siblings, so no 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_entities_listA
Read-only; no side effects, auth, or rate limits. List tracked entities, each annotated with its outgoing and incoming dependency links. Returns {entities, count}.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter to entities with this exact `kind`. | |
| active_only | No | If true, exclude retired (active=false) entities. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden and does reasonably well: it declares read-only, no side effects, no auth requirement, and no rate limits, plus the return shape. It omits ordering, pagination, and what qualifies as a 'tracked' entity, but the safety/operational profile is unusually well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed clauses with zero filler: the safety profile leads, the operation follows, and the return contract closes. Everything earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter list tool with no output schema, the description supplies the missing return shape (`{entities, count}`) and the read-only guarantees, so an agent has enough to call it correctly. Minor gaps remain around ordering and pagination, which matter less for a small list endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents 'kind' and 'active_only' fully; the description adds no syntax, default, or semantics beyond that. Baseline 3 is correct when the schema does all the parameter work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List tracked entities') and adds a distinguishing detail: each entity is annotated with outgoing and incoming dependency links. That separates it from the sibling entity mutation tools (add/update/delete/link), though it never explicitly contrasts itself with calendar_events_list, which is the closest confusable list tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'List tracked entities' but there is no explicit when-to-use, when-not-to-use, or named alternative. An agent can infer it is the read counterpart to calendar_entities_add/update/delete, but nothing in the text routes it against calendar_events_list or the other *_list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_entities_updateA
SIDE-EFFECTFUL. Patch an existing entity's fields, including active (set false to soft-retire it without losing its history). Idempotent per patch. Returns {entity}. For a hard delete see calendar_entities_delete.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity id (from `calendar_entities_add` or `calendar_entities_list`). | |
| kind | No | Freeform category, e.g. 'server', 'vehicle', 'location'. | |
| name | No | New display name for the entity. | |
| notes | No | Freeform notes. | |
| active | No | Set false to soft-retire the entity without losing history. | |
| timezone | No | IANA timezone for display purposes (e.g. 'Europe/Berlin'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it flags SIDE-EFFECTFUL, states idempotency ('Idempotent per patch'), describes the soft-retire semantics of `active`, and gives the return shape. It omits auth/permission requirements and any rate-limit or concurrency notes, keeping 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four terse, front-loaded sentences with no filler; the side-effect warning leads and the sibling pointer trails. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description supplies the safety signal, idempotency, return shape, and the delete alternative. Missing only permission/auth context, which an agent might still need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description highlights `active`'s soft-retire behavior, but that meaning is already documented in the schema property, so it adds little beyond the structured field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Patch') plus resource ('an existing entity's fields') with the required `id` implied. It explicitly distinguishes itself from the delete sibling, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the hard-delete alternative (`calendar_entities_delete`) and states the soft-retire use case via `active`. It stops short of clarifying patch-vs-add boundaries or partial-update expectations, but the main routing decision is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_events_addA
SIDE-EFFECTFUL. Add a one-off time window (downtime, maintenance, a delivery, a shift, an inspection, etc.) to an entity. NOT idempotent: calling this twice creates two events. starts_at/ends_at must be ISO 8601 with an explicit timezone (Z or ±HH:MM), naive timestamps are rejected because their meaning would be ambiguous once stored as UTC. Returns {event}. Follow up with calendar_events_conflicts to check for overlaps.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Freeform event type, e.g. 'downtime', 'maintenance', 'delivery', 'shift'. | |
| notes | No | Optional free-text notes about the event. | |
| title | Yes | Short title for the event. | |
| entity | Yes | Entity the event applies to, name (case-insensitive) or numeric id. | |
| source | No | Freeform provenance, e.g. 'email from ops team'. | |
| ends_at | Yes | ISO 8601 timestamp with explicit timezone; must be after starts_at. | |
| starts_at | Yes | ISO 8601 timestamp with explicit timezone, e.g. '2026-08-03T02:00:00+05:30'. | |
| original_timezone | No | IANA timezone the window was originally communicated in, for display. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does so well: it flags the write as side-effectful, warns it is NOT idempotent (duplicate calls create duplicate events), and explains that naive timestamps are rejected and why. It omits permission/auth requirements and whether the target entity must already exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, each carrying distinct information; the side-effect and non-idempotency warnings are front-loaded before the parameter constraints and the follow-up pointer. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-required-parameter mutation tool with no annotations and no output schema, it covers the critical risks (duplication, timezone format, return field) and names the natural next call. It could still say more about failure modes, entity resolution, or permissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning: the timezone requirement is stated as a hard rejection rule with rationale (ambiguity once stored as UTC), and it documents the returns shape. It adds no clarification for entity, type, notes, source, or original_timezone beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a one-off time window ... to an entity') and enumerates concrete examples (downtime, maintenance, delivery, shift). An agent can distinguish it from calendar_events_update/delete/list and from calendar_entities_* without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to the sibling calendar_events_conflicts for overlap checking, and the 'one-off' qualifier implies when this tool is appropriate. It stops short of stating exclusions, e.g. that recurring schedules should not go through this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_events_conflictsA
Read-only; no side effects, auth, or rate limits. Report scheduling conflicts in a window: overlaps on the same entity (overlap), overlaps between linked entities one hop apart (linked_overlap), and gaps smaller than a minimum buffer (insufficient_buffer). Computed on demand, nothing is persisted. Buffer defaults to the calendar.min_buffer_minutes setting (0 = off); pass buffer_minutes to override for this call. Returns {conflicts, count, buffer_minutes, events_considered}. See also calendar_events_list with include_conflicts.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Window end, ISO 8601 with explicit timezone. | |
| from | Yes | Window start, ISO 8601 with explicit timezone. | |
| entity | No | Scope to one entity (and its linked neighbors), name or numeric id. | |
| buffer_minutes | No | Override the configured minimum gap between events, in minutes. 0 disables buffer checks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the read-only/no-auth/no-rate-limit profile, that results are 'Computed on demand, nothing is persisted', and the buffer default semantics (config setting, 0 = off, per-call override). This is rich behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the safety profile, then conflict types, then computation/storage behavior, then the buffer rule, then the return shape and a sibling pointer. Each sentence earns its place and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description supplies the return shape ({conflicts, count, buffer_minutes, events_considered}) and covers storage, defaults, and scoping. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by naming the backing setting (calendar.min_buffer_minutes), explaining that the default comes from it and that buffer_minutes overrides per call, and clarifying entity scoping includes linked neighbors.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Report scheduling conflicts in a window') and enumerates the three conflict categories it detects (overlap, linked_overlap, insufficient_buffer). It also distinguishes itself from the sibling calendar_events_list, so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context ('Read-only; no side effects, auth, or rate limits') and points to the alternative ('See also calendar_events_list with include_conflicts'). It stops short of an explicit rule for when to choose this tool over that alternative, so it is clear context without full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_events_deleteA
DESTRUCTIVE. Delete one event by id. Idempotent: deleting an already-absent id is a no-op. Returns {success, existed}.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Event id to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does a fair job: it flags DESTRUCTIVE explicitly and explains idempotency ('deleting an already-absent id is a no-op'), which is the kind of trait an agent cannot infer from the schema. It omits auth/permission requirements and any side effects such as attendee notifications or whether recurrence masters are affected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, zero filler, and the most consequential fact ('DESTRUCTIVE') is front-loaded. Every clause conveys distinct information: risk, operation, idempotency semantics, return shape.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter deletion tool with no annotations and no output schema, the description covers the essentials: what it does, that it is irreversible, that repeats are safe, and the return shape `{success, existed}` — which usefully compensates for the absent output schema. Only permission/prerequisite context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single `id` parameter, so the baseline is 3. The description adds only the phrase 'one event by id' — no format, range, or source for the id beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource with scope: 'Delete one event by id.' An agent can immediately tell this removes a calendar event rather than an entity or a file. It never names or contrasts against the closest siblings (calendar_events_update, calendar_events_list), so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'DESTRUCTIVE' and the single-event scope, which is enough to know this is the removal path. However, there is no explicit when-to-use, no prerequisites, and no guidance on choosing between this and calendar_entities_delete or calendar_events_update for corrections.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_events_listA
Read-only; no side effects, auth, or rate limits. List events overlapping a window (half-open: an event ending exactly at from is excluded), optionally filtered by entity/type. Set include_conflicts to also run conflict detection over the same window and attach it. Returns {events, count, conflicts?}. For conflicts alone, prefer calendar_events_conflicts.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Window end, ISO 8601 with explicit timezone. | |
| from | No | Window start, ISO 8601 with explicit timezone. | |
| type | No | Filter to an exact event type. | |
| limit | No | Max rows (default 500). | |
| entity | No | Filter to one entity, name or numeric id. | |
| include_conflicts | No | If true, also compute conflicts for `from`..`to` (both required when set) and include them in the response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it declares read-only, no side effects, no auth, and no rate limits, plus the half-open interval semantics and the return shape. It stops short of disclosing pagination/limit behavior or what a conflict record looks like, keeping it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the safety profile, then scope, then optional behavior, then the routing alternative. Four dense clauses that each earn their place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description supplies the return shape `{events, count, conflicts?}` and covers the one non-obvious edge case (half-open boundary). Everything an agent needs to call it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning beyond the schema: the half-open window semantics for `from` (an event ending exactly at `from` is excluded) and the coupling of include_conflicts to both from/to. This is real added value over the already-documented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (events) with precise scope (overlapping a window). It explicitly distinguishes itself from the sibling calendar_events_conflicts, so an agent can route between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit context for optional filtering (entity/type) and a clear alternative: 'For conflicts alone, prefer calendar_events_conflicts.' It also tells the agent when to set include_conflicts. Nothing 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.
calendar_events_updateA
SIDE-EFFECTFUL. Patch an existing event (move it, retitle it, re-home it to a different entity, etc.). The merged result is re-validated: shrinking ends_at below starts_at throws. Returns {event}.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Event id. | |
| type | No | Freeform event type, e.g. 'downtime', 'maintenance', 'delivery'. | |
| notes | No | Optional free-text notes. | |
| title | No | Short title for the event. | |
| entity | No | Move the event to a different entity, name or numeric id. | |
| source | No | Freeform provenance, e.g. 'email from ops team'. | |
| ends_at | No | ISO 8601 timestamp with explicit timezone. | |
| starts_at | No | ISO 8601 timestamp with explicit timezone. | |
| original_timezone | No | IANA timezone the window was originally communicated in, for display. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it flags SIDE-EFFECTFUL, discloses the merge-then-revalidate behavior, and names a concrete failure case (`ends_at` below `starts_at` throws), plus the return shape. It omits permission/auth requirements and reversibility, which are relevant for a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the SIDE-EFFECTFUL warning, then the operation, then the validation/return contract. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 params already fully documented by the schema, no output schema, and no annotations, the description covers the essentials: what it mutates, the validation failure mode, and the return shape. Only auth/permission context is missing, which is minor against otherwise complete coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by explaining that fields like entity/title can be patched and by describing the interaction constraint between `ends_at` and `starts_at`. It still leaves most parameter syntax (ISO formats, freeform fields) to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (patch) and resource (an existing event), and enumerates the kinds of changes allowed (move, retitle, re-home to another entity). The word 'existing' cleanly separates it from calendar_events_add and calendar_events_delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Patch an existing event', which signals this is for modifying, not creating. However, no explicit when-to-use/when-not guidance or named alternatives (e.g. add/delete) are given, and no prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_export_icsA
Read-only; no side effects, auth, or rate limits. Export events in a window as an RFC 5545 ICS calendar (UTC times, no VTIMEZONE needed) for import into Outlook/Calendar apps. Returns {ics, event_count} with the calendar text as a JSON string field.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Window end, ISO 8601 with explicit timezone. | |
| from | Yes | Window start, ISO 8601 with explicit timezone. | |
| entity | No | Filter to one entity, name or numeric id. | |
| calendar_name | No | Calendar display name (X-WR-CALNAME). Defaults to 'Kontexta Calendar'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well: read-only, no side effects, no auth, no rate limits, UTC times so no VTIMEZONE is needed. It also discloses the return shape (`{ics, event_count}` with a JSON string field), which is essential given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the safety/behavioral profile before the format and return details. Every clause earns its place; nothing is repeated from structured data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-annotation, no-output-schema read tool, the description covers safety profile, output format standard, timezone handling, intended consumer, and return shape. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters with types and semantics (ISO 8601 with timezone, entity filter, X-WR-CALNAME default). The description adds only the generic notion of a 'window' and does not extend meaning beyond the schema. Baseline 3 is correct here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: export events in a window as an RFC 5545 ICS calendar. The namespaced 'calendar_export_ics' plus the explicit output format makes it instantly distinguishable from calendar_events_list and the entity CRUD siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this is the right tool: producing an importable ICS file for Outlook/Calendar apps. It stops short of naming the alternative (calendar_events_list) for simply inspecting events, so the routing decision is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_createA
Create one or more markdown, mermaid, or HTML files in the knowledge base or project (up to 200 per call). Pass a single-element files array for the one-file case. This operation writes each file to disk and adds it to the local SQLite FTS5 index. Destination is 'knowledge' (global KB) or 'kontexta' (internal Kontexta schema file, project_id required). 'project' is REFUSED: nothing created through kxta is written into a project repo. If destination is 'knowledge', 'kind' is strictly required for md files, pick 'dictionary' (authoritative source-of-truth) or 'note' (informational snapshot); see the kind param for the rubric. No external auth required. Rate limits do not apply (local operation). Per-item failures are isolated to errors[], the rest of the batch still commits; a single-item call still reports its failure the same way. Returns {created_count, error_count, created, errors}. If a destination directory does not exist, it will be created automatically. To modify an existing file, use 'files_update' instead. Pass format='mmd' on an item to create a Mermaid diagram file (.mmd), for destination='knowledge' it's auto-routed to the KB's mermaid/ bucket (kind ignored, not required); Pass format='html' for an HTML report, destination MUST be 'knowledge' (html reports are auto-routed to the KB's html/ bucket; kind is ignored and not required for html). Format defaults to 'md'.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Files to create. Single-element array = one-file case. Max 200 per call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so richly — writes to disk AND the SQLite FTS5 index, 'project' is REFUSED, no external auth, no rate limits, auto-creation of missing directories, and per-item failure isolation (errors[] with the rest of the batch still committing). This is exactly the behavioral context an agent needs before calling a write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and batching rule, and every sentence is substantive. It is long and info-dense with somewhat sprawling ordering (returns shape and directory auto-creation sit mid-paragraph), so it is not maximally tight, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers creation side effects, destination constraints, format routing, failure semantics, and even the return shape ({created_count, error_count, created, errors}). An agent has everything needed to invoke it correctly across the batch and single-file cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, yet the description adds routing semantics beyond it: format='mmd' auto-routes to the mermaid/ bucket (kind ignored), format='html' requires destination='knowledge' and routes to html/ (kind ignored), and format defaults to 'md'. The destination='knowledge' vs 'kontexta' (project_id required) distinction is clarified further than the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Create'), the resource (markdown, mermaid, or HTML files), the container (knowledge base or project), and the batching scope (up to 200 per call). It also names the sibling used for modification ('files_update'), so an agent can distinguish it from other files_* tools 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use 'files_update' to modify existing files, single-element array for the one-file case, and per-destination rules ('kind' strictly required for md to knowledge, project REFUSED). When/when-not conditions are 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.
files_deleteA
DESTRUCTIVE. Permanently delete one or more files by ID (up to 500 per call). Pass a single-element ids array for the one-file case. KB files are unlinked from disk AND removed from the FTS5 index; project reference files only have their index entry removed (the file on disk is left alone so the watcher does not fight your editor). Not idempotent: deleting an unknown ID surfaces as a per-item error. No external auth or rate limits. Per-ID failures are isolated to errors[] and the rest of the batch still commits: partial success is the norm, always inspect error_count. Returns {deleted_count, error_count, deleted, errors}. Use only when the file is truly obsolete; to deprioritise without losing data, untag (tags_remove) or unfavorite (tags_set_favorite) instead. To preview the set before deleting, run files_list with the same filter and confirm the IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | File IDs to delete. Single-element array = one-file case. Max 500 per call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so: it discloses permanence, the KB-vs-project disk/index asymmetry, non-idempotency with per-item errors on unknown IDs, absence of external auth or rate limits, per-ID failure isolation, and the partial-success norm. This is far beyond what a bare schema could convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is dense and front-loaded with the DESTRUCTIVE warning and the core action, and nearly every sentence carries operational weight. It is on the long side, but for a destructive batch tool the length is largely earned rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description still supplies safety profile, per-class behavior, failure semantics, and the response shape `{deleted_count, error_count, deleted, errors}`. An agent has everything needed to call it correctly and interpret partial failures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `ids` parameter is fully documented including minItems/maxItems, so the baseline is 3. The description restates the single-element-array convention and the 500 cap, adding convenience but little new syntax or format meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Permanently delete one or more files by ID (up to 500 per call).' It also distinguishes the two file classes (KB files vs project reference files) and their differing delete semantics, so it is clearly separable from siblings like files_update or tags_remove.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'Use only when the file is truly obsolete' gating, two named alternatives for the deprioritise case (tags_remove, tags_set_favorite), and a preview workflow via files_list with the same filter. When-to-use, when-not, and alternatives are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_describeA
Return everything ABOUT a file without pulling its content (no token cost from the body). Tags, size, est_tokens, history depth, related-file ids, backlinks, project, folder, last edited. Operates locally with no auth or rate limits. Use this when you'd otherwise chain files_read + tags_list + files_get_history + files_find_related just to decide whether to actually read the file. Parameters: 'id' must be a valid integer file ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | File ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses no token cost from the body, local execution, and no auth or rate limits, and enumerates exactly what fields are returned. It does not cover error behavior or edge cases (e.g., missing/invalid IDs), which keeps it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core benefit and the body-cost rationale before the detail. The field enumeration, behavioral traits, usage rule, and parameter note each contribute, though the field list is dense enough that it could be trimmed slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must convey the return shape — and it does by listing tags, size, est_tokens, history depth, related ids, backlinks, project, folder, and last edited. Cost, auth, and usage context are also covered, leaving it essentially complete for a single-parameter metadata tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter is already documented, and the description mostly restates it ('id' must be a valid integer file ID). The only added nuance is the 'integer' constraint versus the schema's declared type 'number', which is marginal value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — 'Return everything ABOUT a file without pulling its content' — with the crucial scope boundary (metadata, not body) front-loaded. It clearly distinguishes itself from files_read and the other chained siblings, so an agent can tell them apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names when to use it ('when you'd otherwise chain files_read + tags_list + files_get_history + files_find_related') and the decision it supports ('just to decide whether to actually read the file'). The alternative tools and the condition selecting this one are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_diff_against_diskA
Diagnose drift between one file's disk content and its FTS index. Status is one of in_sync, diverged, disk_unreadable, or no_index_row. On divergence returns sizes, line counts, the first divergent line number, and the disk vs index sample for that line: NOT a full diff (use files_get_diff for full diffs between commits). Read-only; no side effects, auth, or rate limits. Use when search results look stale; if status is diverged or no_index_row, run projects_refresh_index to fix.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | File ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it declares the tool is read-only with no side effects, no auth, and no rate limits, and enumerates all four possible status outcomes plus exactly which fields are returned on divergence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tightly packed sentences, front-loaded with purpose, then return shape, then the read-only caveat, then usage routing. 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the status enum and the divergence payload in detail. Combined with the routing advice to projects_refresh_index, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter file_id has 100% schema coverage, so the schema already documents it. The description adds no syntax, format, or constraint details beyond what the schema provides; baseline 3 applies 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: "Diagnose drift between one file's disk content and its FTS index." It immediately distinguishes itself from the sibling files_get_diff by explicitly saying it returns diagnostics, not a full diff.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ("Use when search results look stale"), explicit follow-up action ("if status is diverged or no_index_row, run projects_refresh_index"), and an explicit alternative for the overlapping case (files_get_diff for full diffs). Nothing 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.
files_get_diffA
Return the unified diff of one file between two commit hashes (typically obtained from files_get_history for the same file). Read-only; no side effects, auth, or rate limits. Order matters: commit_a is treated as the earlier side; reversing the args inverts the diff. Throws if either hash is unknown to the file's repo. Use after files_get_history to see WHAT changed, not just THAT it changed.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | ID of the file | |
| commit_a | Yes | Earlier commit hash (from get_history) | |
| commit_b | Yes | Later commit hash (from get_history) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: read-only, no side effects, auth, or rate limits, plus argument-order semantics ("reversing the args inverts the diff") and an error condition ("Throws if either hash is unknown"). This is exactly the behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return value, then behavior, then ordering, then error, then usage. Every sentence earns its place with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema or annotations exist, yet the description fully covers what is returned (unified diff), safety profile, argument ordering, failure mode, and relationship to files_get_history. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), and the description adds real meaning: commit_a is treated as the earlier side and reversing args inverts the diff. This explains ordering semantics that the schema's field descriptions only partially imply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Return the unified diff") and resource scope ("of one file between two commit hashes"). It clearly defines the range being diffed. It does not explicitly disambiguate from the sibling files_diff_against_disk, though the commit-hash scope implies the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance: "Use after `files_get_history` to see WHAT changed, not just THAT it changed," and notes the hashes are typically obtained from that tool. It gives clear context but names no alternatives/exclusions to route away from.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_get_historyA
Return the git commit history for one file (newest first), each entry with hash, message, date, and author. Reads the file's owning repo: the project's git repo for project files, the KB backup repo for KB files. Read-only; no side effects, auth, or rate limits. Returns {file_id, path, history}; an empty array means the file has not been committed yet. Use to understand a file's evolution before editing or restoring. Pair with files_get_diff to see exact line changes; use files_restore to roll back.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | ID of the file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full behavioral burden and does so: it declares read-only, no side effects, no auth, no rate limits, and clarifies which repository is read (project git repo vs KB backup repo). It also explains the empty-array case, which is a meaningful edge condition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core behavior and return shape, then adds behavior, then usage routing. Every sentence contributes something (return contract, repo resolution, safety profile, empty-result meaning, sibling routing) with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies the return envelope (`{file_id, path, history}`), the entry shape, and the empty-array semantics. For a single-parameter read tool, nothing an agent needs to call or interpret it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema coverage is 100%, so the schema already documents file_id fully. The description adds mild interpretive value by explaining that the owning repo is resolved from the file (project vs KB), but adds no format or constraint details beyond that. Baseline 3 applies 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Return the git commit history for one file'), plus ordering ('newest first') and the per-entry fields (hash, message, date, author). An agent can immediately distinguish this from files_get_diff or files_restore 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the use case ('understand a file's evolution before editing or restoring') and routes to two named siblings with their conditions: files_get_diff for exact line changes, files_restore to roll back. Both when-to-use and alternatives are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_listA
List file metadata with optional filters (project_id, tag, favorite, folder, untagged, kind) and pagination. Read-only; no side effects, auth, or rate limits. Each row is annotated with tags, est_tokens, size_bytes, and content_class; the response includes total_est_tokens so you can budget before reading bodies. project_id: null returns ONLY Knowledge Base files; omit the field to span everything; kind narrows to one content class. Use to browse known structure; for keyword/content lookup use files_search; for a denser whole-vault dump use projects_map.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Filter by tag name | |
| kind | No | Filter by content class. dictionary = authoritative KB, note = informational KB, journal = time-log, project = project file. | |
| limit | No | Maximum number of results | |
| folder | No | Filter by folder path | |
| offset | No | Offset for pagination | |
| favorite | No | Filter by favorite status | |
| untagged | No | If true, return only files that have no tags. Useful for bulk-tagging workflows. | |
| project_id | No | Filter by project ID. Pass null to list ONLY Knowledge Base files (project_id IS NULL). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it declares read-only, no side effects, no auth, no rate limits, and describes the response shape (per-row tags/est_tokens/size_bytes/content_class plus total_est_tokens for budgeting). It stops short of stating pagination defaults or result ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then behavior, then parameter nuances, then usage routing — a logical order with no filler. It is dense with semicolon-joined clauses, so slightly more packed than an ideal single-purpose blurb.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter read tool with no output schema, the description covers the returned row fields, the budgeting token total, filter semantics, and alternatives. Minor gaps remain around pagination limits/ordering, but nothing that would cause a wrong call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning the schema lacks: the distinction between 'project_id: null' (KB-only) and omitting the field (span everything), and that kind narrows to a single content class. It adds cross-parameter semantics rather than restating field docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List file metadata') plus the scope of its optional filters, and explicitly separates itself from files_search and projects_map. An agent can identify the tool's role 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: 'Use to browse known structure; for keyword/content lookup use files_search; for a denser whole-vault dump use projects_map.' Names both alternatives and the condition that selects each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_moveA
Move/rename a KB file (project-repo files are refused). Destination 'new_path' must be absolute and resolve INSIDE the file's owning project or global knowledge directory. Cross-project moves are rejected. Alternative: pass kind='dictionary'|'note' (with no new_path) to move a KB file into the mirrored path in the other class tree, subfolder path is preserved. Operates locally with no auth or limits.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Move the file to the mirrored path in the other class tree. Subfolder path is preserved: knowledge/dictionary/slt/ids.md ↔ knowledge/notes/slt/ids.md. Ignored if `new_path` is also provided. | |
| file_id | Yes | File ID | |
| new_path | No | Absolute destination path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses authentication ('no auth or limits'), the local operation scope, and the path-resolution constraints. It does not state overwrite behavior or what happens to an existing file at the destination, leaving one behavioral gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then layers constraints and the alternative mode in a compact four-sentence block. Dense but every sentence adds actionable information; only the parenthetical examples could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema or annotations exist, and the description covers constraints, both calling modes, and auth/limit behavior sufficiently for correct invocation. Only destination-collision/error semantics are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% so baseline is 3, but the description adds meaning beyond the schema by specifying that new_path 'must be absolute and resolve INSIDE the file's owning project or global knowledge directory' and clarifying the kind-mode semantics (subfolder path preserved).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Move/rename a KB file') and immediately scopes it with the constraint that project-repo files are refused. An agent can distinguish this from files_create/files_update/files_delete without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not conditions (project-repo files refused, cross-project moves rejected) and an explicit alternative calling mode (pass kind='dictionary'|'note' with no new_path to move into the mirrored class tree). The when-to-use and when-not are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_readA
Read one or more files, in full or in part. Modes: single-by-id (id), single-by-path (path, absolute on-disk path, must be exactly as indexed), batch-by-id (ids, up to 200), partial-by-heading (id+section), partial-by-line-range (id+lines). Exactly one of id/path/ids is required. section and lines are mutually exclusive and only valid with id (not ids or path). Read-only; no side effects, auth, or rate limits. Response shape: a single file object (with content, tags, est_tokens) for id/path; a partial-content object for section/lines; {files, total_est_tokens, error_count, errors} for ids (per-ID failures isolated, batch never partial-throws). Prefer files_describe to inspect without paying body tokens.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Single file by ID. | |
| ids | No | Batch mode: multiple file IDs (max 200 per call); returns an array plus aggregate token cost. | |
| path | No | Single file by absolute on-disk path (must match exactly what Kontexta indexed). | |
| lines | No | Partial read: 1-indexed inclusive line range. Requires `id`; mutually exclusive with `section`. | |
| section | No | Partial read: return only this heading's body (case-insensitive exact-string after trim). Requires `id`; mutually exclusive with `lines`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full disclosure burden and does so: 'Read-only; no side effects, auth, or rate limits.' It also documents batch failure semantics ('per-ID failures isolated, batch never partial-throws'), which is non-obvious behavior an agent needs before choosing a mode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then packs modes, constraints, behavioral guarantees, and response shape into dense, well-ordered sentences with no filler. It is long but nearly every clause carries an operational constraint, so little could be cut without losing routing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema provided, the description compensates by describing all three response shapes (single file object, partial-content object, and the {files, total_est_tokens, error_count, errors} batch envelope). For a 5-param, nested-object tool with no annotations, nothing needed to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds constraints the JSON schema cannot express: exactly one of id/path/ids is required, section/lines are mutually exclusive, and both are valid only with id (not ids or path). It also clarifies the path must be the exact indexed absolute path, which sharpens a fuzzy parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read one or more files, in full or in part') and enumerates every mode with the exact parameter combination that triggers it. It also distinguishes itself from a sibling by naming files_describe as the inspect-without-cost alternative, so an agent can route correctly without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each mode is tied to a concrete condition (single-by-id, single-by-path, batch up to 200, partial-by-heading, partial-by-line-range), and it explicitly routes inspection-only work to files_describe. It stops short of addressing other close siblings like files_read_outline or files_regex_search, so the guidance is clear but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_read_outlineA
Return a flat list of markdown headings for one file (level, text, line, byteStart, byteEnd). Read-only; no side effects, auth, or rate limits. Use as a cheap probe before files_read({ id, section }) or files_update({ file_id, section, content }) so you don't spend tokens on the full body just to learn what sections exist. Empty outline means the file has no markdown headings (it may still have content: fall back to files_read in full or files_read({ id, lines })).
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | File ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so: it declares read-only behavior, no side effects, no auth requirement, and no rate limits — exactly the behavioral context an agent needs. It also discloses the empty-result edge case and its different meaning (no headings versus no content).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: purpose, safety profile, then the decision guidance and fallback. The core capability and return shape are front-loaded before the routing advice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description compensates by naming the returned fields and explaining the empty-outline case. For a simple single-parameter read tool with a fully covered schema, nothing an agent needs in order to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single file_id parameter is already documented (albeit thinly as 'File ID'), which sets the baseline at 3. The description adds marginal value by using the parameter in example calls, implicitly flagging that this tool uses file_id while files_read uses id, but it doesn't explain what a file ID is or how to obtain one.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return a flat list of markdown headings for one file') and enumerates the exact return fields (level, text, line, byteStart, byteEnd). This clearly distinguishes it from siblings like files_read (full body) and files_regex_search without needing their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly positions the tool as a 'cheap probe before files_read({ id, section }) or files_update({ file_id, section, content })', naming the alternatives and the condition (avoid spending tokens on the full body). It also covers the exclusion case: an empty outline means no headings, so fall back to files_read or files_read({ id, lines }).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_regex_searchA
Match a JS regex against file bodies. Default mode scans every file in scope (project, KB, or all) and returns per-file hits with line numbers: slower than FTS files_search because it reads each file's content; use only when FTS misses substrings, URLs, or code identifiers. Pass file_id to instead scan just that one file (catches what FTS misses within a single known file); response shape changes to {file_id, path, pattern, match_count, truncated, matches}. Read-only; no side effects, auth, or rate limits. Multi-file mode capped at 500 files / 10 hits per file by default (files_truncated reports the cap); single-file mode capped at 100 hits by default, max 500. project_id/kind are ignored when file_id is set. Invalid regex throws.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter by content class before scanning. Ignored when `file_id` is set. | |
| file_id | No | Scan only this file instead of every file in scope. When set, `project_id`/`kind`/`max_files`/`max_matches_per_file` are ignored in favor of `max_matches`. | |
| pattern | Yes | JavaScript RegExp source | |
| max_files | No | Cap on files scanned (default 500). Ignored when `file_id` is set. | |
| project_id | No | Scope to one project, null for KB-only, omit for everything. Ignored when `file_id` is set. | |
| max_matches | No | Cap on returned hits in single-file mode (default 100). Only used when `file_id` is set. | |
| case_insensitive | No | If true, match pattern case-insensitively (RegExp 'i' flag). Default false. | |
| max_matches_per_file | No | Per-file hit cap in multi-file mode (default 10). Ignored when `file_id` is set. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does: read-only with 'no side effects, auth, or rate limits,' disclosed caps (500 files / 10 hits per file, 100/500 in single-file mode), the `files_truncated` cap signal, response-shape change in single-file mode, and failure mode ('Invalid regex throws'). This is unusually complete for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and the routing rule, then packs caps and mode details; every sentence carries information. It is somewhat dense with parentheticals, which slightly costs readability, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains the return shape for both modes, cap behavior, and error behavior. Combined with the 100%-covered schema, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents parameters, and the baseline would be 3. The description goes beyond by consolidating which parameters matter per mode (e.g., `project_id`/`kind` ignored when `file_id` is set) and stating the mode-dependent response shape, adding mode-selection meaning over the field-level docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Match a JS regex against file bodies') and immediately distinguishes itself from the sibling FTS tool by name (`files_search`) and by why it is slower ('reads each file's content'). An agent can tell it apart from `files_search` without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: 'use only when FTS misses substrings, URLs, or code identifiers,' naming the alternative (`files_search`). It also gives the distinct trigger for the second mode ('Pass `file_id` to instead scan just that one file') so the agent knows which mode to pick and when.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_restoreA
DESTRUCTIVE. Overwrite a file's current on-disk content with the version recorded at a specific git commit, then re-index FTS. The hash MUST come from files_get_history for THIS file (foreign hashes throw). The current uncommitted content is lost unless it was already committed elsewhere. The file watcher may also pick up the change before this returns. No external auth or rate limits. Returns {file_id, path, hash, success, message}. Use only to undo accidental edits or recover a known-good version.
| Name | Required | Description | Default |
|---|---|---|---|
| hash | Yes | Commit hash to restore from (from get_history) | |
| file_id | Yes | ID of the file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: DESTRUCTIVE, uncommitted content is lost, a file-watcher race condition may apply, no external auth or rate limits, and the exact return shape. This is unusually complete behavioral disclosure for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded with the DESTRUCTIVE warning, and every sentence carries distinct information (precondition, data-loss, race, auth, return shape, scope). It reads as a compact block rather than flowing prose, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations exist, yet the description supplies the return shape, the safety profile, the prerequisite, and the destructive consequences. An agent has everything needed to invoke it correctly without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantic constraints beyond the schema: hash must originate from files_get_history for this specific file, and foreign hashes throw. That constraint meaningfully changes how the agent sources the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (overwrite on-disk content with a git-commit version), names the follow-on effect (re-index FTS), and distinguishes itself from siblings like files_update, files_delete, and files_get_history. An agent can tell exactly what this does 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly scopes the use case ('Use only to undo accidental edits or recover a known-good version') and states a hard prerequisite: the hash MUST come from files_get_history for THIS file, with foreign hashes throwing. It routes the agent to the correct sibling for obtaining the input.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_searchA
Full-text (SQLite FTS5) keyword search across files. Default mode returns ranked matches with inline match_excerpt and title_highlight (no follow-up files_read needed for snippets) plus tags, est_tokens, size_bytes, content_class, and aggregate total_est_tokens. Pass include_bodies: true to instead get a single prompt-ready bundle: matched bodies concatenated into XML <document> blocks or markdown headers + fences (see format/max_tokens), capped at the token budget, files are added in rank order until the next would exceed it, the rest going to meta.skipped[]. Use include_bodies instead of files_search + N×files_read when you need several related files as one context blob. Read-only; no side effects, auth, or rate limits. Ordering: dictionary hits sort above everything else for the same query (dictionary-wins on conflict), then BM25 rank. FTS is tokenised: it WILL miss URLs, hyphenated terms, and partial substrings, fall back to files_regex_search for those. project_id: null searches only the KB; omit the field to span everything; tags[] requires ALL listed tags to match; kind narrows to one content class.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter by content class. dictionary = authoritative KB (system IDs, mappings, glossaries), note = informational KB, journal = time-log, project = project file. Omit to see all classes with dictionary-first ordering. | |
| tags | No | Filter by tags (all must match) | |
| query | Yes | Search query | |
| format | No | Bundle format when `include_bodies` is true. xml = Anthropic-recommended <document> tags (default); markdown = ## headers + fenced blocks. Ignored otherwise. | |
| rerank | No | When true, rerank search matches using local cross-encoder neural model and soft content-class arbitration. Defaults to kontexta.json search.rerank.enabled (or true if model available). | |
| favorite | No | Filter by favorite status | |
| max_tokens | No | Token budget when `include_bodies` is true (default 12000). Files added in rank order until the next would exceed; remainder go to `meta.skipped[]`. Ignored otherwise. | |
| project_id | No | Filter by project ID. Pass null to search ONLY Knowledge Base files. | |
| include_bodies | No | If true, return a single prompt-ready bundle of matched bodies instead of a match list. Response shape changes to `{bundle, meta: {included, skipped, ...}}`. Default false. | |
| check_sufficiency | No | When include_bodies is true, evaluate retrieval sufficiency with non-autoregressive decision model. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden — and it does disclose ordering semantics (dictionary-wins on conflict, then BM25), truncation behavior (rank-order fill until budget, overflow to meta.skipped[]), and that FTS tokenisation will miss URLs and substrings. It also asserts 'read-only; no side effects, auth, or rate limits'. This exceeds the annotations bar but leaves the actual return field set and sufficiency-check behavior of check_sufficiency only lightly characterized.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and default behavior are front-loaded in the first sentence, and every clause carries real information (mode switch, ordering, tokenisation caveat, filter semantics). It is however one dense wall of prose with no separation between the default-mode story, the bundle-mode story, and the filter notes, which makes it heavier to parse than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no output schema, the description supplies the missing contract: the default response shape (match_excerpt, title_highlight, total_est_tokens), the alternate shape ({bundle, meta:{included, skipped}}), defaults, and filtering semantics. An agent has enough to call it correctly and to choose between modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; most description detail (tags all-match, max_tokens default 12000, format semantics) merely restates the schema. The one genuinely additive nuance is the project_id distinction — 'null searches only the KB; omit the field to span everything' — which the schema does not spell out. Marginal net gain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+mechanism ('Full-text (SQLite FTS5) keyword search across files') and immediately distinguishes the default mode from the include_bodies mode. It also names the sibling to fall back to (files_regex_search), so an agent can differentiate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: use default mode for ranked snippets, use include_bodies 'instead of files_search + N×files_read when you need several related files as one context blob', and fall back to files_regex_search for URLs/hyphenated/partial substrings. Both the when and the alternatives are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_updateA
Rewrite a KB file (project-repo files are refused: kxta never writes into a repo). Default = full-body replacement: content becomes the entire file, triggering disk write + FTS5 re-index. Pass section to instead rewrite ONLY that heading's body (case-insensitive exact-string after trim; the heading line itself is preserved, siblings untouched), saves context budget vs resending the whole file. Throws if section is set but the heading doesn't exist (this mode will NOT create a new section, append the section text via a full-body update first). Operates locally with no external auth or rate limits. Returns the updated file metadata including new estimated token counts.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | File ID | |
| content | Yes | New content. With `section` set, this replaces just that heading's body; otherwise it becomes the entire file body. | |
| section | No | Case-insensitive exact-string heading. When set, only this heading's body is rewritten instead of the whole file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it discloses the repo-refusal constraint, the disk write + FTS5 re-index side effect, the throw-on-missing-heading behavior, that section mode will NOT create a new section, and the absence of external auth/rate limits. It even describes the return payload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the operation and default behavior lead, followed by the section mode, then edge cases and environment notes. Every sentence earns its place, though the single-block paragraph is heavy and could be broken up for scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param mutation tool with no annotations and no output schema, the description covers side effects, failure modes, environment constraints, and even the return shape (updated metadata with token counts). 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.
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 real meaning: `content` semantics depend on whether `section` is set, `section` matching is case-insensitive exact-string after trim, and the heading line/siblings are preserved. The throw condition further informs `section` usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Rewrite a KB file') and immediately distinguishes the two operating modes (full-body default vs section-scoped rewrite). It also differentiates from files_create by framing it as a rewrite and by the repo-refusal rule.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use guidance for the two modes, including the motivating benefit of `section` (saves context budget) and the failure condition. It stops short of naming a sibling alternative or a general 'when not to use update vs create' rule, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
folders_createA
Create a folder in the KB (a project_id is refused: kxta never writes into a project repo). Idempotent, creating an existing folder succeeds. Nested paths like notes/inbox create intermediates. REJECTS: empty names, null bytes, leading path separators, and any segment equal to .. (the call returns isError, no folder is touched). Side effect: a directory is mkdir'd on disk; no DB rows are written until a file lands inside. No external auth or rate limits. Returns {path, base_path}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Folder name (relative; supports nested paths via '/') | |
| project_id | No | Project ID. Pass null or omit to create the folder under the KB. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: idempotency, the exact rejection set (empty names, null bytes, leading separators, `..` segments) with the isError outcome, the disk mkdir side effect with the note that no DB rows are written until a file lands inside, and the absence of auth or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but tightly front-loaded: purpose first, then idempotency, then rejections, then side effects, then return shape. Every clause carries distinct operational information and none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema and no annotations, the description covers purpose, validation failures, side effects, and the return shape `{path, base_path}`, which is exactly what an agent needs to call this correctly. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description earns above baseline by adding semantics the schema lacks: that passing a `project_id` is actively refused (not merely ignored) and that nested-path segments are validated against `..` traversal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (create a folder in the KB) and immediately scopes it by declaring that a `project_id` is refused because kxta never writes into a project repo. This distinguishes it from siblings like folders_list, folders_delete, and files_create without requiring schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions: nested paths like `notes/inbox` are supported and create intermediates, and project_id is refused. It does not explicitly name an alternative sibling (e.g., where to put files once the folder exists), so it stops short of full when-to-use/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
folders_deleteA
DESTRUCTIVE: recursively delete a folder under the KB AND every file inside it (disk + FTS rows). REFUSES (returns isError) when project_id is supplied: deleting inside a registered project would race the file watcher and re-ingest the contents, remove project content via your editor instead. Same name validation as folders_create. Not recoverable from Kontexta after the call (only the git backup, if configured, retains it). No external auth or rate limits. Returns {success: true}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Folder name (relative) | |
| project_id | No | Project ID. Pass null or omit to delete from the KB. Project IDs are rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: destructive/recoverable semantics, the project_id refusal returning isError with the race-condition rationale, git-backup caveat, and no auth/rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads 'DESTRUCTIVE' and packs the recursion, refusal, recovery, and return-value facts into a tight paragraph with no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param destructive tool with no annotations and no output schema, the description supplies every needed fact: scope, refusal condition, irreversibility, backup caveat, and the return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds value by explaining WHY project_id is rejected (file-watcher race) and cross-references the name validation rule from folders_create, exceeding what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('recursively delete a folder under the KB AND every file inside it') with explicit scope (disk + FTS rows), which clearly separates it from folders_list, folders_create, and single-file files_delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit exclusion (refuses when project_id is supplied) plus the alternative path ('remove project content via your editor instead'), and notes the recursive scope that selects this over single-file deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
folders_listA
List folder paths under a project root (or the Knowledge Base when project_id is null/omitted). Returns {folders: string[], base_path} where folders are RELATIVE to base_path. Read-only; no side effects, auth, or rate limits. Throws if project_id references an unknown project. Use to discover where to drop a new file via files_create's folder argument or to navigate vault structure; to actually create one use folders_create.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | Project ID. Pass null or omit to list KB folders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so: it declares read-only status, absence of side effects, no auth requirement, no rate limits, and the specific failure mode ('Throws if project_id references an unknown project'). It also describes the return payload shape and the relative-vs-base_path semantics, which is behavior an agent needs before chaining into files_create.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core operation, then return contract, then usage routing. No filler, and each clause carries information the agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies the return shape ({folders, base_path}) and the crucial relative-path caveat, plus error behavior and usage routing. Nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents that null/omitted project_id lists KB folders, so the description largely restates it. It adds only the error condition for an unknown project id, which is more behavioral than parametric. 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('folder paths') with explicit scope ('under a project root or the Knowledge Base when project_id is null/omitted'). It is immediately distinguishable from siblings like folders_create, folders_delete, and files_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names two use cases ('discover where to drop a new file via files_create's folder argument' and 'navigate vault structure') and routes creation to the alternative tool: 'to actually create one use folders_create.' This is a textbook when-to-use plus alternative pointer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hands_confirmA
Approve and EXECUTE a previously-issued Hands invocation by its single-use approval token. The token is returned by any confirm-required Hands tool; tokens expire after 60 seconds and CANNOT be reused. Side effect equals whatever the underlying Hand does: this can be highly destructive (running arbitrary shell commands, modifying files, etc.), so only call when the user has authorised the pending action. The token IS the auth (no external auth, no rate limits). Invalid, expired, or already-consumed tokens return an inert text response, NOT an error.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | The approval token from the pending response |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: token is single-use, tokens expire after 60 seconds, side effects mirror the underlying Hand and can be highly destructive, the token itself is the auth (no external auth, no rate limits), and invalid/expired/consumed tokens yield an inert text response rather than an error. This is unusually 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then layers prerequisites, risk, and failure semantics in four tight sentences. No filler; every clause adds decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema tool this covers what an agent needs: prerequisite (a pending approval token), timing (60s expiry), risk profile (destructive potential), auth model (token is auth), and failure behavior (inert text, not error). Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single token parameter, so baseline is 3. The description goes beyond the schema by explaining the token's origin (returned by confirm-required tools), its lifetime (60s), and its single-use nature, all of which affect how and when the parameter is passed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (approve and EXECUTE) plus the exact resource (a previously-issued Hands invocation) and the mechanism (single-use approval token). This clearly separates it from siblings like hands_list and hands_reload, which do not execute anything.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the source of the token (any confirm-required Hands tool) and the condition for calling: 'only call when the user has authorised the pending action.' The when-not case is implied by that constraint. It doesn't name an alternative tool, but none exists for this execution step, so the guidance is effectively complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hands_listA
List every Hands command tool currently registered, with project scope, tool name, danger level, confirmation flag, and description. Hands tools come from per-project kontexta.json files loaded at register time. Pass schema: true to instead get the complete kontexta.json authoring reference (JSON schema, validation rules, security guarantees, limitations, annotated example), a static document, unrelated to any specific registered hand. Read-only; no side effects, auth, or rate limits. Use the default list mode to discover what side-effectful project commands the agent is permitted to run; use schema: true when helping a user write or fix a kontexta.json; reload after editing one with hands_reload.
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | If true, return the kontexta.json authoring reference document instead of the registered-hands list. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it declares read-only, no side effects, no auth, no rate limits, and explains data provenance (per-project kontexta.json loaded at register time). It also discloses that schema mode returns a static document unrelated to any registered hand, a non-obvious behavioral trait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the default mode returns, then the schema-mode override, then safety notes and routing. Dense and mostly waste-free, though the parenthetical enumeration of schema contents is long and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, yet the description enumerates the returned fields for list mode and characterizes the schema-mode payload, so an agent knows what it will receive. Safety, provenance, and routing are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: that the schema output is a static authoring reference (JSON schema, validation rules, security guarantees, limitations, example) and is unrelated to any specific registered hand, plus motivation for when to set it true.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('List every Hands command tool currently registered') and enumerates the projected fields (project scope, tool name, danger level, confirmation flag, description). It also distinguishes the dual mode from siblings like hands_reload and hands_confirm by naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes usage: default mode to discover side-effectful project commands, `schema: true` when helping a user author or fix a kontexta.json, and `hands_reload` after editing one. Covers when-to-use for both modes and names the follow-up alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hands_reloadA
Re-scan every registered project's kontexta.json and rebuild the live Hands tool registry: newly-declared tools become callable immediately, removed tools disappear from tools/list. SIDE EFFECT is on the running MCP session's tool inventory only (no disk writes). Idempotent. No external auth or rate limits. Takes no parameters. Returns per-project load results (counts of registered/disabled tools and any validation warnings). Use after editing a kontexta.json mid-session; for the schema see hands_list({ schema: true }).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the side effect scope (running session's tool inventory only, no disk writes), idempotency, absence of external auth/rate limits, and the shape of per-project load results including validation warnings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the action and its effect come first, then side-effect/auth caveats, then invocation guidance. Every sentence adds distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description explains what is returned (per-project registered/disabled counts and validation warnings), and covers side effects, idempotency, and auth, leaving nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the schema-based baseline is 4; the description confirms 'Takes no parameters', leaving no ambiguity for the agent about arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Re-scan', 'rebuild') plus resource ('registered project's kontexta.json', 'live Hands tool registry'), with the concrete consequence that newly-declared tools become callable and removed ones disappear from tools/list. It also differentiates itself from sibling hands_list by pointing to it for the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to invoke: 'Use after editing a kontexta.json mid-session', and routes schema queries to hands_list({ schema: true }). It gives clear context but no explicit when-not-to-use or contrast against siblings like admin_refresh_session_context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
journal_commit_upgradesA
After dispatching subagents to upgrade mechanical journal entries to LLM-narrative, call this with the affected task slugs. Updates journal_meta.status_latest to mark the entries as upgraded.
| Name | Required | Description | Default |
|---|---|---|---|
| task_slugs | Yes | Task slugs whose entries were upgraded by subagents. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It helpfully discloses the mutation target (journal_meta.status_latest) and the intent (mark entries as upgraded), but says nothing about idempotency, error handling for unknown slugs, or required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first front-loads the trigger condition, the second states the effect. Every phrase earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation tool with no output schema and no annotations, the description covers purpose, trigger, and effect adequately. Minor gaps around idempotency/permission behavior keep it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single task_slugs parameter is already documented in the schema. The description adds only framing ('affected task slugs'), so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb-plus-resource ('commit upgrades' for journal entries) and states the resulting effect on journal_meta.status_latest. An agent immediately understands the operation. It does not, however, distinguish itself from siblings like journal_write, journal_status, or journal_distill.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear triggering condition: call this 'after dispatching subagents to upgrade mechanical journal entries to LLM-narrative.' That is a genuine when-to-use instruction. It stops short of naming alternatives or exclusions (e.g., what to do if no subagents ran).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
journal_distillA
Run the distillation pipeline: read raw events since the high-water mark, group by topic, write mechanical markdown entries, advance high-water. Idempotent. Auto-provisions a project row for orphan slugs (e.g. default) that have no registered project yet.
| Name | Required | Description | Default |
|---|---|---|---|
| max_events | No | Maximum raw events to process per run (default 200, max 2000). | |
| project_slug | No | Project slug to distill. Defaults to the current active project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it discloses the high-water read, topic grouping, mechanical markdown writes, high-water advancement, idempotency, and auto-provisioning of project rows for orphan slugs. It still omits permissions, partial-failure behavior, and whether raw events are retained or deleted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences with no filler: purpose first, then the key idempotency trait, then the auto-provisioning side effect. Every sentence adds actionable information for selecting and calling the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-annotation pipeline tool, the description is nearly complete: it explains the pipeline steps, idempotency, and project-row provisioning. It lacks return-value expectations and failure-mode details, which is a gap given there is no output schema, but the core invocation context is well covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both max_events and project_slug are already documented. The description adds only behavioral context around orphan slugs (e.g. 'default') rather than new parameter-level meaning, matching the baseline of 3 when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — running the distillation pipeline — and details the internal sequence: read events since high-water, group by topic, write entries, advance high-water. This operationally distinguishes it from sibling journal tools like journal_write (manual entry) and journal_housekeep (cleanup), so an agent can identify its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by explaining the pipeline's function, so an agent can infer it is for distilling journal events. However, it never states when to choose this over alternatives such as journal_write or journal_housekeep, nor does it give prerequisites or when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
journal_housekeepB
Run journal retention/archival for a project. Idempotent. Prunes old raw .jsonl files and archives cold tasks per the configured retention policy.
| Name | Required | Description | Default |
|---|---|---|---|
| project_slug | No | Project slug to housekeep. Defaults to the current active project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose two meaningful traits: idempotency (safe to re-run) and destructiveness ('prunes old raw .jsonl files'). However, it omits whether pruning is reversible, what 'the configured retention policy' is or how it is set, and any permission requirements for a destructive maintenance operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero filler. The operation is front-loaded, and the destructive scope is stated immediately after rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema tool with full schema coverage, the definition covers the essentials, including the two most important behavioral facts (idempotent, prunes files). The remaining gap is the retention-policy configuration and irreversibility details, which are minor given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already documents itself, including the default to the current active project. The description only gestures at project scope ('for a project') without adding format or behavioral detail beyond 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Run journal retention/archival for a project') and then concretizes it with the actual effects: pruning old raw .jsonl files and archiving cold tasks. That is far more informative than a tautology, but it never names or contrasts the adjacent journal tools (journal_distill, journal_status, journal_commit_upgrades), so an agent must infer the boundary itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance: nothing says whether this should run on a schedule, after commits, or only when storage pressure exists, and no conditions or exclusions are stated. 'Retention/archival' implies a maintenance context, but that is inference rather than explicit instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
journal_statusC
Report the journal backlog and high-water mark for a project.
| Name | Required | Description | Default |
|---|---|---|---|
| project_slug | No | Project slug to check. Defaults to the current active project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'Report' implies a read-only operation, but the description says nothing about permissions, side effects, cost, or whether the call touches or mutates the journal. For a tool with zero annotation coverage, this leaves the agent guessing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, and the resource is named before the qualifying scope. It is efficient, though borderline under-specified rather than genuinely well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description is responsible for telling the agent what comes back, and it does not explain what a 'backlog' figure or 'high-water mark' actually represents or how it is formatted. Combined with the absence of annotations, the definition is too thin to let an agent interpret or act on the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is only one optional parameter (project_slug, documented as defaulting to the current active project), so the schema already does the heavy lifting. The description adds no meaning beyond it, which is the baseline 3 case for a fully documented single parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Report') and a resource pair ('journal backlog and high-water mark for a project'), so the agent knows this is a read/diagnostic operation rather than a write. It does not, however, differentiate itself from the other journal_* siblings (journal_write, journal_housekeep, journal_distill, journal_commit_upgrades), and 'high-water mark' and 'backlog' are domain jargon left undefined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to call this versus journal_write, journal_housekeep, or journal_distill, and no prerequisites or conditions are stated. The agent must infer usage purely from the name and the one-word verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
journal_writeA
Write one event to the current project's journal. kind: 'append' = timestamped entry in today's daily journal file in the Knowledge Base (creates the file if it doesn't exist; both calls on the same calendar day return the same file_id; returns {file_id}). kind: 'note' = free-form decision/abandonment/observation, stored as an agent_note event in Layer 1 (surfaces in distilled task entries; returns {ok, recorded_at}). kind: 'intent' = topic/intent pivot, use when the user redirects what you're working on so the distillation step splits task buckets correctly (returns {ok, recorded_at}). Required fields depend on kind: 'append'/'note' need text; 'intent' needs summary.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Event kind. Selects which body fields are required and how the event is stored. | |
| tags | No | Optional for kind='note'. Tags for the note. | |
| text | No | Required for kind='append' or kind='note'. Body of the entry. | |
| summary | No | Required for kind='intent'. One-line summary of the new intent. | |
| project_id | No | Optional for kind='append'. Project ID context. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses file auto-creation, that same-day appends return the same file_id, the storage layer for notes (Layer 1 agent_note events), and the return shapes for each mode. It omits auth/permission requirements and error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose followed by kind-by-kind breakdown, with return values parenthesized inline so the agent can scan quickly. It is dense and fairly long, but nearly every clause carries useful information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly supplies return shapes per mode, and with no annotations it also covers storage semantics and file behavior. This is sufficient for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents each field's per-kind requirement. The description restates the kind-to-required-field map and adds what each kind semantically means, but adds little about parameter syntax or formats beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Write one event to the current project's journal') and then enumerates the three distinct modes with what each one does and stores. This clearly separates it from sibling journal tools like journal_distill, journal_status, and journal_housekeep.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives mode-specific selection guidance, notably the explicit 'use when the user redirects what you're working on' condition for kind='intent'. It does not, however, state when not to use this tool or name alternative siblings for capturing information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
projects_listA
List every registered project with id, name, absolute path, and a derived has_hands flag (true when the path exists on disk AND contains a kontexta.json). Read-only; no side effects, auth, or rate limits. Use to find the project_id to pass to scoped tools (files_search, files_list, admin_commit_backup, projects_refresh_index, etc.). To register a new project use projects_register; to inspect its Hands tools use hands_list.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does so well: it declares read-only, no side effects, no auth, no rate limits. It also discloses the derivation logic behind `has_hands`. It stops short of describing ordering/pagination or volume, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what it lists and its key output field, followed by behavior, then routing guidance. Three tight sentences, each earning its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description compensates by enumerating the returned fields and the derivation rule for the derived flag, and it covers the safety profile. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero input parameters, so the baseline is 4. The description adds value by explaining the meaning of the derived `has_hands` output flag rather than leaving it opaque, though it does not discuss any return-shape nuances beyond field names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (every registered project) and enumerates the exact fields returned, including the derived `has_hands` flag with its derivation rule. It explicitly distinguishes itself from `projects_register` and `hands_list`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the primary use case explicitly ('to find the project_id to pass to scoped tools') and names concrete downstream tools, then states when to use alternatives (register with `projects_register`, inspect Hands tools with `hands_list`). Nothing 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.
projects_mapA
Return a compact indented outline of folders, file titles, tags, and IDs in a single dense block: substantially fewer tokens than the equivalent files_list JSON for the same scope. Read-only; no side effects, auth, or rate limits. Capped at max_lines (default 5000); the response reports est_tokens and emits a warning field if it exceeds KONTEXTA_PROJECT_TOKEN_WARN. project_id: null = KB only; omit = everything. Defaults: include_tags=true, show_titles=true. Use to orient yourself in an unfamiliar vault or project; for keyword lookup use files_search.
| Name | Required | Description | Default |
|---|---|---|---|
| max_lines | No | Hard cap on output lines (each line ≈ one folder or file). Default 5000. | |
| project_id | No | Restrict to a single project. Pass null for knowledge-base-only files. Omit for everything. | |
| show_titles | No | Show file titles instead of filenames. Default true. | |
| include_tags | No | Append #tags inline. Default true. Set false to shrink the outline. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so: it declares read-only, no side effects/auth/rate limits, discloses the max_lines cap, and reveals that the response includes est_tokens and may emit a warning field past KONTEXTA_PROJECT_TOKEN_WARN. This is unusually rich disclosure for a read tool and covers cost/truncation behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: purpose first, then behavior, then defaults, then the routing hint. Nearly every clause earns its place, though the sentence is packed enough that a reader must parse multiple clauses before reaching the 'use this when' guidance at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description discloses the return shape (indented outline, est_tokens, warning field) and the truncation cap, plus scope and default behavior. For a 4-parameter, fully-defaulted read tool, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3; the description adds value by restating defaults (include_tags=true, show_titles=true, max_lines=5000) and clarifying that project_id null means KB-only while omission means everything — a subtle distinction an agent could easily get wrong from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Return a compact indented outline of folders, file titles, tags, and IDs.' It also names the sibling it contrasts with (files_list's JSON) and explicitly distinguishes its output format from that alternative, so an agent can differentiate it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('to orient yourself in an unfamiliar vault or project') and an explicit alternative with its selecting condition ('for keyword lookup use files_search'). It further clarifies scope selection via project_id null vs omitted semantics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
projects_refresh_indexA
Reconcile the FTS index against disk. For a project (project_id set), re-runs discoverFiles. For the KB (project_id null/omitted), walks knowledge/, ingests new .md files, reindexes any whose content hash drifted, and PRUNES rows for files no longer on disk. SIDE-EFFECTFUL: writes/updates/deletes file and FTS rows (the prune is destructive on stale index rows but never deletes files from disk). Idempotent, running twice is a near no-op. Skips files >5MB and standard junk dirs (node_modules, .git, dist, build, etc.). No external auth or rate limits. Returns {scope, newly_indexed, refreshed, pruned}. Use after editing files outside Kontexta, or when files_diff_against_disk reports drift.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | Project ID. Pass null or omit to reindex the Knowledge Base. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it flags SIDE-EFFECTFUL writes/updates/deletes, clarifies the prune is destructive on index rows but never removes files from disk, notes idempotence ('running twice is a near no-op'), documents skip rules (>5MB, `node_modules`, `.git`, `dist`, `build`), and states there is no external auth or rate limiting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then scope branches, then the destructive warning in caps for scannability, then constraints and return shape. Every sentence adds an operational fact; none is filler, despite the length being justified by a no-annotation, side-effectful tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description supplies the return shape `{scope, newly_indexed, refreshed, pruned}`, covers both scope modes, states side effects and idempotence, and gives a usage trigger. Nothing an agent needs to invoke it safely and correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning beyond the schema by explaining what each branch of `project_id` does (project re-runs `discoverFiles`; KB walks `knowledge/`, ingests new .md, reindexes drifted hashes, prunes missing files). This is semantic value the schema's one-line description does not supply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Reconcile the FTS index against disk') and immediately splits behavior into two precise scopes: project (`project_id` set → `discoverFiles`) and KB (`project_id` null → walks `knowledge/`). An agent can tell exactly what this does without opening the schema, and it is clearly distinguishable from index-adjacent siblings like `files_diff_against_disk`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Ends with an explicit trigger: 'Use after editing files outside Kontexta, or when `files_diff_against_disk` reports drift.' It names the sibling tool that signals when this one is needed, and the branch semantics tell the agent which mode to select via `project_id`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
projects_registerA
Register a new project and link it to the Kontexta knowledge system.
SIDE EFFECTS: Writes project metadata to disk (persisted in the Kontexta data directory). Scans the project root recursively to discover and index all markdown files into the local database. Registers any kontexta.json-declared Hands tools found in the project root. This operation is idempotent, re-registering an existing project updates its metadata without data loss.
AUTH / RATE LIMITS: None. Operates entirely on the local file system.
PARAMETERS:
name: Human-readable project name.
path: Absolute path to the project root. Required. DO NOT guess or assume the path based on the active editor workspace unless the user explicitly asks to register the "current" or "open" project. If the user provides a project name but no path, ask them for the absolute path before calling this tool. Fails with a descriptive error if the path does not exist or is inaccessible.
description: Optional free-text description stored with the project metadata.
RETURNS: A JSON object containing:
project: { id, name, path, description, created_at }
discovered_files_count: number of markdown files indexed
discovered_files: array of { path, est_tokens, size_bytes } for each file
total_est_tokens: estimated total token cost of all discovered files
hands: { found, tools_registered, tools_disabled, warnings }
warnings: array of non-fatal issues (e.g. scan failures, token budget exceeded)
ERROR CONDITIONS: Returns isError=true if path is missing or unresolvable. Scan failures are non-fatal and reported in warnings rather than as errors.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Project name | |
| path | Yes | Absolute path to the project root. Required. DO NOT guess from the active workspace unless asked. Ask the user if unsure. | |
| description | No | Optional project description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it discloses disk writes, recursive scanning/indexing, Hands tool registration, idempotency ('updates its metadata without data loss'), and the absence of auth/rate limits. It also distinguishes fatal errors (missing path) from non-fatal scan warnings, which is exactly the behavioral detail an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Labeled sections (SIDE EFFECTS, AUTH/RATE LIMITS, PARAMETERS, RETURNS, ERROR CONDITIONS) front-load the core action and make the long content scannable. Every section conveys distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No annotations and no output schema exist, so the description must cover both behavior and returns — and it does, enumerating the return object fields and the error/warning split. For a 3-param mutation tool, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description meaningfully enriches the parameters: it specifies that path must be absolute, forbids guessing from the workspace, instructs the agent to prompt the user, and describes the failure mode. It adds real semantic value beyond the schema strings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Register a new project and link it to the Kontexta knowledge system') and the side-effects section clarifies the scope (indexing markdown, registering Hands tools), which implicitly separates it from read-only siblings like projects_list. It never explicitly names a sibling (e.g. projects_refresh_index or projects_map), so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: it tells the agent not to guess the path from the active workspace and to ask the user when only a name is given, and notes it fails on a nonexistent path. There is no explicit when-to-use-vs-alternatives routing against projects_refresh_index or projects_map, but the guidance it does provide is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resources_add_reportA
Write an image or other binary resource into the shared reports/resources/ folder. Returns { filename, size, src, url }: embed the report's / tags with src exactly as given (e.g. <img src="resources/chart.png">); it is the only form that resolves correctly both in the dashboard viewer and in PDF/PNG export. Do not use url inside report HTML: it only works in the dashboard. Bytes are passed base64-encoded.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | Requested filename with extension | |
| bytes_base64 | Yes | Base64-encoded file bytes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it delivers the key behavioral gotcha: src resolves in both dashboard viewer and PDF/PNG export whereas url works only in the dashboard. It also discloses the exact return shape and that bytes are base64-encoded. It omits overwrite behavior, size limits, and permission requirements for a write tool, keeping it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and destination, then the return contract, then the embed guidance, each in one tight sentence. No filler; every clause conveys a distinct, useful fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description enumerates the returned fields (filename, size, src, url) and explains how to consume them, which covers the return contract. For a two-required-param write tool it only leaves mutation edge cases (overwrite, limits) unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both params (filename, bytes_base64) already documented, so the schema does the heavy lifting. The description only reinforces that bytes are base64-encoded and implies filename maps to the stored resource name, adding no format or constraint detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Write), resource type (image or other binary resource), and exact destination (shared reports/resources/ folder). An agent can distinguish it from sibling write tools like files_create and resources_clip_url without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit, actionable guidance on the returned fields: embed `src` in report HTML and never use `url` because url only resolves in the dashboard. This is clear in-tool usage direction, but it never states when to choose this tool over sibling alternatives (files_create, resources_clip_url), so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resources_clip_urlA
SIDE-EFFECTFUL: fetches an EXTERNAL URL and writes a NEW KB file. Downloads the page, extracts the main article via Readability, converts to markdown, and saves it under knowledge/urlclips/. Auto-classified as content_class='dictionary' (clipped external references are treated as authoritative reference material). NOT idempotent / no de-dup: re-clipping the same URL creates a second file. AUTH: anonymous by default; pass headers (e.g. {Cookie: 'session=...'} or {Authorization: 'Bearer ...'}) to clip behind logins. Kontexta does not rate-limit but the upstream may throttle. On auth-required pages returns isError with code: AUTH_REQUIRED, optional login_url, and a hint to retry with headers. Returns {file_id, path, title, source}. Use to ingest external docs into the KB.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to clip | |
| title | No | Optional title override (defaults to the page's <title>) | |
| headers | No | Optional HTTP headers to forward with the fetch (e.g. {"Cookie": "session=..."} or {"Authorization": "Bearer ..."}). Use to clip pages behind auth walls after AUTH_REQUIRED. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: SIDE-EFFECTFUL, non-idempotent with no de-dup, auto-classification as content_class='dictionary', anonymous-by-default auth, upstream throttling caveat, and the AUTH_REQUIRED error contract with login_url and retry hint. This is exactly the behavioral disclosure a mutation tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the SIDE-EFFECTFUL warning and non-idempotency come first, then AUTH, then error/return shape. Every sentence conveys actionable facts, though the single-block density is slightly heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no annotations and no output schema, the description supplies the return shape ({file_id, path, title, source}), the error contract, auth behavior, and side-effect profile. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents url, title, and headers (including the AUTH_REQUIRED/retry-with-headers workflow). The description largely restates this, adding only the concrete header examples, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource with full mechanism: 'fetches an EXTERNAL URL and writes a NEW KB file', then enumerates the pipeline (download, Readability extract, markdown convert, save under knowledge/urlclips/). This is clearly distinguishable from siblings like files_create or resources_add_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use to ingest external docs into the KB' gives clear context, and the AUTH section explains when to pass headers (pages behind logins) after an AUTH_REQUIRED error. It lacks an explicit contrast against sibling alternatives (e.g. when to use files_create instead), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resources_delete_reportA
Delete a file from reports/resources/. No-op if it doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | Filename (relative) of the resource to delete from reports/resources/. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses idempotent behavior ('No-op if it doesn't exist'), which is real value, but stays silent on whether the delete is permanent or recoverable and on any permission requirements for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste, with the action and its scope front-loaded and the idempotency caveat immediately after. Nothing is padded or restated from the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, no-output-schema tool, the description covers purpose, scope, and the notable no-op behavior. It falls short only on the destructive-operation details (permanence, permissions) and on disambiguating itself from files_delete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is exactly one parameter and schema description coverage is 100%, so the schema already defines filename as a relative path within reports/resources/. Baseline 3 applies; the description adds no path 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and a precisely scoped resource (a file under reports/resources/), which separates it from the sibling resources_add_report. It is less clearly differentiated from files_delete, since neither the name nor the description explains when the reports-scoped variant should be preferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and the near-twin sibling files_delete is never mentioned. The 'No-op if it doesn't exist' clause implicitly signals safe repeated invocation, but the agent must infer selection between the two delete tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resources_export_reportA
Export an existing HTML report as PDF or PNG. Returns { url } for the web-served download (requires an authenticated dashboard request) by default. Set inline_bytes=true to render in-process and get { bytes_base64 } instead: only available when running via the full kontexta CLI, not the standalone kontexta-mcp package; falls back to { url } with a note if unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | File ID of the HTML report to export. | |
| format | No | Output format: 'pdf' or 'png'. | |
| inline_bytes | No | If true, render in-process and return raw bytes (base64). Only available in the full kontexta CLI bundle; falls back to {url} otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does meaningful work: it discloses the auth requirement for the URL path, the CLI-vs-standalone availability constraint on inline_bytes, and the graceful fallback with a note. It omits any mention of rate limits or permissions beyond 'authenticated dashboard request', so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and output formats, then the default return, then the opt-in variant. Three dense sentences with little waste, though the nested clauses about CLI availability make it slightly heavier than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description properly names both return shapes ({ url } and { bytes_base64 }) and their conditions. Auth, availability, and fallback behavior are all covered; only granular operational details (limits, error modes) are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents all three parameters, including the inline_bytes CLI caveat and the pdf/png enum. The description largely restates this, adding only the auth context for the URL return, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Export an existing HTML report as PDF or PNG') and is immediately distinguishable from siblings like resources_add_report, resources_list_reports, and resources_delete_report. No ambiguity about what the tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the default path (web-served { url }) and the condition that selects the alternative (set inline_bytes=true), including when that alternative is unavailable and what happens instead. It does not explicitly compare to sibling report tools, but the default-vs-opt-in routing is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resources_list_reportsA
List all files currently stored under reports/resources/. Returns filename, size in bytes, and served URL.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It discloses return values (filename, size, served URL), which is helpful, but does not state whether the operation is read-only (implied by 'List'), auth requirements, pagination, or whether it recurses into subdirectories.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with zero filler; the purpose is front-loaded and the return information follows immediately. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with no output schema, the description provides all essential information: what is listed, where, and what is returned. It is complete enough for an agent to invoke correctly, though minor ambiguities about recursion remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters (0 params), and the schema is empty. Per the rubric, 0 params yields a baseline of 4, as the description cannot add parameter meaning beyond an empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('files under reports/resources/'), and specifies the return fields. It clearly scopes to a subdirectory, distinguishing it from broader file-listing siblings like files_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives (e.g., resources_add_report, files_list). The scope implies its purpose, but there are no when/when-not statements or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tags_addA
Append tags to ONE file. Additive: existing tags are preserved; re-adding an existing tag is a no-op (idempotent per tag). New tag names auto-create rows in the global tags table. Persists to local SQLite. No external auth or rate limits. Returns {success: true}; throws if file_id is unknown. Use to label a single file. To tag every file matching a query in one call use tags_search; to remove tags use tags_remove.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | Array of tag names to add | |
| file_id | Yes | File ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so thoroughly: additive semantics, per-tag idempotency, auto-creation of tag rows, local SQLite persistence, no auth or rate limits, success return shape, and the throw condition on unknown file_id. This is unusually complete for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then behavior, then return values, then sibling routing. Dense but every sentence carries distinct information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the write semantics, idempotency, persistence, failure mode, and return shape despite no output schema, and routes to the two relevant siblings. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining what the tags parameter does semantically — additive append, idempotency, and auto-creation of unknown tag names — which the schema does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Append tags to ONE file' — the 'ONE' immediately signals this is single-file, distinguishing it from bulk tagging. Sibling tools tags_search and tags_remove are named, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Use to label a single file') plus explicit alternatives with their selecting conditions: bulk tagging via tags_search, removal via tags_remove. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tags_listA
List every tag in the global SQLite database with id, name, and applied count. Read-only; no side effects, auth, or rate limits. Returns the entire taxonomy (not paginated). Use to discover existing labels before tagging (so you reuse rather than fork) or to find tag IDs to feed into tags_remove. For tags on a specific file, use files_describe.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so: it declares read-only behavior, no side effects, no auth or rate-limit requirements, and discloses that the full taxonomy is returned unpaginated. These are exactly the behavioral facts an agent needs that the empty schema cannot supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with what it does, then usage, then the alternative. Every sentence carries distinct information with no repetition of the name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by naming the returned fields and noting the result is the complete unpaginated taxonomy. Nothing an agent needs to invoke or interpret this call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing to disambiguate. The description spends its words on return fields instead, which is appropriate for a no-argument listing tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (list), resource (tags in the global SQLite database), and the exact return fields (id, name, applied count). It explicitly distinguishes itself from siblings like tags_search, tags_suggest, and files_describe, so an agent can pick the right tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states concrete situations to use it: discovering existing labels before tagging to avoid forking the taxonomy, and finding tag IDs to feed into tags_remove. It also redirects to files_describe for file-scoped tags, giving an explicit alternative and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tags_removeA
Detach one or more tag IDs from ONE file. Destructive on the link only: does NOT delete the file or the global tag definition (orphan tags survive in tags_list). Idempotent: removing an already-absent tag is a no-op. No external auth or rate limits. Returns {success: true}. Note: takes tag IDs (integers), not names, fetch them via tags_list. To remove ALL tags from many files via a query, see tags_search (additive only), there is no bulk-untag-by-query tool.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | File ID | |
| tag_ids | Yes | Array of tag IDs to remove |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so thoroughly: link-only destruction, orphan tag survival, idempotent no-op behavior, no auth/rate limits, and the return shape `{success: true}`. This is exactly the behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, then layered with behavior, return value, and parameter guidance. Despite covering many points, each sentence conveys distinct actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description compensates fully: destruction semantics, idempotency, auth/rate limits, return value, and parameter sourcing are all covered. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real value beyond the schema by stating that tag IDs are integers rather than names and pointing to `tags_list` to obtain them, plus reinforcing the single-file scope for file_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (detach tag IDs from a file) and pins the scope to ONE file, which distinguishes it from sibling bulk/query operations. An agent can identify the action 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs the agent to fetch IDs via `tags_list`, contrasts with `tags_search` (which is additive), and clarifies there is no bulk-untag-by-query tool. Both when-to-use and the limitations are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tags_searchA
Bulk-tag: run an FTS search and append add_tags to every matching file in one call. Side effect: each match gets addTags applied (additive, idempotent per tag); the matched files themselves are NOT modified beyond their tag links. Per-file failures isolated to errors[]. No external auth or rate limits. There is NO dry-run flag, so ALWAYS run files_search with the same query first to verify the match set before tagging. The tags[] filter requires existing tags to ALL match (it scopes the search; it does not control which tags get added). Returns {matched_count, tagged_count, tags_applied, tagged_ids, errors}.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Filter, only matches that already carry ALL of these tags | |
| query | Yes | Full-text search query | |
| add_tags | Yes | Tags to add to every matching file | |
| favorite | No | If true, restrict to favorited files only. | |
| project_id | No | Scope search to a specific project. Pass null for KB-only results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses rich behavioral traits: additive and idempotent tag application, no modification beyond tag links, per-file error isolation via errors[], no external auth or rate limits, and the absence of a dry-run flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded and well-structured. Every sentence adds actionable information—purpose, side effects, failure handling, prerequisite verification, filter semantics, and return shape—without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema and no annotations, the description covers the operation, side effects, failure mode, prerequisites, filter semantics, and the exact return keys. This is complete enough for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema by clarifying that the tags[] filter requires existing tags to ALL match and that it scopes the search rather than controlling which tags get added, and it adds idempotency semantics for add_tags.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Bulk-tag: run an FTS search and append add_tags to every matching file in one call.' It clearly distinguishes the tool from siblings like files_search and tags_add by describing the combined search-and-bulk-apply operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage guidance: 'There is NO dry-run flag, so ALWAYS run files_search with the same query first to verify the match set before tagging.' This names an alternative tool and the condition under which to use it before invoking this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tags_set_favoriteA
Set or clear the favorite flag on one file (idempotent: re-setting the same value is a no-op; not a toggle, you pass the desired state). Persists to local SQLite. No external auth or rate limits. Returns {success: true}. Use to curate quick-access pins; files_list / files_search accept favorite: true to filter to the pinned set.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | File ID | |
| favorite | Yes | Favorite status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses idempotency, clarifies it is not a toggle, states persistence to local SQLite, notes no external auth or rate limits, and documents the return value `{success: true}`. This is rich context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then efficiently adds idempotency, persistence, auth, return, and discovery guidance in compact sentences. No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description covers purpose, semantics, idempotency, storage, auth constraints, return shape, and downstream usage. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema's terse 'Favorite status' by clarifying that the `favorite` parameter is the desired state ('you pass the desired state') and that re-setting the same value is a no-op, which adds semantic meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Set or clear the favorite flag on one file.' It also clarifies the operation is not a toggle, which distinguishes it from a hypothetical toggle tool. An agent can tell it apart from siblings like tags_add or files_update 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case: 'Use to curate quick-access pins,' and explains how the result can be consumed via files_list / files_search filtering. It does not explicitly name a when-not condition or a direct alternative tool for setting favorites, but the semantic clarification ('not a toggle, you pass the desired state') provides strong usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tags_suggestA
Propose tags for a file by mining the existing tag corpus via FTS: picks distinctive terms from the file (≥4 chars, stopword-filtered) and returns tags applied to other files that score high on those terms. No LLM, no network. Already-applied tags are excluded so the suggestions are net-new. Read-only; no side effects, auth, or rate limits. Returns {file_id, path, existing_tags, suggestions: [{tag, score, sources}]}. Empty suggestions = no distinctive terms or no overlap with the existing taxonomy yet, bootstrap with tags_add first. Default limit 10, max 50. Suggestions are NOT auto-applied.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max suggestions to return (default 10) | |
| file_id | Yes | File ID to suggest tags for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discharges it: read-only, no side effects, no auth, no rate limits, no LLM, no network, already-applied tags excluded, and results are NOT auto-applied. It also discloses the scoring basis and output shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and mechanism, then behavior, then return shape, then edge case. Every sentence earns its place, though the 'Default limit 10, max 50' sentence duplicates the schema and is mildly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Though there is no output schema, the description supplies the exact return shape (file_id, path, existing_tags, suggestions with tag/score/sources), the empty-result condition, and the bootstrapping remedy. An agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description's mention of default 10 and max 50 repeats the schema's limit docs rather than adding meaning beyond it, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (propose tags), the resource (a file), and the mechanism (mining the existing tag corpus via FTS with stopword-filtered distinctive terms). It is clearly distinguishable from siblings like tags_add, tags_search, and tags_list, which do not generate suggestions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names tags_add as the bootstrap alternative when suggestions are empty, and explains what an empty result means. It does not state when to prefer tags_search or tags_list for tag lookup, so it stops short of full when/when-not coverage.
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.
116 tool updates
v6.1.2- Added
admin_commit_backup - Added
admin_get_profile - Added
admin_onboard_agent - Added
admin_overview - Added
admin_refresh_session_context - Added
admin_transfer_agent_context - Removed
admin.commit_backup - Removed
admin.get_profile - Removed
admin.onboard_agent - Removed
admin.overview - Removed
admin.refresh_session_context - Removed
admin.transfer_agent_context - Added
calendar_entities_add - Added
calendar_entities_delete - Added
calendar_entities_link - Added
calendar_entities_list - Added
calendar_entities_update - Added
calendar_events_add - Added
calendar_events_conflicts - Added
calendar_events_delete - Added
calendar_events_list - Added
calendar_events_update - Added
calendar_export_ics - Removed
calendar.entities.add - Removed
calendar.entities.delete - Removed
calendar.entities.link - Removed
calendar.entities.list - Removed
calendar.entities.update - Removed
calendar.events.add - Removed
calendar.events.conflicts - Removed
calendar.events.delete - Removed
calendar.events.list - Removed
calendar.events.update - Removed
calendar.export_ics - Added
files_create - Added
files_delete - Added
files_describe - Added
files_diff_against_disk - Added
files_find_related - Added
files_get_diff - Added
files_get_history - Added
files_list - Added
files_move - Added
files_read - Added
files_read_outline - Added
files_regex_search - Added
files_restore - Added
files_search - Added
files_update - Removed
files.create - Removed
files.delete - Removed
files.describe - Removed
files.diff_against_disk - Removed
files.find_related - Removed
files.get_diff - Removed
files.get_history - Removed
files.list - Removed
files.move - Removed
files.read - Removed
files.read_outline - Removed
files.regex_search - Removed
files.restore - Removed
files.search - Removed
files.update - Added
folders_create - Added
folders_delete - Added
folders_list - Removed
folders.create - Removed
folders.delete - Removed
folders.list - Added
hands_confirm - Added
hands_list - Added
hands_reload - Removed
hands.confirm - Removed
hands.list - Removed
hands.reload - Added
journal_commit_upgrades - Added
journal_distill - Added
journal_housekeep - Added
journal_status - Added
journal_write - Removed
journal.commit_upgrades - Removed
journal.distill - Removed
journal.housekeep - Removed
journal.status - Removed
journal.write - Added
projects_list - Added
projects_map - Added
projects_refresh_index - Added
projects_register - Removed
projects.list - Removed
projects.map - Removed
projects.refresh_index - Removed
projects.register - Added
resources_add_report - Added
resources_clip_url - Added
resources_delete_report - Added
resources_export_report - Added
resources_list_reports - Removed
resources.add_report - Removed
resources.clip_url - Removed
resources.delete_report - Removed
resources.export_report - Removed
resources.list_reports - Added
tags_add - Added
tags_list - Added
tags_remove - Added
tags_search - Added
tags_set_favorite - Added
tags_suggest - Removed
tags.add - Removed
tags.list - Removed
tags.remove - Removed
tags.search - Removed
tags.set_favorite - Removed
tags.suggest
24 tool updates
v5.0.0- Added
admin.overview - Removed
admin.stats - Removed
admin.whats_new - Removed
files.bundle_search - Changed
files.create10 fields changed- removed
Input schema / properties / contentRemoved value: -{ - "description": "Content of the file", - "type": "string" -} - removed
Input schema / properties / destinationRemoved value: -{ - "description": "Destination type", - "enum": [ - "knowledge", - "project", - "kontexta" - ], - "type": "string" -} - added
Input schema / properties / filesAdded value: +{ + "description": "Files to create. Single-element array = one-file case. Max 200 per call.", + "items": { + "additionalProperties": false, + "properties": { + "content": { + "description": "Content of the file", + "type": "string" + }, + "destination": { + "description": "Destination type", + "enum": [ + "knowledge", + "project", + "kontexta" + ], + "type": "string" + }, + "folder": { + "description": "Optional folder path", + "type": "string" + }, + "format": { + "description": "File extension to write. Defaults to 'md'. Use 'html' for HTML reports.", + "enum": [ + "md", + "mmd", + "html" + ], + "type": "string" + }, + "kind": { + "description": "REQUIRED for destination='knowledge'. 'dictionary' = source of truth (mappings, glossaries, runbooks, PR templates). 'note' = snapshot (meeting notes, sprint reviews, PR findings, post-mortems). Test: if this file disagreed with the code, who wins? File wins → dictionary; file loses → note. Ignored for destination='project' or 'kontexta'.", + "enum": [ + "dictionary", + "note" + ], + "type": "string" + }, + "project_id": { + "description": "Project ID (required for project/kontexta destinations)", + "type": "number" + }, + "tags": { + "description": "Optional array of tags", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Title of the file", + "type": "string" + } + }, + "required": [ + "title", + "content", + "destination" + ], + "type": "object" + }, + "maxItems": 200, + "minItems": 1, + "type": "array" +} - removed
Input schema / properties / folderRemoved value: -{ - "description": "Optional folder path", - "type": "string" -} - removed
Input schema / properties / formatRemoved value: -{ - "description": "File extension to write. Defaults to 'md'. Use 'html' for HTML reports.", - "enum": [ - "md", - "mmd", - "html" - ], - "type": "string" -} - removed
Input schema / properties / kindRemoved value: -{ - "description": "REQUIRED for destination='knowledge'. 'dictionary' = source of truth (mappings, glossaries, runbooks, PR templates). 'note' = snapshot (meeting notes, sprint reviews, PR findings, post-mortems). Test: if this file disagreed with the code, who wins? File wins → dictionary; file loses → note. Ignored for destination='project' or 'kontexta'.", - "enum": [ - "dictionary", - "note" - ], - "type": "string" -} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project ID (required for project/kontexta destinations)", - "type": "number" -} - removed
Input schema / properties / tagsRemoved value: -{ - "description": "Optional array of tags", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / titleRemoved value: -{ - "description": "Title of the file", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "title", - "content", - "destination" -]New value: +[ + "files" +]
- Removed
files.create_many - Changed
files.delete3 fields changed- removed
Input schema / properties / idRemoved value: -{ - "description": "File ID", - "type": "number" -} - added
Input schema / properties / idsAdded value: +{ + "description": "File IDs to delete. Single-element array = one-file case. Max 500 per call.", + "items": { + "type": "number" + }, + "maxItems": 500, + "minItems": 1, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "id" -]New value: +[ + "ids" +]
- Removed
files.delete_many - Removed
files.grep - Changed
files.read8 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"File ID"New value: +"Single file by ID." - added
Input schema / properties / id / exclusiveMinimumAdded value: +0 - changed
Input schema / properties / id / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / idsAdded value: +{ + "description": "Batch mode: multiple file IDs (max 200 per call); returns an array plus aggregate token cost.", + "items": { + "type": "number" + }, + "maxItems": 200, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / linesAdded value: +{ + "additionalProperties": false, + "description": "Partial read: 1-indexed inclusive line range. Requires `id`; mutually exclusive with `section`.", + "properties": { + "from": { + "description": "First line (1-indexed, inclusive)", + "exclusiveMinimum": 0, + "type": "integer" + }, + "to": { + "description": "Last line (1-indexed, inclusive)", + "exclusiveMinimum": 0, + "type": "integer" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" +} - added
Input schema / properties / pathAdded value: +{ + "description": "Single file by absolute on-disk path (must match exactly what Kontexta indexed).", + "type": "string" +} - added
Input schema / properties / sectionAdded value: +{ + "description": "Partial read: return only this heading's body (case-insensitive exact-string after trim). Requires `id`; mutually exclusive with `lines`.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "id" -]
- Removed
files.read_by_path - Removed
files.read_lines - Removed
files.read_many - Removed
files.read_section - Changed
files.regex_search6 fields changed- added
Input schema / properties / file_idAdded value: +{ + "description": "Scan only this file instead of every file in scope. When set, `project_id`/`kind`/`max_files`/`max_matches_per_file` are ignored in favor of `max_matches`.", + "type": "number" +} - changed
Input schema / properties / kind / descriptionPrevious value: -"Filter by content class before scanning."New value: +"Filter by content class before scanning. Ignored when `file_id` is set." - changed
Input schema / properties / max_files / descriptionPrevious value: -"Cap on files scanned (default 500)"New value: +"Cap on files scanned (default 500). Ignored when `file_id` is set." - added
Input schema / properties / max_matchesAdded value: +{ + "description": "Cap on returned hits in single-file mode (default 100). Only used when `file_id` is set.", + "exclusiveMinimum": 0, + "maximum": 500, + "type": "integer" +} - changed
Input schema / properties / max_matches_per_file / descriptionPrevious value: -"Per-file hit cap (default 10)"New value: +"Per-file hit cap in multi-file mode (default 10). Ignored when `file_id` is set." - changed
Input schema / properties / project_id / descriptionPrevious value: -"Scope to one project, null for KB-only, omit for everything"New value: +"Scope to one project, null for KB-only, omit for everything. Ignored when `file_id` is set."
- Changed
files.search3 fields changed- added
Input schema / properties / formatAdded value: +{ + "description": "Bundle format when `include_bodies` is true. xml = Anthropic-recommended <document> tags (default); markdown = ## headers + fenced blocks. Ignored otherwise.", + "enum": [ + "xml", + "markdown" + ], + "type": "string" +} - added
Input schema / properties / include_bodiesAdded value: +{ + "description": "If true, return a single prompt-ready bundle of matched bodies instead of a match list. Response shape changes to `{bundle, meta: {included, skipped, ...}}`. Default false.", + "type": "boolean" +} - added
Input schema / properties / max_tokensAdded value: +{ + "description": "Token budget when `include_bodies` is true (default 50000). Files added in rank order until the next would exceed; remainder go to `meta.skipped[]`. Ignored otherwise.", + "exclusiveMinimum": 0, + "type": "integer" +}
- Changed
files.update2 fields changed- changed
Input schema / properties / content / descriptionPrevious value: -"New content"New value: +"New content. With `section` set, this replaces just that heading's body; otherwise it becomes the entire file body." - added
Input schema / properties / sectionAdded value: +{ + "description": "Case-insensitive exact-string heading. When set, only this heading's body is rewritten instead of the whole file.", + "type": "string" +}
- Removed
files.update_section - Removed
hands.describe_schema - Changed
hands.list2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / schemaAdded value: +{ + "description": "If true, return the kontexta.json authoring reference document instead of the registered-hands list. Default false.", + "type": "boolean" +}
- Removed
journal.append - Removed
journal.intent - Removed
journal.note - Added
journal.write
124 tool updates
v4.7.2- Removed
add_tags - Added
admin.commit_backup - Added
admin.get_profile - Added
admin.onboard_agent - Added
admin.refresh_session_context - Added
admin.stats - Added
admin.transfer_agent_context - Added
admin.whats_new - Removed
bundle_search - Added
calendar.entities.add - Added
calendar.entities.delete - Added
calendar.entities.link - Added
calendar.entities.list - Added
calendar.entities.update - Added
calendar.events.add - Added
calendar.events.conflicts - Added
calendar.events.delete - Added
calendar.events.list - Added
calendar.events.update - Added
calendar.export_ics - Removed
clip_url - Removed
commit_backup - Removed
confirm_hand - Removed
create_file - Removed
create_files - Removed
create_folder - Removed
delete_file - Removed
delete_files - Removed
delete_folder - Removed
describe_file - Removed
describe_hands_schema - Removed
diff_against_disk - Removed
distill_journal - Removed
distill_journal_commit_upgrades - Added
files.bundle_search - Added
files.create - Added
files.create_many - Added
files.delete - Added
files.delete_many - Added
files.describe - Added
files.diff_against_disk - Added
files.find_related - Added
files.get_diff - Added
files.get_history - Added
files.grep - Added
files.list - Added
files.move - Added
files.read - Added
files.read_by_path - Added
files.read_lines - Added
files.read_many - Added
files.read_outline - Added
files.read_section - Added
files.regex_search - Added
files.restore - Added
files.search - Added
files.update - Added
files.update_section - Removed
find_related - Added
folders.create - Added
folders.delete - Added
folders.list - Removed
get_diff - Removed
get_history - Removed
grep_in_file - Added
hands.confirm - Added
hands.describe_schema - Added
hands.list - Added
hands.reload - Removed
housekeep_journal - Removed
journal_append - Removed
journal_intent - Removed
journal_note - Removed
journal_status - Added
journal.append - Added
journal.commit_upgrades - Added
journal.distill - Added
journal.housekeep - Added
journal.intent - Added
journal.note - Added
journal.status - Removed
list_files - Removed
list_folders - Removed
list_hands - Removed
list_projects - Removed
list_tags - Removed
move_file - Removed
onboard_agent - Removed
project_map - Added
projects.list - Added
projects.map - Added
projects.refresh_index - Added
projects.register - Removed
read_file - Removed
read_file_by_path - Removed
read_file_lines - Removed
read_file_outline - Removed
read_files - Removed
read_section - Removed
refresh_index - Removed
regex_search - Removed
register_project - Removed
reload_hands - Removed
remove_tags - Added
resources.add_report - Added
resources.clip_url - Added
resources.delete_report - Added
resources.export_report - Added
resources.list_reports - Removed
restore_file - Removed
search - Removed
set_favorite - Removed
stats - Removed
suggest_tags - Removed
tag_search_results - Added
tags.add - Added
tags.list - Added
tags.remove - Added
tags.search - Added
tags.set_favorite - Added
tags.suggest - Removed
update_file - Removed
update_file_section - Removed
whats_new
48 tool updates
v4.2.0- Added
add_tags - Added
bundle_search - Added
clip_url - Added
commit_backup - Added
create_file - Added
create_folder - Added
delete_file - Added
delete_files - Added
delete_folder - Added
describe_file - Added
describe_hands_schema - Added
diff_against_disk - Added
distill_journal - Added
distill_journal_commit_upgrades - Added
find_related - Added
get_diff - Added
get_history - Added
grep_in_file - Added
housekeep_journal - Added
journal_intent - Added
journal_note - Added
list_files - Added
list_folders - Added
list_hands - Added
list_projects - Added
list_tags - Added
move_file - Added
onboard_agent - Added
project_map - Added
read_file - Added
read_file_by_path - Added
read_file_lines - Added
read_file_outline - Added
read_files - Added
read_section - Added
refresh_index - Added
regex_search - Added
register_project - Added
reload_hands - Added
remove_tags - Added
restore_file - Added
search - Added
set_favorite - Added
stats - Added
tag_search_results - Added
update_file - Added
update_file_section - Added
whats_new
48 tool updates
v3.3.0- Removed
add_tags - Removed
bundle_search - Removed
clip_url - Removed
commit_backup - Removed
create_file - Removed
create_folder - Removed
delete_file - Removed
delete_files - Removed
delete_folder - Removed
describe_file - Removed
describe_hands_schema - Removed
diff_against_disk - Removed
distill_journal - Removed
distill_journal_commit_upgrades - Removed
find_related - Removed
get_diff - Removed
get_history - Removed
grep_in_file - Removed
housekeep_journal - Removed
journal_intent - Removed
journal_note - Removed
list_files - Removed
list_folders - Removed
list_hands - Removed
list_projects - Removed
list_tags - Removed
move_file - Removed
onboard_agent - Removed
project_map - Removed
read_file - Removed
read_file_by_path - Removed
read_file_lines - Removed
read_file_outline - Removed
read_files - Removed
read_section - Removed
refresh_index - Removed
regex_search - Removed
register_project - Removed
reload_hands - Removed
remove_tags - Removed
restore_file - Removed
search - Removed
set_favorite - Removed
stats - Removed
tag_search_results - Removed
update_file - Removed
update_file_section - Removed
whats_new
53 tool updates
v0.1.0- First observed
add_tags - First observed
bundle_search - First observed
clip_url - First observed
commit_backup - First observed
confirm_hand - First observed
create_file - First observed
create_files - First observed
create_folder - First observed
delete_file - First observed
delete_files - First observed
delete_folder - First observed
describe_file - First observed
describe_hands_schema - First observed
diff_against_disk - First observed
distill_journal - First observed
distill_journal_commit_upgrades - First observed
find_related - First observed
get_diff - First observed
get_history - First observed
grep_in_file - First observed
housekeep_journal - First observed
journal_append - First observed
journal_intent - First observed
journal_note - First observed
journal_status - First observed
list_files - First observed
list_folders - First observed
list_hands - First observed
list_projects - First observed
list_tags - First observed
move_file - First observed
onboard_agent - First observed
project_map - First observed
read_file - First observed
read_file_by_path - First observed
read_file_lines - First observed
read_file_outline - First observed
read_files - First observed
read_section - First observed
refresh_index - First observed
regex_search - First observed
register_project - First observed
reload_hands - First observed
remove_tags - First observed
restore_file - First observed
search - First observed
set_favorite - First observed
stats - First observed
suggest_tags - First observed
tag_search_results - First observed
update_file - First observed
update_file_section - First observed
whats_new
TDQS
Scored across 58 tools
Tools are clearly namespaced by subsystem (files_, tags_, calendar_events_, etc.) and each has a distinct action/resource, so most selections are unambiguous. There is still some overlap among browsing, search, and diagnostic tools such as files_list vs projects_map vs admin_overview, and files_search vs files_regex_search vs files_find_related, but the descriptions provide explicit selection guidance.
All 58 tools use snake_case with a predictable subsystem-prefix pattern (files_create, tags_add, calendar_events_update, hands_confirm, etc.). A few outliers like files_diff_against_disk and calendar_export_ics exist, but the overall convention is highly consistent.
58 tools is far beyond the typical 3-15 well-scoped range and risks overloading an agent's tool-selection process. The broad Kontexta platform does have several legitimate subdomains, so this is not an arbitrary explosion, but the set is still too heavy and could be consolidated.
The surface covers CRUD, search, history, tags, resources, journal, calendar entities/events, and Hands approvals comprehensively. Minor lifecycle gaps remain, such as no explicit project unregister/delete, no dedicated profile update tool, and no folder rename.
Maintenance
Related MCP Connectors
An MCP server that gives your AI access to the source code and docs of all public github repos
Shared memory MCP server for Claude Code, Codex, Gemini CLI and Cursor. Cited, editable.
Cloud-hosted MCP server for durable AI memory
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Related MCP Servers
- AlicenseAqualityBmaintenanceProvides AI assistants with real-time visibility into your codebase's internal libraries, team patterns, naming conventions, and usage frequencies to generate code that matches your team's actual practices.11310 npm68Elastic 2.0
- AlicenseNot gradedqualityAmaintenanceLocal-first knowledge base MCP server. Lets AI agents (Claude Code, Cursor, etc.) read and write your personal knowledge base through 20 MCP tools. Zero cloud dependency — all files stay on your machine.1,758 npm704MIT
- AlicenseAqualityCmaintenanceLocal-first MCP server that gives any AI coding agent per-project memory, workflow intelligence, and always-on, lossless token & context optimization.3763 npm6MIT
- AlicenseNot gradedqualityCmaintenanceA local-first MCP server that gives AI assistants long-term memory by storing, searching, and recalling notes as Markdown files on your machine.14 npmMIT