Skip to main content
Glama

LightCMS

CI codecov Go Report Card lightcms MCP server

LightCMS is a Go-powered content management system built for the AI era. It's simultaneously AI-native (semantic search, built-in Claude-powered chat widget, MCP server for agent control), agentically controllable (Claude Code and any MCP client can read, write, publish, and bulk-import content via 130 MCP tools), and agentically updatable (the codebase is clean, well-structured Go — coding agents can safely extend it). For teams that want a CMS that works with AI rather than around it.

What's New in v7.3 — SEO & AI

Feature

Summary

AI Traffic

See which AI crawlers read your site (training vs. AI search vs. user-initiated fetches), what they read most, and how many visits ChatGPT, Perplexity, Claude, Gemini and Copilot send you.

AI Crawler Policy

Allow or block AI training, AI search and user fetches separately, with per-crawler overrides and an optional Content-Signal line, rendered into robots.txt.

Markdown Copies

Every page is also available as clean Markdown at /<page>.md, linked from the page and from llms.txt, so agents can read it without the HTML.

Richer Structured Data

Authors, publisher with logo, breadcrumbs, FAQ markup, and modified dates that only move when the page content actually changes.

RSS & Atom Feeds

/feed.xml, /atom.xml and per-collection feeds with full content.

Hide from Search & AI

Per-page noindex that also removes the page from the sitemap, llms.txt, feeds and IndexNow.

Related MCP server: sitemd

What's New in v7.2

Feature

Summary

IndexNow

Published, edited, moved and deleted pages are pushed to Bing, Yandex and other IndexNow engines right away. Zero-config: each install generates its own key, verifies it owns its BASE_URL before submitting, and submits the whole site once on first activation. Status and history at Tools → IndexNow.

CMS Agent

Configurable email digests (via Resend) covering site health, traffic, review queue, agent activity and broken links, with optional AI commentary.

What's New in v7.1

Feature

Summary

Ambient Copilot

The copilot is a slide-in drawer on every admin page — floating 🤖 button, fullscreen toggle, ChatGPT-style searchable chat history, live typing indicator, and rendered tables. It edits, creates, publishes, and reads analytics and maintenance reports in plain language.

Analytics Ranges

60/90-day presets and custom date ranges across all analytics views.

Fast AI-Crawler Endpoints

llms.txt serves in ~1 second on large sites (projected queries), and homepages emit schema.org WebSite JSON-LD with SearchAction.

Version Visibility

The admin sidebar shows the running version.

What's New in v7.0

Feature

Summary

Agent Sandbox ("PRs for content")

Agents work in an isolated fork with copy-on-write; humans review a per-field diff and merge. Live content is untouchable until merge.

Agent Governance

Scoped API keys, sandbox-only keys (server-enforced), per-session change ledger with one-call rollback, and per-version provenance (human vs agent, which session).

Admin Copilot

/cm/copilot — edit, create, and publish content in plain language, with RBAC and full audit logging.

llms.txt + JSON-LD

Auto-generated /llms.txt and /llms-full.txt for AI crawlers, schema.org structured data on every page.

MCP for Readers

Public read-only MCP endpoint at /mcp-public — visitors' agents can search and read the site natively.

Local Embeddings

LIGHTCMS_EMBEDDINGS_PROVIDER=ollama for fully self-hosted semantic search — no API credits.

Self-Maintaining Sites

Daily maintenance scans surface stale pages, missing meta, and broken links as an agent-ready work queue.

What's New in v6.0

Feature

Summary

Content Approvals

Contributors submit content for approval; editors/admins approve or reject from /cm/approvals. Rejection comments auto-post to the discussion thread.

Contributor Role

New RBAC role between Viewer and Editor. Can create content + upload assets (pending), post comments, and submit for approval — but cannot publish directly or manage system settings.

Approval Workflows

Configurable trigger-based workflows (contributor, folder path, template ID, or tag). Sequential or concurrent mode with configurable approver lists.

Content Discussion

Inline comment thread at the bottom of every edit page. @mention autocomplete, live badge count, admin delete.

Tabbed Bottom Panel

Discussion, Version History, and Forks organized into tabs on the content edit page.

Approvals Dashboard

My Queue + Other Pending + Workflow Config at /cm/approvals. Sidebar badge shows pending count.

Dashboard Sections

Requiring Approvals and Recent Comments appear on the admin dashboard when relevant.

New Webhook Events

comment.created, content.pending_approval, asset.pending_review.

14 new MCP tools

Full comment and approval lifecycle — list/create/delete comments, full workflow CRUD, list/get/submit/approve/reject/cancel approval requests.

What's New in v5.0

Feature

Summary

Import Pipeline

Three new import types — RSS/Atom feeds, Markdown/ZIP upload, CSV bulk import — with a unified job dashboard at /cm/imports.

RSS/Atom Import

Configure recurring feed sources with hourly/daily/weekly schedules, template mapping, folder targeting, and auto-publish.

Markdown Import

Upload .md files or .zip archives with YAML frontmatter. Supports Notion exports, Obsidian vaults, Hugo/Jekyll migrations, and AI-generated content.

CSV Import

Upload CSV files and map columns to content fields. Specify the title column; all other columns become fields automatically.

Real-time Job Status

SSE-powered live log stream at /cm/imports/{jobID}. Watch imports happen line-by-line or review full history after the fact.

10 new MCP import tools

list_import_sources, create_import_source, update_import_source, delete_import_source, trigger_import_source, import_markdown, import_csv, list_import_jobs, get_import_job, cancel_import_job.

Agentic bulk content creation

import_markdown is designed for AI agents to generate and import large content batches in a single call. See MCP.md.

Deduplication

Imports match by full_path — re-importing the same slug updates rather than duplicates.

What's New in v4.5

Feature

Summary

Webhooks

HMAC-SHA256 signed events for publish, unpublish, delete, create, update. Admin UI at /cm/webhooks with delivery history and a docs page.

Scheduled Publishing

Set a future publish_at timestamp on any content item; a background scheduler auto-publishes at the right time.

Content Locking

Advisory lock when editing (30-min expiry). Warning banner if another user is already editing. Admins can force-unlock.

Incremental Static Regeneration (ISR)

Template layout changes regenerate affected pages in 20-page batches, preventing server overload on large sites.

Edge Caching Headers

ETag, Cache-Control, Last-Modified, and Vary headers on all public pages. 304 Not Modified support.

Cloudflare Integration

Configure Zone ID + API Token to auto-purge Cloudflare cache on publish/unpublish.

Structured JSON Logging

All server logs emit structured JSON with timestamp, level, message, and context fields.

Rate Limit Dashboard

New tab on the audit log page showing locked IPs, attempt counts, and a one-click clear button.

MCP Prompt Resources

Three new MCP resources: lightcms://site/structure, lightcms://content/recent, lightcms://theme/config.

Why LightCMS?

Lightweight: A clean, focused codebase that's easy to understand, modify, and extend. No bloated frameworks or complex abstractions.

AI-Native: Built from the ground up for the AI era:

  • MCP Integration: Full Model Context Protocol server with 130 tools and 3 prompt resources for website management. Supports both local stdio and HTTP streamable transports — connect from Claude Code, Claude Desktop, or any MCP-compatible client.

  • OAuth 2.1 for Remote Agents: Sandboxed desktop apps like Claude's Cowork can securely connect over HTTP using OAuth 2.1 with PKCE. No embedded passwords — just authorize once and the agent manages your site.

  • Fork-Friendly: Designed to be forked and customized by Claude Code. Ask Claude to add new content types, modify templates, or build custom features — the codebase is structured for AI-assisted development.

  • Natural Language Website Management: Skip the admin UI entirely. Create pages, manage assets, customize themes, and publish content through conversation.

Features

Content Management

  • Template System: Define reusable content structures with custom fields (text, richtext, image, date, select, markdown)

  • Static Page Generation: Fast page loads from pre-rendered HTML — no runtime templating overhead

  • Content Versioning: Full version history with diff comparison and one-click revert

  • Soft Delete: Recover deleted content with undelete functionality

  • Content Tagging: Tag any content item with one or more freeform labels, then query by tag across your site

  • Snippets: Named HTML template fragments used as reusable rendering units in dynamic queries

  • lc:query Directives: Embed live content queries directly in template layouts — at publish time they expand into rendered lists of matching pages

  • Content Collections: Auto-generated paginated listing pages filtered by category

  • Folders & URL Organization: Hierarchical content organization with clean URL paths

  • Rich Text Editor: Quill 2 for visual content editing (vendored in static/admin/quill/, served from the site itself)

  • Regex Search & Replace: Site-wide or scoped search-and-replace with RE2 regex support, capture groups, and mandatory preview step

  • Bulk Operations: Update or apply field operations across up to 100 pages in a single API call; export/transform/re-import pipelines

  • Scheduled Publishing (v4.5+): Set a future publish_at timestamp; a background scheduler auto-publishes at the right time

  • Content Locking (v4.5+): Advisory lock while editing (30-min expiry); warning banner if another user holds the lock; admins can force-unlock

  • Incremental Static Regeneration (v4.5+): Template layout changes regenerate pages in 20-page batches to prevent server overload on large sites

Import Pipeline (v5.0+)

  • RSS/Atom Feed Sources: Configure recurring import sources with configurable schedule (hourly/daily/weekly), template mapping, folder targeting, and auto-publish. Manage sources and run history from /cm/imports. Feed URLs must be publicly reachable (private and loopback addresses are refused, v7.4.3).

  • Markdown + ZIP Import: Upload .md files or .zip archives of Markdown. YAML frontmatter in each file controls title, slug, folder, template, tags, and scheduled publish time. Supports Notion exports, Obsidian vaults, Hugo/Jekyll site migrations, and AI-generated content.

  • CSV Bulk Import: Upload a CSV and specify which column is the title; all other columns are stored as content fields automatically.

  • Real-time SSE Job Status: Live log stream at /cm/imports/{jobID} — watch imports happen line-by-line or review full history after the fact.

  • MCP-first Design: import_markdown is specifically designed for AI agents to generate and import large content batches in a single call, replacing dozens of create_content calls with one import_markdown + one get_import_job. See MCP.md for workflow examples.

Content Forks (v4.0+)

  • Fork Workspaces: Create named staging workspaces where sets of page edits can be authored, previewed, and reviewed before going live

  • Sparse Model: Only edited pages live in a fork — unmodified pages fall through to live content automatically

  • Fork Preview Mode: Activate via a floating bar injected into the live site; a cookie routes all page requests through the fork so you see exactly how the site will look after merge

  • Merge with Conflict Detection: Admins merge forks into live content; if a live page was changed after the fork was created, the conflict is recorded (fork wins). New pages created in the fork are inserted into live on merge, keeping the publish state they had in the fork (normally draft) unless the merge is run with publish_new

  • Merges Clean Up (v7.4+): A merge deletes the fork's page copies and keeps the fork record, with created/updated counts, as history. Forks merged before v7.4 can be cleaned with purge_fork_copies

  • Fork Copies Stay Out of the Way (v7.4+): Fork copies are left out of content listings and search unless include_forks is set, and can never be published directly or in bulk — only merged

  • Hold Flag (v7.4+): Mark any draft hold to block every way of publishing it (publish, bulk publish, scheduled publish, approval, fork merge) until the flag is cleared

  • Full MCP Toolset: 9 dedicated fork tools — list_forks, create_fork, get_fork, fork_page, remove_fork_page, merge_fork, archive_fork, delete_fork, purge_fork_copies

Batch & Parallel Operations

Designed for agents that prefer parallelized, high-throughput workflows over sequential single-item calls:

  • bulk_update_content: Update up to 100 pages in a single API call. Each item uses merge semantics — only the fields you specify are touched. Supports dry_run validation before committing, and auto_republish to re-publish all previously-published pages in the same call, eliminating a separate publish step

  • bulk_field_operation: Apply a single operation (set, clear, prepend, append, wrap) to a field across every matching page in one call. Scope by template, folder, category, or explicit ID list. Ideal for adding disclaimers, updating metadata, or clearing stale fields across a content type

  • publish_multiple: Publish a list of IDs — or all drafts at once with publish_all_drafts: true — in a single request instead of looping over publish_content

  • export_content: Dump full field data for a scoped set of pages as a structured JSON array. Designed for export → transform → re-import pipelines; pair with bulk_update_content for large-scale content migrations

  • Scoped Search & Replace: Both scoped_search_replace_preview and scoped_search_replace_execute accept scope filters (folder, template, category, IDs) so agents can target precise subsets rather than running site-wide operations

  • Parallel-Safe Read API: list_content with include_data: true returns full field values in one fetch; agents can fan out reads across multiple list_content / get_content calls concurrently and then batch-write with bulk_update_content

Recommended agent pattern for large updates: list_content → transform in parallel → bulk_update_content (up to 50/call) → publish_multiple.

AI Chat Widget (v4.2+)

  • Embeddable Widget: Add a floating AI chat bubble to any page with a single <script> tag — self-contained, no build step required

  • Two-Phase Pipeline: Each visitor query runs hybrid semantic+fulltext search to retrieve relevant content excerpts, then streams those excerpts through Claude Haiku for a conversational synthesized answer

  • SSE Streaming: Haiku's token-by-token output is forwarded live to the browser via Server-Sent Events; falls back to plain JSON for non-SSE clients

  • AI-Optional: Without an Anthropic API key, the widget works as a search-in-chat experience returning ranked excerpts — no API cost

  • Fully Configurable: Admin "Chat Widget" page controls title, welcome message, placeholder text, primary color, position (bottom-left/right), max results, and editable system/user prompt templates

  • Dedicated Rate Limiting: Separate per-IP (5/min) and global (30/min) limiters independent from the search and API limiters

  • Source Attribution: Every response includes the content pages whose excerpts were used, with titles and paths

Multi-User Access Control & Approvals (v2.0+, v6.0+)

  • Role-Based Access Control (RBAC): Four roles — admin, editor, contributor, viewer — with granular permission enforcement on all admin UI pages and REST API endpoints

  • Contributor Role (v6.0+): Create content, upload assets, post comments, and submit for editorial approval — without publish rights

  • Approval Workflows (v6.0+): Configurable trigger-based workflows (by role, folder, template, or tag). Sequential or concurrent mode. Default (no workflow): any editor or admin can approve

  • Content Approvals Dashboard (v6.0+): My Queue, Other Pending, and Workflow Config at /cm/approvals. Sidebar badge shows pending count

  • Content Discussion (v6.0+): Inline threaded comments on every content edit page. @mention autocomplete, admin delete, live count badge

  • User Management: Admin panel for creating users, assigning roles, disabling accounts, and resetting passwords

  • Audit Log: Persistent, searchable log of all mutations (who did what, when) with 365-day retention

  • Rate Limit Dashboard (v4.5+): New tab on the audit log page showing locked IPs, attempt counts, and a clear button

  • User-Scoped API Keys: API keys inherit the permissions of their owning user

  • Force Password Change: Temporary passwords trigger a mandatory change on first login

  • Hybrid Search: Combines full-text exact matching with semantic vector search (Voyage AI embeddings), merged via reciprocal rank fusion

  • Configurable Ranking: All ranking weights editable in the admin panel — nav boost, title boost, boosted templates, demoted path prefixes, and penalty scores

  • Intelligent Defaults: Nav-linked pages surface first, concept-template pages rank above generic content, video transcripts are deprioritised

  • Title Boost: Pages where the query appears in the title always rank above body-only matches

  • Typeahead Suggestions: Fast prefix-matching suggestions — pages for direct navigation, keywords for full search — with the same structural ranking

  • Works Without Embeddings: Falls back to full-text search if no Voyage API key is configured

  • Rate Limiting: Per-IP and global rate limiting for DDoS protection

Developer & Integration

  • REST API: Full /api/v1/ JSON API with API key and OAuth token authentication, RBAC-enforced

  • MCP Server: 130 tools + 3 prompt resources for agentic website management (stdio + HTTP streamable)

  • OAuth 2.1: Authorization code flow with PKCE for remote MCP clients — no embedded passwords

  • CLI Tool: Command-line interface for all content management operations

  • URL Redirects: 301/302 redirect rules managed from the admin panel

  • Webhooks (v4.5+): HMAC-SHA256 signed event delivery for 6 event types (content.create, content.update, content.publish, content.unpublish, content.delete, and more); per-webhook secrets; delivery history with retry visibility; admin UI at /cm/webhooks. Webhook URLs must be publicly reachable: a URL that resolves to a loopback, private or link-local address is refused and logged as "blocked" (v7.4.3)

  • Cloudflare Integration (v4.5+): Auto-purge Cloudflare cache on publish/unpublish via Zone ID + API Token

  • Edge Caching Headers (v4.5+): ETag, Cache-Control, Last-Modified, Vary, and 304 Not Modified on all public pages

  • Structured JSON Logging (v4.5+): All server logs emit structured JSON with timestamp, level, message, and context fields

Site Customization

  • Theme Customization: Colors, fonts, border radius, custom CSS — all editable in the admin panel with version history

  • Header/Footer HTML: Full HTML control over site chrome injected around all pages

  • Asset Management: Upload and manage images, documents, and other files with path-based serving

Prerequisites

  • Go 1.24 or later

  • MongoDB Atlas account (free tier works great)

Quick Start

  1. Clone the repository

  2. Copy config.dev.json.example to config.dev.json

  3. Edit config.dev.json with your MongoDB connection string

  4. Run go run cmd/server/main.go

  5. Visit http://localhost:8082/cm and log in with your email and password

  6. On first run, an admin account is created — set LIGHTCMS_ADMIN_EMAIL to use your email, or it defaults to admin@localhost

MongoDB Atlas Setup

Step 1: Create an Atlas Account

  1. Go to MongoDB Atlas

  2. Sign up for a free account (no credit card required)

Step 2: Create a Cluster

  1. Click "Build a Database"

  2. Select "M0 FREE" (Shared) tier

  3. Choose your preferred cloud provider and region (closest to you)

  4. Click "Create Deployment"

Step 3: Set Up Database Access

  1. Create a database user:

    • Username: lightcms (or your choice)

    • Password: Generate a secure password (save this!)

    • Click "Create User"

  2. Add your IP address:

    • Click "Add My Current IP Address"

    • Or add 0.0.0.0/0 to allow access from anywhere (less secure, but convenient for development)

    • Click "Finish and Close"

Step 4: Get Your Connection String

  1. Click "Connect" on your cluster

  2. Select "Drivers"

  3. Copy the connection string, it looks like:

    mongodb+srv://lightcms:<password>@cluster0.xxxxx.mongodb.net/?retryWrites=true&w=majority
  4. Replace <password> with your actual password

Step 5: Create Your Config File

For development, copy the example and fill in your values:

cp config.dev.json.example config.dev.json

Edit config.dev.json:

{
  "port": "8082",
  "mongo_uri": "mongodb+srv://lightcms:YOUR_PASSWORD@cluster0.xxxxx.mongodb.net/lightcms",
  "env": "development",
  "session_secret": "any-random-string-for-dev"
}

For production, use config.prod.json:

cp config.prod.json.example config.prod.json

Edit with production values (use openssl rand -hex 32 for session_secret).

Installation

# Clone or navigate to the project
cd lightcms

# Install dependencies
go mod tidy

# Run the server
go run cmd/server/main.go

Or use the run script:

./run.sh

Configuration

LightCMS uses JSON config files. Create either:

  • config.dev.json - for development

  • config.prod.json - for production (takes precedence if both exist)

Field

Description

port

Server port (e.g., "8082" for dev, "80" for prod)

mongo_uri

MongoDB Atlas connection string

database_name

MongoDB database name. Optional, default lightcms

env

Environment: "development" or "production"

session_secret

Random string for session encryption

base_url

Public URL of the site

secure_cookies

true in production (HTTPS). false for local development over plain HTTP

When MONGO_URI is set, configuration comes from environment variables instead (MONGO_URI, SESSION_SECRET, BASE_URL, PORT, ENV, SECURE_COOKIES).

Database name. The server and the cmd/ tools use the database lightcms unless told otherwise. Set the DATABASE_NAME environment variable (it wins over database_name in the config file) to point an instance at another database on the same cluster, for example a staging or test copy. The server logs the database it connected to at startup.

Plain HTTP in development. With secure_cookies: false the admin works over http://localhost: cookies are not marked Secure and the CSRF origin check compares against http://. With secure_cookies: true (the production default) the admin must be reached over HTTPS; the CSRF check rejects plain-HTTP origins.

Note: Config files contain secrets and are excluded from git via .gitignore.

Usage

Accessing the Site

First Login

Log in at /cm/login with your email and password. On first startup with an empty database, LightCMS creates an admin account from the LIGHTCMS_ADMIN_EMAIL environment variable (defaults to admin@localhost with password admin123). Change your password immediately after logging in.

To reset a password from the command line:

go run cmd/resetpw/main.go user@example.com

Creating Content

  1. Log in to the admin panel at /cm

  2. Go to Content → New Content

  3. Select a template (Blog Post, Press Release, Explanatory Page, etc.)

  4. Fill in the fields

  5. Check "Published" and save

Managing Users (Admin Only)

  1. Go to Users in the left sidebar (visible to admins only)

  2. Create users with email, display name, and role (admin / editor / viewer)

  3. Users receive a temporary password and are prompted to change it on first login

  4. Disable accounts or reset passwords from the edit page

  5. View a full audit trail of all user actions at Audit Log

Creating Custom Templates

  1. Go to Templates → New Template

  2. Define your fields (text, textarea, richtext, date, image, select)

  3. Create an HTML layout using {{.field_name}} placeholders

  4. Save the template

Available placeholders:

  • {{.title}} - Content title

  • {{.slug}} - URL slug

  • {{.published_at}} - Publication date

  • {{.your_field_name}} - Any custom field you define

Dynamic Index Pages: Tags, Snippets, and lc:query

LightCMS includes a system for building dynamic index pages that automatically update as you publish content. Three features work together: tags label individual pages, snippets define how each result is rendered, and lc:query directives embed live queries directly inside template layouts.


Tags

Tags are freeform string labels you attach to any content item. A page can have zero or many tags. They're the primary way to group content for querying.

Setting tags in the admin UI:

  1. Open any content item in the editor

  2. Find the Tags field (below the main fields)

  3. Type a tag name and press Enter — repeat for multiple tags

  4. Save the content item

Setting tags via the API:

curl -X PUT http://localhost:8082/api/v1/content/{id} \
  -H "Authorization: Bearer lc_your_key" \
  -H "Content-Type: application/json" \
  -d '{"tags": ["AI & Machine Intelligence", "Featured"]}'

Tags are exact-match strings. Capitalization and spaces are preserved — "AI & Machine Intelligence" and "ai & machine intelligence" are treated as different tags.


Snippets

A snippet is a named HTML template fragment stored in the CMS. When lc:query runs, it renders each matching content item through a snippet and concatenates the results.

Creating a snippet:

  1. Go to Settings → Snippets in the admin panel

  2. Click New Snippet, give it a name (e.g. glossary-pill)

  3. Write HTML using Go template variables:

<a href="{{.FullPath}}">{{.Title}}</a>

Available variables inside a snippet:

Variable

Description

{{.Title}}

The content item's title

{{.FullPath}}

The public URL path (e.g. /my-page)

{{.Slug}}

URL slug only (e.g. my-page)

{{.MetaDescription}}

Meta description field

{{.PublishedAt}}

Publication timestamp

Example snippets:

A pill-style link (for glossary / tag cloud layouts):

<a href="{{.FullPath}}" class="pill">{{.Title}}</a>

A card with description:

<div class="card">
  <h3><a href="{{.FullPath}}">{{.Title}}</a></h3>
  <p>{{.MetaDescription}}</p>
</div>

A simple list item:

<li><a href="{{.FullPath}}">{{.Title}}</a></li>

lc:query Directives

An lc:query directive is an HTML comment you embed in a template layout. At page generation time — before the page is rendered — the CMS finds all matching content items, renders each one through the named snippet, and replaces the comment with the combined HTML.

Syntax:

<!-- lc:query filter="tag:TAGNAME" sort="title:asc" snippet="snippet-name" -->

Attributes:

Attribute

Required

Description

filter

Yes

Filter expression. Currently supports tag:TAGNAME to match content tagged with TAGNAME.

sort

No

Sort field and direction: title:asc, title:desc, created_at:asc, created_at:desc. Defaults to title:asc.

snippet

Yes

Name of the snippet to render each result through.

Example in a template layout:

<h2>AI & Machine Intelligence</h2>
<div class="links">
<!-- lc:query filter="tag:AI & Machine Intelligence" sort="title:asc" snippet="glossary-pill" -->
</div>

After the page is published, the directive is replaced with the rendered output of every published page tagged AI & Machine Intelligence, each passed through the glossary-pill snippet:

<h2>AI & Machine Intelligence</h2>
<div class="links">
<a href="/artificial-intelligence" class="pill">Artificial Intelligence</a>
<a href="/machine-learning" class="pill">Machine Learning</a>
<a href="/neural-networks" class="pill">Neural Networks</a>
</div>

Important: lc:query directives must be placed in the template's HTML layout field, not inside content data fields. The CMS processes them during page generation before Go's template engine runs (which would otherwise strip HTML comments).


Automatic Regeneration

Index pages that use lc:query are automatically regenerated whenever:

  • A tagged content item is published or updated

  • The template layout is changed

  • The snippet is updated

  • Regenerate All is triggered manually from the admin panel

This means you never need to manually rebuild your index pages — publish a new concept page tagged "Games & Interactive Experiences" and it appears in every index that queries for that tag within seconds.


Complete Walkthrough: Building a Tagging-Powered Index

Here's how to build a concepts glossary that automatically stays up to date.

Step 1: Tag your concept pages

For each concept page, add the appropriate tag in the content editor. You can use as many tags as you like, and the same content item can appear in multiple index sections.

Step 2: Create a snippet

In Settings → Snippets, create a snippet named glossary-pill:

<a href="{{.FullPath}}">{{.Title}}</a>

Step 3: Create a template with lc:query sections

Create a new template (e.g. "Concepts Index") with this HTML layout:

<article class="index-page">
  <h1>{{.title}}</h1>
  <div class="page-content">

    <h2>AI &amp; Machine Intelligence</h2>
    <div class="concept-links">
<!-- lc:query filter="tag:AI & Machine Intelligence" sort="title:asc" snippet="glossary-pill" -->
    </div>

    <h2>Games &amp; Interactive Experiences</h2>
    <div class="concept-links">
<!-- lc:query filter="tag:Games & Interactive Experiences" sort="title:asc" snippet="glossary-pill" -->
    </div>

    <h2>3D Graphics &amp; Rendering</h2>
    <div class="concept-links">
<!-- lc:query filter="tag:3D Graphics & Rendering" sort="title:asc" snippet="glossary-pill" -->
    </div>

  </div>
</article>

Note that {{.title}} is the Go template variable for the content item's title. Template variables use Go's {{.field}} syntax and are resolved after lc:query directives are expanded.

Step 4: Create and publish an index page

Create a new content item using your "Concepts Index" template. Give it a title and slug (e.g. /glossary). Publish it — the static page is generated with all the current tagged content already in place.

Step 5: Keep publishing

From now on, every time you create and publish a new concept page with a matching tag, all index pages that query for that tag are automatically regenerated and updated.


Template Variables

Beyond content data fields, templates have access to a few built-in variables:

Variable

Description

{{.title}}

The content item's title

{{.slug}}

URL slug

{{.published_at}}

Publication timestamp

{{.your_field}}

Any custom field defined in the template (richtext fields render as HTML)

Custom fields defined on your template are available directly by key. If you define a field with key intro, it's available as {{.intro}} in the layout. Richtext fields are automatically marked safe — their HTML is rendered as-is without escaping.



Content Authoring: Pre-Processing & Markup Features

LightCMS processes content field values before rendering them into your template. Authors can use the following markup features in any text or richtext data field.


Link between pages using double-bracket syntax. Wikilinks are resolved at publish time and automatically kept up to date when a page's title or path changes.

Syntax

Result

[[Page Title]]

Link to a page matched by title (case-insensitive)

[[Page Title|display text]]

Same, with custom link text

[[/full/path]]

Link to a page by its exact URL path

[[/full/path|display text]]

Path link with custom link text

Broken links (no matching page found) render as <span class="broken-link">Page Title</span> so they are easy to identify and fix.


Snippet Includes

Embed a named snippet inline inside any content field:

[[include:snippet-name]]

The snippet-name must exactly match the Name field of a snippet in Settings → Snippets. Snippet includes are useful for reusable content blocks such as callouts, disclaimers, and calls to action that appear on many pages.


Table of Contents

Place {{.lc_toc}} anywhere in your template's HTML layout to inject an auto-generated table of contents at that position:

<nav class="sidebar">
  {{.lc_toc}}
</nav>
<article>
  {{.body}}
</article>

At page generation time, LightCMS scans all headings in the final rendered HTML and outputs a <nav class="lc-toc"> block with anchor links to each one. Headings automatically receive id= attributes derived from their text content (see Heading IDs below), so the TOC links work without any extra setup.


Heading IDs

All headings (<h1> through <h6>) in rendered page output automatically receive id= attributes derived from their text. This enables deep-linking to specific sections.

Example:

<!-- In your content field -->
<h2>Getting Started</h2>

<!-- Rendered output -->
<h2 id="getting-started">Getting Started</h2>

The id is generated by lowercasing the text and replacing spaces and punctuation with hyphens. If two headings produce the same id, a numeric suffix is appended (getting-started-2, etc.).


Markdown Field Type

Template fields can be given the type markdown instead of text or richtext. Markdown fields support GitHub Flavored Markdown (GFM) including tables, strikethrough, task lists, and autolinks. The field value is converted to HTML at page generation time.

Markdown fields are a good choice for structured content that benefits from simple markup without a WYSIWYG editor — documentation pages, changelogs, FAQs, and similar content.

To create a Markdown field, set the field type to markdown when defining the template:

{ "name": "body", "label": "Body", "type": "markdown", "required": true }

Inline Tag Detection

Mention #tagname anywhere in a content field to automatically tag the page with that label. The tag is added to the page's tag list and participates in lc:query index pages just like manually applied tags.

Tag rules:

  • Must start with a letter

  • May contain letters, numbers, underscores, or hyphens

  • Example: This article covers #machine-learning and #ai adds both tags

This is a convenient alternative to editing the Tags field separately — useful when writing content in Markdown fields or richtext where you want to tag inline.


Creating Collections

Collections display grouped content (like a blog listing page).

  1. Go to Collections → New Collection

  2. Set the category filter to match your content's category

  3. Define item and page templates

  4. The collection will be available at /collection-slug

Customizing the Theme

  1. Go to Theme in the admin panel

  2. Adjust colors, fonts, and border radius

  3. Add custom CSS if needed

  4. Save to apply changes site-wide

LightCMS exposes a public search API at /api/search that your site's frontend can call.

Search API

GET /api/search?q=QUERY&mode=hybrid&limit=10

Parameter

Description

q

Search query (required)

mode

hybrid (default), fulltext, or semantic

limit

Max results 1–50 (default 10)

{
  "query": "game design",
  "mode": "hybrid",
  "total": 3,
  "results": [
    { "id": "...", "title": "Game Design", "full_path": "/concepts/game-design",
      "snippet": "...matching context...", "score": 0.97, "match_type": "both" }
  ]
}

match_type is exact, semantic, or both.

Typeahead Suggest API

GET /api/search/suggest?q=PREFIX&limit=8

Returns two lists for building a live typeahead dropdown:

{
  "keywords": ["game design", "game mechanics"],
  "pages":    [{"title": "About Jon Radoff", "path": "/about"}]
}
  • keywords — extracted from published content; clicking one triggers a full search

  • pages — direct-navigation results, ranked by: nav-linked → boosted-template → title-starts-with → title-contains → demoted paths

JavaScript Example

<input type="text" id="q" placeholder="Search..." autocomplete="off">
<ul id="suggest"></ul>
<div id="results"></div>

<script>
const input = document.getElementById('q');
const suggest = document.getElementById('suggest');
const results = document.getElementById('results');
let timer;

// Typeahead while typing
input.addEventListener('input', () => {
  clearTimeout(timer);
  const q = input.value.trim();
  if (q.length < 2) { suggest.innerHTML = ''; return; }
  timer = setTimeout(async () => {
    const r = await fetch('/api/search/suggest?q=' + encodeURIComponent(q) + '&limit=8');
    const d = await r.json();
    suggest.innerHTML = [
      ...(d.pages    || []).map(p => `<li><a href="${p.path}">📄 ${p.title}</a></li>`),
      ...(d.keywords || []).map(k => `<li><a onclick="doSearch('${k}')">🔍 ${k}</a></li>`),
    ].join('');
  }, 200);
});

// Full search on Enter
input.addEventListener('keydown', e => { if (e.key === 'Enter') doSearch(input.value); });

async function doSearch(q) {
  suggest.innerHTML = '';
  const r = await fetch('/api/search?q=' + encodeURIComponent(q) + '&mode=hybrid&limit=10');
  const d = await r.json();
  results.innerHTML = (d.results || [])
    .map(r => `<div><a href="${r.full_path}"><strong>${r.title}</strong></a><p>${r.snippet}</p></div>`)
    .join('') || '<p>No results.</p>';
}
</script>

Ranking Configuration

Ranking weights are configurable in the admin panel under Tools → End User Search → Search Ranking. Defaults: title-match boost 0.20, nav-page boost 0.15, concept-template boost 0.05, video-path penalty −0.05. Configure your Voyage AI key under Configuration to enable semantic search.

Project Structure

lightcms/
├── cmd/
│   ├── server/main.go        # HTTP server entry point
│   ├── mcp/main.go           # MCP server entry point
│   ├── cli/main.go           # CLI tool entry point
│   └── resetpw/main.go       # Password reset utility
├── config/
│   └── config.go             # Configuration loading
├── internal/
│   ├── apiclient/            # Reusable HTTP client for REST API
│   ├── auth/                 # Authentication, RBAC permissions, session management
│   ├── cli/                  # CLI subcommands and output formatting
│   ├── database/             # MongoDB connection & operations
│   ├── handlers/             # HTTP handlers (admin UI + REST API)
│   ├── mcp/                  # MCP server and tool definitions
│   ├── middleware/            # API auth middleware (API keys + OAuth)
│   ├── models/               # Data models & default templates
│   ├── oauth/                # OAuth 2.1 authorization server
│   └── services/             # Business logic (content, search, users, audit, etc.)
├── static/                   # CSS, JS, and uploaded files
├── content/                  # Custom pages and generated HTML
└── .goreleaser.yaml          # Release configuration

Default Templates

Blog Post

Fields: title, excerpt, featured_image, content, author, tags

Press Release

Fields: headline, subheadline, dateline, release_date, body, boilerplate, contact_info

Explanatory Page

Fields: title, subtitle, hero_image, intro, main_content, sidebar, cta_text, cta_link

Concept Page

Fields: title, definition, topic_links — ideal for wiki-style knowledge base entries

Standard Page, Blank Page, Homepage

General-purpose layouts for flexible content.

Multi-User Access Control

LightCMS v2.0+ supports multiple users with role-based permissions.

Roles

Role

Capabilities

admin

Full access: manage users, templates, theme, settings, audit log, all API keys

editor

Create/edit/delete/publish content; upload and delete assets; manage own API keys

viewer

Read-only access to content, templates, assets, and settings

Audit Log

Every mutation (content create/update/delete/publish, user management, settings changes, logins) is logged with the acting user's email, timestamp, and relevant details. Logs are retained for 365 days and accessible at /cm/audit.

API Key Permissions

API keys created by a user inherit that user's role. A key created by an editor cannot perform admin-only operations even if its token is shared. Admins can manage all keys; non-admins can only manage their own.

First-Time Migration

On first startup with an empty users collection, LightCMS automatically creates an admin user from the existing password hash in the database. Set the LIGHTCMS_ADMIN_EMAIL environment variable to specify which email address to use (defaults to admin@localhost).

API Keys

API keys are required for the REST API, MCP server, and CLI tool. Create them from the admin panel.

  1. Log in at /cm

  2. Go to Settings → API Keys

  3. Click Create New Key, give it a name and description

  4. Copy the key immediately — it's only shown once

Keys use the format lc_ followed by 32 hex characters. They're stored as SHA-256 hashes and inherit the permissions of the creating user.

OAuth 2.1 Authorization

LightCMS implements OAuth 2.1 so that remote MCP clients (like Claude's Cowork) can securely connect without embedding passwords or API keys. This follows the standard authorization code flow with PKCE.

Endpoints

Endpoint

Purpose

POST /oauth/register

Dynamic client registration (RFC 7591)

GET /oauth/authorize

Authorization page (admin login + consent)

POST /oauth/token

Token exchange and refresh

POST /oauth/revoke

Token revocation (RFC 7009)

GET /oauth/jwks

JWKS endpoint (opaque tokens, returns empty)

Security

  • PKCE (S256) required for all authorization requests

  • Token rotation: refresh tokens are single-use; a new pair is issued each time

  • Short-lived access tokens: 1-hour TTL

  • Refresh tokens: 30-day TTL, revocable

  • Rate limiting: failed login attempts trigger progressive lockouts (1 min → 5 min → 15 min)

  • All tokens stored as SHA-256 hashes in the database

How Clients Connect

  1. Client fetches /.well-known/oauth-authorization-server to discover endpoints

  2. Client calls POST /oauth/register with its name and redirect URI

  3. Client redirects admin to /oauth/authorize with PKCE challenge

  4. Admin enters password and approves access

  5. Client exchanges the authorization code for access + refresh tokens

  6. Client uses the access token as a Bearer token on /mcp or /api/v1/ endpoints

This is all handled automatically by MCP-compatible clients — you just provide your LightCMS URL and approve the connection.

REST API

LightCMS provides a full REST API at /api/v1/ authenticated with API keys or OAuth tokens. All endpoints enforce RBAC — the permissions of the authenticated user (or key owner) determine what's allowed.

Authentication

Include an API key or OAuth access token in the Authorization header:

# With API key
curl -H "Authorization: Bearer lc_your_key_here" http://localhost:8082/api/v1/content

# With OAuth token
curl -H "Authorization: Bearer <oauth_access_token>" http://localhost:8082/api/v1/content

Endpoints

Resource

Endpoints

Content

GET/POST /content, GET/PUT/DELETE /content/{id}, POST .../publish, .../unpublish, .../restore, GET .../versions, POST .../versions/{v}/revert, GET /content/by-path?path=...

Templates

GET/POST /templates, GET/PUT/DELETE /templates/{id}

Snippets

GET/POST /snippets, GET/PUT/DELETE /snippets/{id}

Assets

GET/POST /assets, GET/DELETE /assets/{id}, GET /assets/folders, GET /assets/by-path?path=...

Theme

GET/PUT /theme, GET /theme/versions, POST /theme/versions/{v}/revert

Config

GET/PUT /config

Redirects

GET/POST /redirects, GET/PUT/DELETE /redirects/{id}

Folders

GET/POST /folders, GET/DELETE /folders/{id}

Collections

GET/POST /collections, GET/PUT/DELETE /collections/{id}

Search

GET /search?q=..., POST /search-replace/preview, POST /search-replace/execute

API Keys

GET/POST /api-keys, DELETE /api-keys/{id}

Utility

POST /regenerate

All endpoints return JSON. PUT endpoints support partial updates (only include fields you want to change).

CLI Tool

The lightcms CLI provides command-line access to all content management operations.

Installation

# Build from source
go build -o bin/lightcms ./cmd/cli

# Or download a release binary from GitHub

Configuration

export LIGHTCMS_URL=http://localhost:8082
export LIGHTCMS_API_KEY=lc_your_key_here

Or use flags: --url and --api-key.

Commands

lightcms content list                    # List all content
lightcms content get <id>                # Get content by ID
lightcms content create --template <id> --title "My Post" --slug my-post --data '{"body":"Hello"}'
lightcms content publish <id>            # Publish content
lightcms content versions <id>           # Show version history

lightcms template list                   # List templates
lightcms asset upload --file logo.png --path /images/logo.png
lightcms theme update --primary-color "#1a1a2e"
lightcms search "search terms"           # Search content
lightcms api-key create --name "CI/CD"   # Create API key

lightcms --json content list             # JSON output

Run lightcms --help for full usage.

MCP Server (AI-Powered Content Management)

lightcms MCP server

LightCMS includes a full MCP (Model Context Protocol) server with 130 tools and 3 prompt resources for managing your entire website through AI agents. It supports two transport modes:

  • Stdio — for local tools like Claude Code

  • HTTP Streamable — for remote/sandboxed clients like Claude's Cowork, Claude Desktop, or any MCP-compatible app

Option A: Local Setup (Claude Code via Stdio)

Best for developers using Claude Code directly on the same machine.

  1. Create an API key in the admin panel at /cm → Settings → API Keys

  2. Run the setup script:

export LIGHTCMS_API_KEY=lc_your_key_here
./setup-mcp.sh

Or register manually:

go build -o bin/lightcms-mcp ./cmd/mcp

claude mcp add --transport stdio lightcms-mcp \
  -e LIGHTCMS_URL="http://localhost:8082" \
  -e LIGHTCMS_API_KEY="lc_your_key_here" \
  -- /path/to/lightcms/bin/lightcms-mcp

Restart Claude Code and run /mcp to verify.

Option B: Remote Setup (Cowork / Claude Desktop via HTTP + OAuth)

Best for sandboxed desktop apps that can't run local binaries. The HTTP MCP endpoint at /mcp supports OAuth 2.1 authorization — no API keys or passwords need to be embedded in the client.

How it works:

  1. The client discovers your LightCMS instance via well-known endpoints

  2. It registers as an OAuth client (one-time, automatic)

  3. You authorize the client by entering your admin password in the browser

  4. The client receives short-lived access tokens and refreshes them automatically

To connect from a remote MCP client, just provide your LightCMS URL (e.g., https://yoursite.example.com). The client handles the rest using standard OAuth 2.1 discovery.

Discovery endpoints:

Endpoint

Purpose

/.well-known/oauth-authorization-server

OAuth server metadata (RFC 8414)

/.well-known/oauth-protected-resource

Protected resource metadata (RFC 9728)

/.well-known/mcp/server-card.json

MCP server card with tool schemas

Authentication

The MCP HTTP endpoint accepts both authentication methods:

  • API keys (lc_ prefix) — long-lived, created in admin panel

  • OAuth 2.1 tokens — short-lived, obtained through the authorization flow

Both methods enforce RBAC based on the authenticated user's role.

Available Tools (130 total) + 3 Prompt Resources

  • Content (19): list, read, create, update, update by path, delete, restore, publish, unpublish, publish multiple, preview, versions (list + get), revert, bulk create, bulk update, bulk field operation, export, backlinks

  • Templates (5): create, read, update, delete, list

  • Snippets (5): create, read, update, delete, list

  • Assets (6): upload, upload from URL, read, delete, list files and folders

  • Search (7): full-text search, end-user search, search-and-replace (global + scoped, preview + execute), reindex embeddings

  • Settings (23): theme CRUD + versioning + pinning, site config, redirects, folders, collections, regenerate all content

  • Forks (9): list, create, get, fork page, remove page, merge, archive, delete, purge copies

  • Import (10, v5.0+): list/create/update/delete/trigger import sources, import markdown, import CSV, list/get/cancel import jobs

  • Webhooks (6, v4.5+): list, create, update, delete webhooks; regenerate secret; list deliveries

  • Content Locking (4, v4.5+): get lock, acquire lock, release lock, force-unlock

  • Scheduled Publishing (3, v4.5+): schedule publish, list scheduled, cancel scheduled

  • Audit & Link Check (3, v4.5+): list audit logs, start link check, get link check results

  • Comments (3, v6.0+): list comments, post comment, delete comment

  • Approvals (11, v6.0+): list/get/create/update/delete approval workflows; list/get/submit/approve/reject/cancel approval requests

  • Agent Sandbox & Governance (10, v7.0+): start/get/end agent sandbox, fork diff, agent session changes, session rollback, maintenance report, run maintenance scan, backfill published dates, repair fork damage

  • IndexNow (3, v7.2.3+): get status, enable/disable, submit

  • SEO & AI (3, v7.3+): get/update SEO settings, AI traffic

  • Prompt Resources (3, v4.5+): lightcms://site/structure, lightcms://content/recent, lightcms://theme/config

For detailed API documentation, see MCP.md.

Environment Variables (Stdio Mode)

  • LIGHTCMS_URL — Server URL (default: http://localhost:8082)

  • LIGHTCMS_API_KEY — API key (required for stdio mode)

MCP Examples

These examples show how the MCP tools work together to manage a website through natural language. Each example lists the user prompt and the exact MCP tool calls that execute behind the scenes.

Example 1: Create and Publish a Blog Post

Prompt: "Create a blog post about AI agents and publish it"

Tool calls:

  1. list_templates — finds the Blog Post template and its ID

  2. create_content — creates the post with template ID, title, slug, and field data:

    {
      "template_id": "6971098ad0761968133b8e43",
      "title": "The Rise of AI Agents",
      "slug": "rise-of-ai-agents",
      "data": {
        "excerpt": "How autonomous AI agents are reshaping software development.",
        "content": "<p>AI agents represent a fundamental shift...</p>",
        "author": "Editorial Team"
      }
    }
  3. publish_content — makes it live; a static HTML page is generated at /rise-of-ai-agents

Example 2: Update the Site Theme

Prompt: "Change the site colors to a dark theme with blue accents"

Tool calls:

  1. get_theme — reads current theme settings (colors, fonts, header/footer HTML)

  2. update_theme — applies the new palette:

    {
      "primary_color": "#1a1a2e",
      "secondary_color": "#16213e",
      "accent_color": "#0f3460",
      "background_color": "#0a0a0a",
      "text_color": "#e0e0e0"
    }

    All published pages are automatically regenerated with the new theme.

Example 3: Search and Replace Across the Entire Site

Prompt: "Replace 'Acme Corp' with 'Acme Industries' everywhere on the site"

Tool calls:

  1. search_replace_preview — shows affected pages without making changes:

    { "search": "Acme Corp", "replace": "Acme Industries" }

    Returns a list of content items, matched fields, and match counts.

  2. search_replace_execute — applies the replacement after user confirmation. Each affected content item gets a new version for rollback capability.

Example 4: Create a Custom Template

Prompt: "Create a template for team member profiles with name, role, bio, and photo"

Tool calls:

  1. create_template — defines the structure and HTML layout:

    {
      "name": "Team Member",
      "slug": "team-member",
      "fields": [
        { "name": "role", "label": "Role", "type": "text", "required": true },
        { "name": "photo", "label": "Photo", "type": "image", "required": false },
        { "name": "bio", "label": "Biography", "type": "richtext", "required": true }
      ],
      "html_layout": "<div class=\"team-member\"><img src=\"{{.photo}}\" alt=\"{{.title}}\"><h2>{{.title}}</h2><h3>{{.role}}</h3><div>{{.bio}}</div></div>"
    }

    The template is immediately available for creating content.

Example 5: Upload an Image and Use It in Content

Prompt: "Upload this logo and add it to the about page"

Tool calls:

  1. upload_asset — uploads the file as base64 with a serve path:

    {
      "filename": "logo.png",
      "serve_path": "/images/logo.png",
      "data_base64": "iVBORw0KGgoAAAANSUhEUg..."
    }

    The image is now accessible at /images/logo.png.

  2. get_content — retrieves the about page by path to get its current data

  3. update_content — adds the image reference to the page's content field

Example 6: Set Up URL Redirects

Prompt: "The old blog moved from /news to /blog — set up redirects for the old URLs"

Tool calls:

  1. create_redirect — creates a permanent redirect:

    {
      "from_path": "/news",
      "to_path": "/blog",
      "status_code": 301,
      "description": "Blog section moved from /news to /blog"
    }

    Visitors to /news are automatically redirected to /blog. Multiple redirects can be created in sequence for different paths.

Example 7: Content Versioning and Rollback

Prompt: "Show me the version history for the homepage, then revert to version 2"

Tool calls:

  1. get_content — retrieves the homepage by path (/) to get its ID

  2. get_content_versions — returns the full version history with timestamps and comments:

    Version 5 — "Updated hero section" — 2026-02-25
    Version 4 — "Added testimonials" — 2026-02-20
    Version 3 — "Redesigned layout" — 2026-02-15
    Version 2 — "Initial content" — 2026-02-10
    Version 1 — "Created page" — 2026-02-08
  3. revert_to_version — rolls back to version 2, creating a new version 6 with the old data. The published page is regenerated immediately.

Example 8: Organize Content with Folders

Prompt: "Create a /docs section and move the API reference page into it"

Tool calls:

  1. create_folder — creates the URL path segment:

    { "name": "Documentation", "slug": "docs" }
  2. get_content — retrieves the API reference page to get its ID

  3. update_content — moves it into the new folder:

    { "id": "...", "folder_path": "/docs" }

    The page is now accessible at /docs/api-reference instead of /api-reference.

Example 9: Build a Content Collection (Blog Index)

Prompt: "Create a blog listing page that shows all blog posts sorted by newest first"

Tool calls:

  1. create_collection — defines the collection with category filter, sorting, and display templates:

    {
      "name": "Blog",
      "slug": "blog",
      "category": "blog",
      "sort_field": "created_at",
      "sort_order": "desc",
      "items_per_page": 10,
      "item_template": "<article><h2><a href=\"{{.Path}}\">{{.Title}}</a></h2><p>{{.excerpt}}</p><time>{{.PublishedAt}}</time></article>",
      "page_template": "<div class=\"blog-index\"><h1>Blog</h1>{{.Items}}{{.Pagination}}</div>"
    }

    A paginated blog listing is now live at /blog, automatically including any content with category "blog".

Example 10: Build a Dynamic Tagged Index Page

Prompt: "Create a glossary index that automatically lists all my concept pages grouped by category, and keep it updated as I add new pages"

Tool calls:

  1. create_snippet — creates a reusable rendering template for each result:

    {
      "name": "glossary-pill",
      "html": "<a href=\"{{.FullPath}}\">{{.Title}}</a>"
    }
  2. create_template — creates the index page template with lc:query directives embedded:

    {
      "name": "Concepts Index",
      "slug": "concepts-index",
      "fields": [
        { "name": "intro", "label": "Introduction", "type": "textarea" }
      ],
      "html_layout": "<article class=\"index-page\">\n<h1>{{.title}}</h1>\n{{if .intro}}<p>{{.intro}}</p>{{end}}\n\n<h2>AI &amp; Machine Intelligence</h2>\n<div class=\"links\">\n<!-- lc:query filter=\"tag:AI & Machine Intelligence\" sort=\"title:asc\" snippet=\"glossary-pill\" -->\n</div>\n\n<h2>Games &amp; Interactive Experiences</h2>\n<div class=\"links\">\n<!-- lc:query filter=\"tag:Games & Interactive Experiences\" sort=\"title:asc\" snippet=\"glossary-pill\" -->\n</div>\n</article>"
    }
  3. create_content — creates the index page using the new template:

    {
      "template_id": "<concepts-index-template-id>",
      "title": "Concepts Glossary",
      "slug": "glossary",
      "data": {
        "intro": "An index of all concepts, grouped by category."
      }
    }
  4. update_content — tags several existing concept pages (each call):

    { "tags": ["AI & Machine Intelligence"] }
  5. publish_content — publishes the index page; the lc:query directives are resolved at this moment and the page is generated with all currently-tagged content already populated.

From now on, every time a new concept page is published with a matching tag, the index page at /glossary is automatically regenerated — no further action needed.

Example 11: Full-Text Search and Content Audit

Prompt: "Find all pages that mention 'pricing' and show me which ones are still in draft"

Tool calls:

  1. search_content — performs a full-text search across all content fields:

    { "query": "pricing", "search_type": "fulltext" }

    Returns matching content items with their publish status, paths, and which fields matched:

    Found 4 results for 'pricing':
    - "Pricing Plans" at /pricing — published — matched in: content
    - "Enterprise FAQ" at /enterprise-faq — published — matched in: content, sidebar
    - "New Pricing Draft" at /new-pricing — draft — matched in: title, content
    - "Q1 Press Release" at /press/q1-update — draft — matched in: body

    The two draft items can then be reviewed, edited, and published as needed.

Example 12: Bulk Content Migration

Prompt: "Add a 'last_reviewed' field to every page in our /docs section and publish them all"

Tool calls:

  1. list_content — fetches all content under /docs with full field data in one call:

    { "folder_path": "/docs", "include_data": true }

    Returns IDs, titles, current field values, and publish status for all 34 pages.

  2. (parallel) Agent fans out into batches of 50 and calls bulk_update_content concurrently:

    {
      "updates": [
        { "id": "abc123", "data": { "last_reviewed": "2026-03-24" } },
        { "id": "def456", "data": { "last_reviewed": "2026-03-24" } }
      ],
      "version_comment": "Added last_reviewed field — Q1 2026 audit",
      "auto_republish": true
    }

    auto_republish: true re-publishes every previously-published page immediately — no separate publish step needed.

All 34 pages are updated and live in two parallel calls instead of 34 sequential ones.

Example 13: Fork-Based Staged Redesign

Prompt: "Redesign the homepage and /about page in a staging area so I can preview before publishing"

Tool calls:

  1. create_fork — creates a named staging workspace:

    { "name": "Q2 Redesign", "description": "Homepage and About refresh" }

    Returns a fork ID. The live site is completely unaffected.

  2. fork_page — copies the homepage into the fork and applies edits:

    {
      "fork_id": "fork_abc123",
      "content_id": "homepage_id",
      "data": { "hero_headline": "Build the web with AI", "hero_subtext": "..." }
    }
  3. fork_page — does the same for /about:

    {
      "fork_id": "fork_abc123",
      "content_id": "about_id",
      "data": { "body": "<p>Updated company story...</p>" }
    }

    A floating preview bar is injected into the live site — visiting it with the fork cookie active shows both pages exactly as they'll look after merge.

  4. merge_fork — after approval, merges both fork pages into live content and regenerates their static HTML:

    { "fork_id": "fork_abc123" }

    Returns a summary of merged pages (counts plus created_ids and updated_ids) and any conflicts detected. Pages the fork adds are created as drafts unless you pass "publish_new": true; pages on hold always stay drafts. The fork's page copies are deleted once the merge succeeds.

Example 14: Site-Wide Notice with Auto-Republish

Prompt: "Prepend a deprecation notice to all pages in our /v1 docs section and republish them"

Tool calls:

  1. bulk_field_operation — appends the notice to a specific field across the entire folder in one call:

    {
      "operation": "prepend",
      "field": "body",
      "value": "<div class=\"deprecation-notice\"><strong>⚠️ This page covers v1 (deprecated).</strong> See <a href=\"/docs\">current docs</a>.</div>\n\n",
      "folder_path": "/v1",
      "auto_republish": true,
      "version_comment": "Added v1 deprecation notice"
    }

    Returns counts of updated and republished pages. The live site reflects the change immediately.

If the notice ever needs to be removed, a single scoped_search_replace_execute with the exact notice HTML reverts all pages in one call.

Working with Snippets

# List all snippets
list_snippets

# Create a callout snippet
create_snippet {
  "name": "callout-warning",
  "description": "Warning callout box",
  "html": "<div class=\"callout callout-warning\"><strong>⚠️ {{.Title}}</strong><p>{{.Body}}</p></div>"
}

# Use a snippet inline in content
update_content {
  "id": "...",
  "data": {
    "body": "Here is important information:\n\n[[include:callout-warning]]\n\nContinued text..."
  }
}

Content Tagging & Index Pages

# Tag a page at creation time
create_content {
  "template_id": "...",
  "title": "Introduction to AI",
  "slug": "intro-to-ai",
  "tags": ["AI & Machine Intelligence", "Getting Started"],
  "data": { "body": "..." }
}

# Inline tagging via content body
update_content {
  "id": "...",
  "data": {
    "body": "This page covers #machine-learning and #neural-networks."
  }
}

# Query directive in a template layout (for index pages)
<!-- lc:query filter="tag:AI & Machine Intelligence" sort="title:asc" snippet="concept-card" -->

Bulk Operations

# Step 1: Export all Concept Pages with specific fields
export_content {
  "template_name": "Concept Page",
  "fields": ["definition", "layer_badge"]
}

# Step 2: Transform the data externally, then bulk update
bulk_update_content {
  "updates": [
    { "id": "abc123", "data": { "layer_badge": "<new html>" } },
    { "id": "def456", "data": { "layer_badge": "<new html>" } }
  ],
  "version_comment": "Updated layer badges"
}

# Clear a field across all pages of a template
bulk_field_operation {
  "operation": "clear",
  "field": "old_badge",
  "template_name": "Concept Page",
  "version_comment": "Cleared deprecated field"
}

# Prepend a disclaimer to all blog posts
bulk_field_operation {
  "operation": "prepend",
  "field": "body",
  "value": "<div class=\"disclaimer\">Views are my own.</div>",
  "template_name": "Blog Post",
  "version_comment": "Added disclaimer to all posts"
}

Regex Search & Replace

# Preview: find all pages with old badge HTML pattern
scoped_search_replace_preview {
  "search": "<div class=\"badge-v1\".*?</div>",
  "replace": "",
  "regex": true,
  "template_name": "Concept Page"
}

# Execute after confirming preview
scoped_search_replace_execute {
  "search": "<div class=\"badge-v1\".*?</div>",
  "replace": "",
  "regex": true,
  "template_name": "Concept Page",
  "version_comment": "Removed old v1 badge HTML"
}
# Link to another page by title
update_content {
  "id": "...",
  "data": {
    "body": "See also: [[Machine Learning]] and [[AI Ethics|ethics considerations]]."
  }
}

# Find what pages link to a given path
get_backlinks { "path": "/concepts/machine-learning" }

Content Versioning

# See version history for a page
get_content_versions { "content_id": "abc123" }

# Restore a previous version
revert_to_version {
  "content_id": "abc123",
  "version": 3,
  "version_comment": "Reverted to pre-redesign version"
}

Development

# Run with hot reload (using air)
go install github.com/cosmtrek/air@latest
air

# Build all binaries
go build -o bin/lightcms-server ./cmd/server
go build -o bin/lightcms-mcp ./cmd/mcp
go build -o bin/lightcms ./cmd/cli

# Run the server
./bin/lightcms-server

Security Notes

For production:

  1. Use a strong session_secret — minimum 32 characters (generate with openssl rand -hex 32). The server hard-fails on startup if this requirement isn't met in production.

  2. Set LIGHTCMS_ADMIN_EMAIL so the initial admin account uses your real email

  3. Change the default admin password immediately after first login

  4. Use HTTPS (put behind a reverse proxy like nginx or caddy)

  5. Restrict MongoDB Atlas IP whitelist to your server IPs

  6. API keys inherit the permissions of their owning user — keep admin keys secure

  7. Review the audit log regularly at /cm/audit

  8. Regularly backup your MongoDB database

  9. Configure max_upload_bytes in site settings to cap file upload size for your use case

Security features built in:

  • CSRF protection on all /cm routes

  • Admin Content-Security-Policy: scripts and stylesheets load from the site itself only (the editor's Quill files are vendored, not fetched from a CDN)

  • RBAC permission checks on all admin handlers and REST API endpoints

  • Session cookies: SameSite=Strict, 24-hour expiry, Secure in production

  • File uploads: extension whitelist + MIME validation + configurable size cap

  • API request body cap: 10 MiB enforced on all /api/v1/ endpoints

  • Login rate limiting: escalating lockouts (1 min → 5 min → 15 min)

  • Per-endpoint rate limiters: regenerate (2/min), search-replace execute (10/min), bulk-update (5/min), export (5/min), reindex (1/min)

  • Passwords: bcrypt with cost=12

  • Audit logging on all mutations with 365-day retention

  • Fly.io deployments: Fly-Client-IP header used for real client IP (unspoofable, unlike X-Forwarded-For)

  • Chat widget prompt injection defense: user input wrapped in XML delimiters, </ sequences escaped

Privacy Policy

LightCMS is self-hosted software — you control your database, your hosting, and your data. The MCP server and CLI tool connect to your LightCMS instance via the REST API — no data is transmitted to Metavert LLC or any third party.

For the full privacy policy, see: https://www.metavert.io/lightcms-privacy-policy

License

MIT

Available Tools

129 tools
acquire_content_lockAcquire Content LockA
Idempotent

Acquire an advisory lock on a content item for the current API user. Returns conflict if another user holds the lock.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_idYesContent item ID,required

TDQS

A3.5/5.0
Behavior4/5

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

Annotations supply idempotentHint=true and destructiveHint=false, so the description's added value is the conflict behavior ('Returns conflict if another user holds the lock'), a genuinely useful failure mode. It omits lock lifetime/expiry and whether an unattended lock blocks other users indefinitely.

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

Conciseness5/5

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

Two compact sentences with zero filler; the action and scope come first and the error semantics second. Nothing is wasted or buried.

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

Completeness3/5

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

For a one-parameter lock tool with no output schema, the key missing context is lifecycle: how long the lock persists, whether it auto-expires, and that release_content_lock must eventually be called. Annotations cover idempotency, but the operational contract is only partially conveyed.

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

Parameters3/5

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

Only one parameter, fully documented in the schema at 100% coverage ('Content item ID,required'). The description adds no syntax or format detail beyond what the schema already states, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb (acquire) and resource (advisory lock on a content item), scoped to the current API user. It is clearly distinguishable from get_content_lock and release_content_lock by the 'acquire' semantics, though no sibling is named explicitly.

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

Usage Guidelines2/5

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

There is no statement of when to acquire a lock versus using get_content_lock to inspect one, and no mention that release_content_lock (or force_unlock_content) is the counterpart action. The locking lifecycle an agent must follow is left entirely to inference.

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

approve_requestApprove RequestA

Approve an approval request. When all required approvals are collected the content is automatically published.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesrequired,Approval request ID
commentNoOptional approval comment

TDQS

A3.5/5.0
Behavior4/5

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

The annotations only declare destructiveHint=false, so the description carries most of the burden and does disclose the consequential side effect: content is automatically published once all required approvals are collected. That is exactly the kind of cascading effect an agent needs before calling a mutation. It still omits whether approval is reversible and what permissions are required.

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

Conciseness5/5

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

Two short sentences, front-loaded with the action, with no redundant restatement of the title or resource name.

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

Completeness3/5

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

For a small two-parameter mutation with no output schema, the description covers the action and its main consequence, which is minimally sufficient. It leaves out authorization requirements, whether the approval can be withdrawn later, and what the response contains, which matters for an agent operating in an approval workflow.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (id, comment) are documented in the schema, so the baseline of 3 applies. The description adds no meaning about the id format or what the comment is used for beyond the schema.

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

Purpose4/5

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

States a specific verb and resource (approve an approval request) that is unambiguous against the nearest siblings reject_request and cancel_approval_request, and the second sentence adds the outcome. It stops short of naming the analogous sibling operations, so an agent still infers the routing from the verb alone.

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

Usage Guidelines2/5

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

There is no guidance on when to approve versus reject or cancel, and no prerequisites such as the caller needing to be a designated approver or the request needing to be in a pending state. The agent must infer all preconditions from the workflow tools.

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

archive_forkArchive ForkA
Idempotent

Archive a fork without merging it. The fork and its pages are preserved but the fork becomes read-only. Requires admin role.

ParametersJSON Schema
NameRequiredDescriptionDefault
fork_idYesFork workspace ID to archive,required

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare idempotentHint=true and destructiveHint=false. Description adds critical behavioral context: the fork and pages are 'preserved' (explaining destructive=false), becomes 'read-only' (state change), and 'Requires admin role' (authorization barrier not in annotations). Adds significant value beyond structured hints.

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

Conciseness5/5

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

Three tightly constructed sentences: 1) Action + sibling distinction, 2) Preservation semantics + state change, 3) Authorization requirement. Zero redundancy; every word earns its place. Excellent information density.

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

Completeness4/5

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

For a single-parameter state-change tool with no output schema, the description adequately covers the operation outcome (read-only preservation), authorization boundary, and sibling distinction. Completeness is appropriate for the tool's complexity; no critical gaps.

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

Parameters3/5

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

Schema has 100% description coverage ('Fork workspace ID to archive,required'), so baseline is 3. Description does not add parameter semantics, constraints, or examples beyond what the schema provides, but none is needed given complete schema coverage.

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

Purpose5/5

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

Description uses specific verb 'Archive' with resource 'fork', states the exact outcome (becomes read-only), and explicitly distinguishes from sibling merge_fork with 'without merging it'. Also distinguishes from delete_fork by stating data is preserved.

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

Usage Guidelines4/5

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

Explicitly references the alternative action (merging) via 'without merging it', establishing the choice point. States prerequisite 'Requires admin role'. Could be improved by explicitly stating when to choose archive vs delete, but clearly signals this is a preservation alternative to merging.

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

backfill_published_datesBackfill Published DatesA
Idempotent

Give published pages that have no published date (created before v7.3.2) a published date equal to their creation date, for structured data and feeds. Metadata only: pages don't re-render. Use dry_run first to see the count.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoOnly count the pages that would change

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, destructiveHint=false, and openWorldHint=false. The description adds meaningful context beyond them: it is metadata-only, pages do not re-render, the target population is narrowly defined, and dry_run can preview the count. It does not discuss permissions or reversibility, but the annotation set already covers the safety profile.

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

Conciseness5/5

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

The description is four sentences, front-loaded with the core operation and scoped condition. Each sentence adds distinct information (target population, effect, metadata-only behavior, dry-run guidance) with no redundancy.

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

Completeness4/5

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

No output schema exists, but the description explains the mutation, its target set, its non-rendering nature, and the dry-run preview. It is nearly complete for a single-parameter maintenance tool; only permissions and exact return format are unstated, and the annotations largely cover operational safety.

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

Parameters4/5

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

With 100% schema coverage, the schema already defines dry_run as counting pages that would change. The description adds sequencing value by instructing the agent to use dry_run first, which is meaningful guidance beyond the schema's static description.

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

Purpose5/5

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

States a specific action (give published pages a published date), the exact target population (published pages lacking a published date, created before v7.3.2), and the effect (date equals creation date). It is clearly distinguishable from generic update tools like update_content or bulk_update_content.

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

Usage Guidelines4/5

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

Specifies the condition for using the tool (pages without published dates, pre-v7.3.2) and adds an operational guideline: use dry_run first to see the count. It does not name an alternative tool or state when not to use it, keeping it just 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.

bulk_create_contentBulk Create ContentA

Create up to 100 content items in a single call using efficient batch insert.

Items are inserted via MongoDB InsertMany for maximum throughput. If one item fails (e.g., duplicate path), the rest continue. Published items get their static HTML generated in parallel (up to 10 concurrent).

Set upsert: true to update existing pages at the same path instead of failing on duplicates.

Returns: total attempted, succeeded, failed counts, and per-item {id, full_path, success, error} details.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of content items to create (max 100),required
upsertNoIf true, update existing content at the same path instead of failing on duplicates
version_commentNoVersion comment for all created items

TDQS

A4.5/5.0
Behavior5/5

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

With annotations only declaring openWorldHint=false and destructiveHint=false, the description carries real behavioral weight: best-effort partial-failure semantics ('the rest continue'), the underlying InsertMany path, parallel HTML generation capped at 10 concurrent, and the upsert override for duplicates. This is exactly the operational detail annotations cannot express.

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

Conciseness5/5

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

Four tight sentences, front-loaded with the verb and limit, then failure behavior, then the upsert escape hatch, then the return shape. No sentence is redundant and the length is justified by the tool's batch complexity.

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

Completeness5/5

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

There is no output schema, so the description correctly compensates by specifying the return payload (attempted/succeeded/failed counts plus per-item id, full_path, success, error). Combined with failure and concurrency semantics, 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents items, upsert, and version_comment, and the description's restatement of upsert adds only the 'instead of failing on duplicates' framing. The 100-item cap and per-item field semantics are otherwise left to the schema, so baseline 3 is appropriate.

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

Purpose5/5

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

The first sentence gives a specific verb (Create), resource (content items), and a hard scope bound (up to 100 in a single call), which cleanly separates it from create_content (single) and bulk_update_content (existing items). An agent can distinguish it from all siblings without opening the schema.

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

Usage Guidelines4/5

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

It clearly states the condition that changes behavior: set upsert: true to overwrite existing pages at the same path instead of failing, and it explains that a single failure does not abort the rest. It stops short of naming when to prefer create_content or bulk_update_content over this tool, so it is clear context rather than full when/when-not routing.

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

bulk_field_operationBulk Field OperationA
Destructive

Apply a single field operation to all matching content pages in one call.

Operations:

  • clear: set field to empty string

  • set: replace field value with a fixed string

  • prepend: add text before existing field value

  • append: add text after existing field value

  • wrap: surround existing value with before/after strings

Use scope filters to limit which pages are affected (content_ids, folder_path, template_name, category). Set dry_run: true to preview which pages would be changed without saving. Only live pages are changed: fork copies named in content_ids come back in "skipped" as {id, reason}.

Example: {"operation": "prepend", "field": "disclaimer", "value": "Note: ", "template_name": "Blog Post"}

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoSuffix string for wrap operation
fieldYesField name to operate on,required
valueNoValue for set/prepend/append operations
beforeNoPrefix string for wrap operation
dry_runNoPreview affected pages without saving
categoryNoLimit to pages in this category
operationYesOperation: clear, set, prepend, append, or wrap,required
content_idsNoLimit to specific content IDs
folder_pathNoLimit to pages under this path
template_nameNoLimit to pages using this template
version_commentNoVersion comment

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only supply destructiveHint=true and openWorldHint=false, so the description carries real added weight: it reveals that clear blanks a field, that dry_run avoids saving, and that fork copies surface in a 'skipped' array with {id, reason}. It stops short of stating permission requirements or rollback/versioning behavior, though the version_comment param hints at versioning.

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

Conciseness5/5

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

Front-loaded purpose statement, tight bulleted operation list, then scope/dry-run guidance, then a concrete example. Every block earns its place and a reader can skim to the relevant part.

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

Completeness4/5

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

For an 11-param destructive bulk tool with no output schema, the description covers operations, scoping, dry-run safety, and the skipped-result shape. It does not address permissions, locking (siblings include acquire_content_lock), or rate considerations, leaving a small gap.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds genuine meaning by defining what each operation value does (e.g., wrap consumes before/after, append adds text after the existing value) — semantics the schema enum does not enumerate — plus the skipped-return behavior tied to content_ids.

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

Purpose5/5

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

The description states a precise verb and resource ('Apply a single field operation to all matching content pages in one call') and the enumerated operation set (clear/set/prepend/append/wrap) clearly distinguishes it from sibling bulk tools like bulk_update_content and scoped_search_replace_execute.

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

Usage Guidelines4/5

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

It gives clear operational context: scope filters select the affected pages, dry_run previews changes without saving, and only live pages mutate. The example call shows a realistic invocation, but no explicit when-not-to-use guidance or named alternatives are provided.

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

bulk_update_contentBulk Update ContentA
Destructive

Update up to 100 content items in a single call. Use instead of calling update_content in a loop.

Each update in the array specifies the content ID and only the fields you want to change (merge semantics on data). Use clear_fields to explicitly clear field values to empty string. Set dry_run: true to validate all IDs exist without committing changes.

Returns: total attempted, succeeded, failed counts, and per-item success/error details.

Tip: call list_content with include_data: true first to get IDs + current field values, transform as needed, then submit here. Recommended batch size: up to 50 per call for optimal performance.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoIf true, validate all IDs exist without saving
updatesYesArray of content updates (max 100),required
version_commentNoVersion comment applied to all updates

TDQS

A4.7/5.0
Behavior4/5

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

Annotations establish destructiveHint=true (mutation), while description adds merge semantics ('only the fields you want to change'), explains dry_run validation behavior, distinguishes clear_fields from merge updates, and details return structure ('total attempted, succeeded, failed counts') compensating for lack of 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.

Conciseness5/5

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

Front-loaded with core purpose and sibling distinction; structured logically from operation definition → semantics → return values → workflow tip → optimization. No wasted words; each sentence advances understanding of how to invoke correctly.

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

Completeness5/5

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

Despite lacking output_schema, description fully specifies return values ('total attempted, succeeded, failed counts, and per-item success/error details'). Covers batch limits (100 max, 50 recommended), destructive behavior (annotations + merge semantics), and workflow integration for a complex nested update operation.

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

Parameters4/5

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

With 100% schema coverage, description adds crucial semantic context: explains merge semantics on data field vs explicit clearing via clear_fields, clarifies dry_run validates 'IDs exist without committing', and contextualizes version_comment as applying to 'all updates' in the batch.

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

Purpose5/5

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

Description opens with specific verb ('Update') and resource ('content items'), explicitly quantifies scope ('up to 100'), and immediately distinguishes from sibling tool 'update_content' by stating 'Use instead of calling update_content in a loop'.

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

Usage Guidelines5/5

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

Explicitly identifies when to use this tool versus alternative ('Use instead of calling update_content in a loop'), provides workflow prerequisites ('Tip: call list_content...first'), and includes performance guidance ('Recommended batch size: up to 50 per call').

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

cancel_approval_requestCancel Approval RequestA
Destructive

Cancel a pending approval request.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesrequired,Approval request ID to cancel

TDQS

A3.5/5.0
Behavior3/5

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

The destructiveHint annotation already signals that this is a destructive operation. The description adds the useful constraint that only pending requests can be canceled, but it does not explain reversibility, permissions, or what exactly happens to the request after cancellation.

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

Conciseness5/5

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

The description is a single front-loaded sentence with no filler. For a simple one-parameter cancellation tool, this is appropriately sized and every word earns its place.

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

Completeness3/5

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

Given the simple parameter set and the destructiveHint annotation, the description is minimally sufficient to invoke the tool. However, it omits how this tool relates to sibling approval operations such as reject_request and does not describe post-cancellation behavior or return values.

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

Parameters3/5

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

Schema description coverage is 100%, so the single id parameter is already documented in the schema. The description adds no additional parameter meaning, syntax, or format details beyond what the schema provides, making 3 the appropriate baseline.

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

Purpose4/5

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

The description uses a specific verb and resource: 'Cancel a pending approval request.' It clearly distinguishes cancellation from reading or listing, but it does not differentiate from siblings like reject_request or approve_request, which would require explicit comparison.

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

Usage Guidelines3/5

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

The phrase 'pending approval request' implies the tool should only be used when the request is still pending, which is a basic usage condition. However, it gives no explicit guidance on when to choose cancel versus reject_request or other approval-related tools.

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

cancel_import_jobCancel Import JobB
Destructive

Cancel a running import job

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesImport job ID to cancel,required

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and openWorldHint=false, so safety is covered structurally. The description adds the meaningful detail that only a *running* job is a valid target, but says nothing about reversibility, what happens to already-imported content, or auth/permission requirements.

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

Conciseness4/5

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

A single front-loaded sentence with no filler or redundancy. It is tersely efficient, though arguably it could spend one more clause on the caller's obligation without becoming bloated.

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

Completeness3/5

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

For a one-parameter tool with destructive annotations and no output schema, the description covers the essentials. It is adequate but leaves gaps on job-state preconditions and what happens to partial import state, which for a destructive operation would be worth a sentence.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'id' parameter is already documented as 'Import job ID to cancel'. The description adds nothing beyond the schema, so the baseline 3 for a fully-covered schema applies.

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

Purpose4/5

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

States a specific verb ('Cancel') and resource ('import job') with the qualifier 'running' that scopes the operation. The agent can distinguish it from cancel_approval_request and cancel_scheduled_publish by resource, though the description never explicitly contrasts with those siblings.

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

Usage Guidelines2/5

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

No when-to-use guidance, no prerequisites (e.g. job must be running), and no mention of alternatives like cancel_approval_request. The 'running' qualifier faintly implies a precondition but stops short of stating it as guidance.

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

cancel_scheduled_publishCancel Scheduled PublishB
Idempotent

Clear the scheduled publish time for a content item.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_idYesContent item ID,required

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, so the safety profile is covered and the description's only added detail is that the specific field being cleared is the scheduled publish time. It does not say what happens if no schedule exists, whether the content's published/draft state changes, or what permissions are required.

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

Conciseness4/5

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

A single sentence with zero filler, front-loading the verb and the target of the operation. It is arguably too terse for the behavioral gaps it leaves, but as a sizing judgment it is efficient and well-structured.

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

Completeness3/5

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

For a simple one-parameter mutation whose idempotency and safety are covered by annotations, this is mostly adequate. Gaps remain around the resulting content state after cancellation and whether a missing schedule is an error or a no-op.

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

Parameters3/5

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

There is a single required parameter with 100% schema description coverage, so the schema fully documents content_id and the description adds nothing beyond it. Baseline 3 is appropriate when the schema carries the parameter semantics.

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

Purpose4/5

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

States a specific verb (clear) and object (the scheduled publish time) scoped to a content item, which is easy to distinguish from its inverse sibling schedule_content_publish. It does not explicitly name that sibling or clarify the relationship, but the action itself is unambiguous.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus alternatives such as schedule_content_publish, unpublish_content, or delete_content. The use case is only inferable from the tool name and purpose statement.

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

create_approval_workflowCreate Approval WorkflowC

Create a new approval workflow. Trigger types: all_contributor, folder_path, template_id, tag. Mode: sequential or concurrent.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesrequired,sequential or concurrent
nameYesrequired,Workflow name
triggerYesrequired,Trigger type: all_contributor | folder_path | template_id | tag
approversNoOrdered list of approvers
descriptionNoOptional description
trigger_valueNoValue for the trigger (e.g. folder path or template ID)

TDQS

C2.9/5.0
Behavior2/5

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

Annotations supply only destructiveHint=false and a title, so the description carries most of the behavioral burden for a mutation tool. It says nothing about whether existing workflows are affected, conditional requirements (e.g. trigger_value needed only for folder_path/template_id), permission needs, or what happens on success. The two sentences merely restate values already present in 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.

Conciseness4/5

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

Two short sentences, front-loaded with the action before the field enumerations. It is compact and easy to scan, though the second sentence is largely redundant with schema-documented enum values.

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

Completeness3/5

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

There is no output schema, six parameters at full schema coverage, and only a minimal annotation set. The description is adequate for identifying the tool but leaves real gaps for a create-mutation call: conditional parameter requirements (trigger_value), approver ordering semantics under each mode, and any post-creation behavior.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3 and the schema already documents name, mode, trigger, approvers, description, and trigger_value. The description repeats the trigger and mode value sets but adds no conditional logic, e.g. which trigger types require trigger_value or how approver 'order' interacts with sequential vs concurrent mode.

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

Purpose4/5

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

States a specific verb and resource ("Create a new approval workflow"), making it distinguishable from update/get/delete/list approval-workflow siblings. It stops short of explicitly contrasting with destructive-sounding or overlapping siblings like submit_for_approval, but the intent is unambiguous.

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

Usage Guidelines2/5

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

The description never says when to use this tool versus update_approval_workflow, list_approval_workflows, or submit_for_approval, nor does it mention prerequisites such as required permissions. The trigger-type and mode lists are enumerations of field values, not usage guidance.

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

create_collectionCreate CollectionB

Create a new content collection. Collections display grouped content with custom templates.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCollection name,required
slugYesCollection URL slug,required
categoryNoContent category to include
sort_fieldNoField to sort by
sort_orderNoSort order: asc or desc
descriptionNoCollection description
item_templateNoHTML template for each item
page_templateNoHTML template for collection page
items_per_pageNoItems per page for pagination

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already indicate this is non-destructive (destructiveHint: false) and closed-world (openWorldHint: false). The description adds value by explaining what collections do behaviorally ('display grouped content with custom templates'), but omits other behavioral details like error conditions (e.g., slug uniqueness constraints), authentication requirements, or what the tool returns.

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

Conciseness5/5

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

The description is efficiently structured with two sentences: the first states the action, the second provides behavioral context. No words are wasted, and the information is front-loaded appropriately.

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

Completeness3/5

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

Given 9 parameters and no output schema, the description adequately covers the basic purpose but leaves significant gaps. It lacks information about the created resource's structure, error scenarios (e.g., duplicate slug handling), or how this relates to sibling operations like update_collection or list_collections.

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

Parameters3/5

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

With 100% schema description coverage, the schema carries the full documentation burden for all 9 parameters. The description references 'custom templates' which loosely maps to item_template and page_template parameters, but adds no semantic details beyond the schema such as valid slug formats, category filtering logic, or the relationship between sort_field and sort_order.

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

Purpose4/5

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

The description clearly states the action ('Create') and resource ('content collection'), and adds distinguishing context that collections 'display grouped content with custom templates.' However, it does not explicitly differentiate from siblings like create_content or create_folder, leaving ambiguity about when to use collections versus individual content items or folders.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives (e.g., create_folder for organization, create_content for individual items) or prerequisites needed before invocation. There are no explicit when/when-not conditions.

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

create_commentPost CommentA

Post a discussion comment on a content item. Requires discussion.post permission.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesrequired,Comment text
mentionsNoOptional list of user ID strings to mention
content_idYesrequired,Content ID to post a comment on

TDQS

A3.5/5.0
Behavior3/5

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

Annotations are thin (only destructiveHint=false), so the description carries most of the disclosure burden. It usefully adds the required permission scope, but says nothing about whether mentions trigger notifications, whether comments are moderated, or what side effects posting has.

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

Conciseness5/5

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

Two short sentences with zero filler, and the core action is front-loaded before the permission caveat. Every sentence earns its place.

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

Completeness3/5

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

For a simple 3-parameter creation tool with full schema coverage, the description covers the action and the permission gate. It is adequate but incomplete: with no output schema, an agent gets no signal about the return value (e.g., the created comment ID) or the behavior of mentions.

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

Parameters3/5

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

Schema description coverage is 100% (text, mentions, content_id all documented in the schema), so the baseline of 3 applies. The description adds no syntax, ID format, or semantics for the mentions array or content_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.

Purpose4/5

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

The description states a specific verb and resource ('Post a discussion comment on a content item'), making it clearly distinguishable from list_comments and delete_comment by the create action. It stops short of explicitly differentiating itself from sibling comment tools, but the purpose is unambiguous.

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

Usage Guidelines3/5

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

It discloses a prerequisite ('Requires discussion.post permission'), which tells the agent the operation may fail without that scope. However, it gives no when-to-use framing, no exclusions, and never points to alternatives like list_comments or delete_comment, so usage context is only implied.

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

create_contentCreate ContentA

Create a new content item. Requires a template_id, title, slug, and the data fields defined by the template.

Workflow:

  1. Call list_templates to find the right template and its field names.

  2. Create the content with data matching those fields.

  3. Call publish_content to make it live (or set published=true here to do both in one step).

Set use_header=true, use_footer=true, use_theme=true for pages that should use the site layout. Always include version_comment to make history readable.

Content data fields support rich markup features:

  • [[Wikilinks]] and [[Page Title|display text]] — link to other pages by title or path; auto-update when paths change

  • [[include:snippet-name]] — embed a named snippet inline (reusable callouts, CTAs, disclaimers)

  • #hashtags — mention #tagname anywhere to automatically tag the page

  • Markdown fields (type "markdown") — GitHub Flavored Markdown converted to HTML at publish time Templates can use {{.lc_toc}} in their HTML layout to inject an auto-generated table of contents.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesTemplate field values,required
holdNoPut the page on hold: it cannot be published (directly, in bulk, on a schedule or by merging a fork) until hold is cleared. Cannot be combined with published=true
slugYesURL slug for the content,required
tagsNoTags for lc:query index pages (e.g. ['AI & Machine Intelligence', 'Generative AI'])
titleYesContent title,required
upsertNoIf true, update existing content at the same path instead of returning a duplicate key error
noindexNoHide this page from search engines and AI (noindex; excluded from sitemap, llms.txt, feeds, IndexNow)
categoryNoContent category for collections
og_imageNoOpen Graph image URL
raw_modeNoUse raw HTML mode
publishedNoPublish immediately
use_themeNoApply site theme/layout
author_urlNoAuthor profile URL
use_footerNoInclude site footer
use_headerNoInclude site header
author_nameNoAuthor name for structured data and feeds (defaults to the site author)
folder_pathNoFolder path (e.g., /blog)
template_idYesTemplate ID (MongoDB ObjectID),required
version_commentNoOptional comment describing this version
meta_descriptionNoSEO meta description

TDQS

A4/5.0
Behavior4/5

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

Annotations only declare openWorldHint=false and destructiveHint=false; the description adds substantial behavioral context beyond them, including publish-time Markdown conversion, wikilink auto-updating on path changes, snippet inclusion, hashtag-based tagging, and {{.lc_toc}} injection. It omits permission/auth requirements and side effects like index/feed regeneration, so it is strong but not complete.

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

Conciseness4/5

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

Front-loaded with the core action and required inputs, then a numbered workflow, then flag guidance. The bulleted markup feature list is longer than strictly necessary for tool selection, but each item describes how the data parameter is interpreted, so it is largely load-bearing.

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

Completeness4/5

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

For a 20-parameter create tool with full schema coverage and no output schema, the description covers the required flow, layout flags, and content-data conventions. It is silent on several optional params (hold, upsert, noindex, og_image, folder_path) and on duplicate-slug failure behavior, but the schema carries those.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains that data must match template field names (discoverable via list_templates), that use_header/use_footer/use_theme apply the site layout, that version_comment should always be set for readable history, and that published=true overlaps with publish_content.

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

Purpose4/5

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

States a specific verb and resource ('Create a new content item') and immediately names the required inputs, so it is clearly separable from create_template, create_collection, and create_snippet. It does not explicitly distinguish itself from single-item vs. bulk creation (bulk_create_content) or import paths, which keeps it below a 5.

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

Usage Guidelines4/5

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

Provides an explicit three-step workflow (list_templates -> create -> publish_content) and states the alternative condition for combining steps with published=true. It does not say when NOT to use this tool (e.g., for many items use bulk_create_content, or for edits use update_content), so guidance is clear but not exhaustive.

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

create_folderCreate FolderB

Create a new content folder. Folders create URL path segments for organizing content.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name for the folder,required
slugYesURL segment for the folder,required
parent_idNoParent folder ID for nested folders

TDQS

B3.3/5.0
Behavior3/5

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

Adds valuable context that folders create URL path segments (behavioral effect beyond creation), which complements the non-destructive annotation. However, omits error conditions, return value structure, and side effects like validation rules.

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

Conciseness5/5

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

Two sentences with zero waste. Front-loaded with the core action, followed by functional context. Every word earns its place.

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

Completeness3/5

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

Adequate for a simple 3-parameter creation tool with complete schema coverage and safety annotations. Covers the 'what' and 'why' (organization/URLs) but lacks guidance on hierarchical usage patterns and return values expected from the server.

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

Parameters3/5

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

With 100% schema description coverage, baseline is 3. The description reinforces the 'slug' parameter's purpose via 'URL path segments' but does not add syntax details, validation rules, or explicit notes about parent_id being optional for root folders.

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

Purpose4/5

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

States specific verb 'Create' and resource 'content folder'. The mention of 'URL path segments' adds distinguishing context from sibling tools like create_collection or create_content, though it lacks explicit contrast with those alternatives.

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

Usage Guidelines2/5

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

No guidance on when to use folders vs. collections or content items, nor mention of prerequisites like unique slug requirements or valid parent_id constraints. Purely definitional description.

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

create_forkCreate ForkA

Create a new named fork workspace for staging content changes.

A fork is an isolated workspace where you can edit copies of live pages without affecting the public site. When ready, an admin can merge the fork to push all changes live at once.

Typical workflow:

  1. create_fork — create the workspace

  2. fork_page — copy pages you want to edit into the fork (returns a fork page ID)

  3. update_content (with the fork page ID) — make your edits

  4. merge_fork — merge all changes to the live site (admin only)

Returns the fork ID needed for subsequent fork operations.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFork workspace name,required
descriptionNoOptional description of what this fork is for

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate non-destructive; description adds valuable behavioral context including isolation guarantees ('without affecting the public site'), return value disclosure ('Returns the fork ID needed for subsequent fork operations'), and workflow sequencing. Could mention auth requirements or side effects for a 5.

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

Conciseness5/5

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

Four distinct segments: one-line summary, concept explanation, numbered workflow (4 steps), and return value note. Every sentence earns its place with zero redundancy. Clear front-loading with the essential action stated immediately.

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

Completeness5/5

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

Excellent completeness given no output schema exists: description explicitly states the return value (fork ID). Covers the full lifecycle context (creation through merge), explains relationship to live site, and provides sufficient detail for a workspace creation tool with 100% schema coverage.

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

Parameters3/5

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

Schema coverage is 100% (both 'name' and 'description' parameters fully documented in schema). Description references 'named fork workspace' which aligns with the name parameter, but adds no syntax, format, or example details beyond what the schema already provides. Baseline 3 is appropriate.

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

Purpose5/5

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

Opens with specific verb+resource: 'Create a new named fork workspace for staging content changes.' Explains what a fork is (isolated workspace) and distinguishes from siblings by explicitly positioning it as step 1 in a 4-step workflow distinct from fork_page, update_content, and merge_fork.

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

Usage Guidelines5/5

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

Provides explicit typical workflow with numbered steps showing exactly when to use this tool (step 1: create workspace) versus alternatives (step 2: fork_page, step 3: update_content, step 4: merge_fork). Also clarifies admin restriction applies to merge step, helping users understand this tool's prerequisites.

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

create_import_sourceCreate Import SourceB

Create a new RSS/Atom import source that automatically pulls content from a feed

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesRSS/Atom feed URL,required
nameYesName of the import source,required
activeNoWhether the source is active (default true)
scheduleNoImport schedule: hourly, daily, or weekly (default daily)
folder_pathNoFolder path for imported content (e.g., /blog/imported)
auto_publishNoAutomatically publish imported content (default false)
template_nameNoTemplate name to use for imported content

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds that the source automatically pulls feed content, hinting at ongoing/scheduled behavior, but says nothing about permissions or the effect of the schedule/auto_publish flags. With annotations doing the heavy lifting, a 3 is appropriate.

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

Conciseness5/5

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

A single front-loaded sentence with zero waste; the verb and resource lead and the clarifying clause follows immediately. Nothing extraneous and no padding.

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

Completeness3/5

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

For a 7-parameter creation tool the description is thin: the schema documents every field and annotations cover safety, but there is no usage context, prerequisite info, or mention of what happens after creation. Adequate but with visible gaps an agent must infer.

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

Parameters3/5

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

Schema description coverage is 100%, so all seven parameters including defaults (active, schedule, auto_publish) are already documented in the schema. The description adds no syntax or behavioral meaning beyond what the structured fields provide, so the baseline of 3 applies.

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

Purpose4/5

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

The description states a specific verb and resource ('Create a new RSS/Atom import source') and clarifies the effect ('automatically pulls content from a feed'). An agent can distinguish it from list/update/delete/trigger siblings by function, though it never names an alternative to sharpen the distinction.

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

Usage Guidelines2/5

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

No explicit when-to-use guidance, prerequisites, or routing to alternatives such as update_import_source or trigger_import_source. The purpose is inferable but the agent gets no help choosing between this and sibling import tools.

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

create_redirectCreate RedirectA

Create a new URL redirect. Use 301 for permanent redirects, 302 for temporary.

ParametersJSON Schema
NameRequiredDescriptionDefault
to_pathYesDestination path or URL (e.g., /new-page),required
from_pathYesSource path (e.g., /old-page),required
descriptionNoOptional description/note
status_codeNo301 (permanent) or 302 (temporary), defaults to 301

TDQS

A3.6/5.0
Behavior3/5

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

Annotations declare destructiveHint=false and openWorldHint=false, covering safety profile. The description adds context about redirect permanence (301 vs 302 behavior), but omits details on propagation delay, validation rules, or conflicts with existing paths.

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

Conciseness5/5

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

Two sentences, zero waste. First states purpose; second provides specific HTTP status guidance. Efficiently structured without extraneous text.

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

Completeness4/5

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

Adequate for a 4-parameter creation tool with complete schema annotations. Given the lack of output schema and simple flat structure, the description covers the essential behavioral context (permanent vs temporary) to supplement the structured data.

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

Parameters3/5

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

Schema coverage is 100% with complete descriptions for all four parameters. The description text reinforces the status_code semantics but adds no new information beyond what the schema already provides. Baseline 3 is appropriate for high-coverage schemas.

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

Purpose4/5

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

Clear verb (Create) + resource (URL redirect). The mention of 301/302 status codes distinguishes this from generic content creation tools like create_content or create_folder. However, it does not explicitly differentiate from sibling update_redirect regarding when to create new vs update existing.

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

Usage Guidelines3/5

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

Provides specific guidance on status_code values ('Use 301 for permanent...'), which helps parameter selection. However, lacks guidance on when to use this tool versus alternatives (e.g., update_redirect for modifying existing redirects) or prerequisites.

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

create_snippetA

Create a new snippet. Snippets are Go templates that render one content item in an lc:query index page. Reference by name:

ParametersJSON Schema
NameRequiredDescriptionDefault
htmlYesGo template HTML. Available fields: .Title .FullPath .Tags .MetaDescription .Category .Data,required
nameYesSnippet name (used in lc:query directives),required

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare non-destructive and closed-world. Description adds crucial behavioral context: snippets are Go templates (implementation), render single content items (scope), and integrate specifically into lc:query directives (system integration point). Does not mention idempotency or duplicate name handling.

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

Conciseness5/5

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

Three sentences with zero waste: defines action, explains domain concept (Go template + lc:query), and provides usage example. Front-loaded with essential information. Appropriate length for 2-parameter tool.

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

Completeness4/5

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

Complete for a simple creation tool with good annotations. Explains the templating domain, available integration points, and reference syntax. Lacks explicit error behavior documentation (e.g., name collision handling), but otherwise covers the 2-parameter surface adequately.

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

Parameters3/5

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

Schema coverage is 100% with complete descriptions for both 'name' and 'html' parameters. Description mentions 'Go templates' which reinforces the html parameter type, but does not add semantic detail beyond what the schema already provides. Baseline 3 appropriate for high schema coverage.

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

Purpose5/5

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

Clear specific verb ('Create') + resource ('snippet'). Distinguishes from siblings (create_template, create_content) by defining snippets as 'Go templates that render one content item in an lc:query index page' and showing the HTML comment reference syntax.

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

Usage Guidelines4/5

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

Provides explicit usage context via the lc:query HTML comment example showing how to reference the snippet by name after creation. Explains the specific domain (lc:query index pages). Lacks explicit contrast with create_template, but implied by the specialized definition.

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

create_templateCreate TemplateB

Create a new template. Define fields with name, label, type (text, textarea, richtext, date, image, select), and options.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTemplate name,required
slugYesTemplate slug for URLs,required
fieldsYesTemplate fields definition,required
categoryNoTemplate category for grouping
descriptionNoTemplate description
html_layoutYesHTML layout with {{.FieldName}} placeholders,required

TDQS

B3.3/5.0
Behavior3/5

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

Annotations declare destructiveHint=false (safe operation). Description adds context about field definition structure but fails to disclose validation behavior (e.g., conflict handling for duplicate slugs), return value structure, or relationship between fields and html_layout placeholders.

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

Conciseness4/5

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

Two efficient sentences with no redundancy. Second sentence is dense but information-rich. Could benefit from separating field type enumeration from field structure explanation for clarity.

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

Completeness3/5

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

With 100% schema coverage and 6 parameters including complex nested structures, the description adequately covers the fields parameter. Missing: explanation of how html_layout references fields via {{.FieldName}}, success indicators, and error conditions.

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

Parameters4/5

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

Schema has 100% coverage establishing baseline of 3. Description adds significant value by enumerating valid type values (text, textarea, richtext, date, image, select) not constrained in schema, and clarifies the fields array structure implicitly.

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

Purpose4/5

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

States specific verb 'Create' and resource 'template'. Lists specific field types (text, textarea, richtext, date, image, select) which helps distinguish from sibling creation tools like create_content or create_collection. However, lacks explicit differentiation from update_template.

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

Usage Guidelines2/5

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

Provides no guidance on when to use this versus update_template, no prerequisites mentioned (e.g., slug uniqueness requirements), and no workflow context. The agent must infer usage solely from the name.

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

create_webhookCreate WebhookA

Create a new webhook. Returns the generated HMAC-SHA256 secret ONCE — save it immediately.

Valid event types: content.create, content.update, content.publish, content.unpublish, content.delete, comment.created, content.pending_approval, asset.pending_review

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesEndpoint URL to deliver events to,required
nameYesName for the webhook,required
activeNoWhether the webhook is active (default true)
eventsYesEvent types to subscribe to (e.g. content.publish),required

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only cover openWorldHint and destructiveHint; the description adds the genuinely important trait that the HMAC-SHA256 secret is returned ONCE and must be saved immediately — critical operational context the agent could not infer. It stops short of stating permission/auth requirements or whether delivery is verified by the caller.

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

Conciseness4/5

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

The one-time-secret warning is front-loaded right after the purpose statement, and the event list is compact. Slightly deductive that the event enumeration arguably belongs in the schema rather than prose, but every sentence carries weight.

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

Completeness4/5

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

With no output schema, the description covers the key return value (the secret) and the full event vocabulary, and the schema handles defaults for `active`. Gaps are modest: no auth/permission prerequisites and no note on whether an inactive webhook can be created.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline would be 3, but the description supplies the closed list of valid event types for the `events` array while the schema has no enum and only an 'e.g.' example. That materially improves correctness of the most error-prone parameter.

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

Purpose5/5

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

States a specific verb and resource ('Create a new webhook') that cleanly separates it from the create/update/delete/list webhook siblings in the tool set. It goes further by enumerating the valid event types, so an agent understands the resource's domain without opening the schema.

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

Usage Guidelines3/5

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

Usage is only implied: the agent can infer this is the tool for registering a new endpoint, and the valid-event list implicitly tells it what can be subscribed to. There is no explicit when-to-use guidance and no routing to alternatives such as update_webhook or regenerate_webhook_secret.

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

delete_approval_workflowDelete Approval WorkflowC
Destructive

Delete an approval workflow.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesrequired,Workflow ID to delete

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, so the safety profile is covered. The description adds nothing beyond that: no statement about irreversibility, whether in-flight approval requests are affected, 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.

Conciseness4/5

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

A single front-loaded sentence with no filler. It is tight, though its brevity reflects under-specification rather than disciplined concision.

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

Completeness2/5

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

For a destructive mutation with one required id and no output schema, the description omits the consequences an agent needs: irreversibility, effect on existing approval requests, and confirmation expectations. Annotations cover the destructive flag but not these operational details.

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

Parameters3/5

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

Schema description coverage is 100% and the single id parameter is documented in the schema as 'Workflow ID to delete'. Baseline 3 applies since the schema fully carries parameter detail and the description adds no additional format or syntax meaning.

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

Purpose4/5

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

States a specific verb (Delete) and resource (approval workflow), matching the title exactly. It does not differentiate from siblings like delete_template, delete_redirect, or delete_webhook, but the resource is unambiguous.

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

Usage Guidelines2/5

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

No guidance on when to use this versus alternatives such as update_approval_workflow or cancel_approval_request, and no prerequisites or warnings about when deletion is inappropriate.

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

delete_assetDelete AssetA
DestructiveIdempotent

Delete an asset from the library. Removes both the file and database record.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAsset ID (MongoDB ObjectID),required

TDQS

A3.7/5.0
Behavior4/5

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

While annotations declare destructiveHint=true, the description adds valuable scope context: 'Removes both the file and database record' clarifies this affects both filesystem and database layers. Does not mention idempotency behavior (covered by annotation) or error conditions (e.g., non-existent ID), but adds concrete destruction scope.

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

Conciseness5/5

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

Optimal two-sentence structure. First sentence delivers core action immediately. Second sentence adds necessary scope clarification without redundancy. Zero padding or generic filler. Front-loaded with critical information.

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

Completeness3/5

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

Adequate for a single-parameter delete operation: annotations cover safety profile (destructive, idempotent), description covers deletion scope. However, lacks mention of error behaviors (404 if ID missing?), return values, or prerequisites (permissions, asset state constraints).

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

Parameters3/5

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

Schema coverage is 100% with the ID parameter fully documented as 'Asset ID (MongoDB ObjectID)'. Description provides no additional parameter semantics, but with complete schema coverage, the baseline score of 3 is appropriate—no compensation needed.

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

Purpose5/5

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

Excellent specificity: verb 'Delete' + resource 'asset' + location 'library'. Second sentence clarifies scope (file + database record), distinguishing from logical deletes or metadata-only removals. Clear differentiation from siblings like delete_content, delete_folder, etc. by specifying 'asset'.

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

Usage Guidelines2/5

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

No explicit guidance on when to use versus alternatives (e.g., no mention of archive_asset if it existed, or bulk operations), no prerequisites stated (e.g., checking if asset is in use), and no 'when-not-to-use' guidance. Only implicit use case from the verb itself.

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

delete_collectionDelete CollectionA
DestructiveIdempotent

Delete a collection. This does not delete the content in the collection.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCollection ID (MongoDB ObjectID),required

TDQS

A3.8/5.0
Behavior4/5

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

Annotations declare destructiveHint=true, but the description adds crucial behavioral context: the deletion is container-only and preserves content. This prevents the safety assumption that 'destructive' applies to nested content. No contradictions with annotations.

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

Conciseness5/5

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

Two sentences with zero waste. First establishes the action, second clarifies scope/safety. Perfectly front-loaded and appropriate length for the tool complexity.

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

Completeness4/5

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

Sufficient for a single-parameter destructive operation. Critical safety information (content preservation) is covered. Could optionally clarify what happens to orphaned content, but adequate given annotations cover idempotency and destructiveness.

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

Parameters3/5

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

Schema has 100% description coverage ('Collection ID (MongoDB ObjectID),required'), so baseline applies. Description adds no parameter-specific semantics, but the schema handles this adequately.

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

Purpose4/5

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

Clear verb (Delete) and resource (collection). The second sentence ('This does not delete the content...') begins to distinguish from siblings by clarifying scope, though it could more explicitly differentiate from delete_content or delete_folder.

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

Usage Guidelines3/5

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

Provides implicit guidance through the negative constraint about content preservation, helping prevent misuse. However, lacks explicit 'when to use' guidance or comparison to alternatives like archive_fork or bulk operations.

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

delete_commentDelete CommentB
Destructive

Delete a discussion comment. Requires comment.delete permission (admin only).

ParametersJSON Schema
NameRequiredDescriptionDefault
comment_idYesrequired,Comment ID to delete
content_idYesrequired,Content ID the comment belongs to

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, so the destructive nature is covered structurally. The description usefully adds the permission/auth requirement (admin only, comment.delete), which is real context beyond annotations. It does not say whether the deletion is permanent or how threaded replies are handled.

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

Conciseness5/5

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

Two short sentences with zero filler; the purpose is front-loaded and the constraint follows immediately. Every word earns its place.

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

Completeness4/5

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

For a simple two-parameter delete operation with full schema coverage and a destructiveHint annotation, the description covers purpose and access requirements adequately. The only meaningful gap is cascade/reversibility behavior, which an agent might want for a delete on threaded content.

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

Parameters3/5

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

Schema description coverage is 100%, so both comment_id and content_id are already documented in the schema. The description adds nothing about parameter formats or constraints, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb+resource (delete a discussion comment), which is unambiguous. It does not, however, distinguish itself from siblings like create_comment or list_comments, so it stops short of a 5.

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

Usage Guidelines2/5

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

The description gives a prerequisite (comment.delete permission, admin only) but no guidance on when to use this tool versus alternatives or when not to use it. There is no routing or context information for an agent choosing among the many sibling tools.

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

delete_contentDelete ContentA
DestructiveIdempotent

Soft-delete a content item. The content can be restored later. Removes the static HTML page.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContent ID (MongoDB ObjectID),required

TDQS

A4/5.0
Behavior4/5

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

Adds significant value beyond annotations: clarifies 'soft-delete' semantics (recoverable destruction), states the specific side effect of 'Removes the static HTML page,' and confirms idempotency through the restoration capability. No contradictions with destructiveHint=true or idempotentHint=true.

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

Conciseness5/5

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

Three sentences, all essential: defines operation, states recoverability (critical for soft-delete), and specifies side effect. No redundant or wasted words. Information is front-loaded with the core action.

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

Completeness4/5

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

Comprehensive for a deletion tool: covers soft-delete semantics, recovery path, and specific side effects (HTML removal). Annotations provide safety hints (destructive, idempotent). No output schema present but unnecessary for this operation type given idempotency disclosure.

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

Parameters3/5

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

With 100% schema description coverage for the single 'id' parameter, the schema fully carries the parameter semantics load. Description adds no parameter-specific details, which is appropriate given the high schema coverage baseline.

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

Purpose5/5

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

States specific action 'Soft-delete' targeting a 'content item' and distinguishes from hard-delete siblings by noting it 'can be restored later.' Also differentiates from other delete_* tools (delete_asset, delete_folder, etc.) by specifying the content resource type.

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

Usage Guidelines3/5

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

Implies reversibility ('can be restored later') which hints at the restore_content sibling tool, but lacks explicit when-to-use guidance or comparisons against alternatives like archive_fork. Provides minimum viable context for agent selection.

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

delete_folderDelete FolderA
DestructiveIdempotent

Delete an empty folder. Cannot delete folders that contain content or subfolders.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFolder ID (MongoDB ObjectID),required

TDQS

A4/5.0
Behavior4/5

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

Annotations declare destructiveHint=true and idempotentHint=true. The description adds crucial behavioral context: the empty-folder constraint (precondition) and implied failure mode for non-empty targets, which annotations do not cover.

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

Conciseness5/5

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

Two sentences with zero waste: first states the operation, second states the critical constraint. Front-loaded and appropriately sized for the tool's complexity.

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

Completeness4/5

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

Adequate for a simple single-param destructive tool. Annotations cover safety/destructive traits; description covers the primary business logic constraint (empty-only). No output schema exists to document.

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

Parameters3/5

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

Input schema has 100% description coverage for the single 'id' parameter. The description does not reference parameters, but the schema is self-documenting, meeting the baseline score for high-coverage schemas.

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

Purpose4/5

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

Specific verb (Delete) + resource (folder) with clear scope constraint (empty only). The empty-folder restriction distinguishes it from broader delete operations like delete_content or delete_collection, though it doesn't explicitly name sibling alternatives.

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

Usage Guidelines4/5

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

Provides explicit 'when' (empty folder) and 'when-not' (contains content/subfolders) guidance. Missing specific alternative tool recommendations for handling non-empty folders, but the constraint is clearly actionable.

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

delete_forkDelete ForkA
Destructive

Permanently delete a fork and all its page copies. Deleting a merged fork removes only its history record (and any leftover copies) — the merged live pages are not affected. Requires admin role.

ParametersJSON Schema
NameRequiredDescriptionDefault
fork_idYesFork workspace ID to permanently delete,required

TDQS

A4/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and openWorldHint=false, so the safety profile is covered. The description goes well beyond that, disclosing exactly what is destroyed (all page copies), the merged-fork exception where only the history record is removed and live pages survive, and the required admin role. That is exactly the added behavioral context the description should carry.

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

Conciseness5/5

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

Three tight sentences, each earning its place: permanent destruction is front-loaded, the merged-fork exception follows, and the auth requirement closes. Zero filler.

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

Completeness4/5

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

For a one-parameter destructive tool with annotations covering safety and no output schema to explain, the description covers the critical what-gets-destroyed semantics and the admin prerequisite. The only minor gap is failure/error behavior (e.g., deleting a nonexistent or already-deleted fork).

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

Parameters3/5

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

Schema description coverage is 100%, and the single fork_id parameter is documented in the schema, so baseline is 3. The description adds only the implication that the fork is targeted for permanent deletion, no format or identifier detail beyond the schema.

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

Purpose4/5

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

The description gives a specific verb and resource ('Permanently delete a fork') and clarifies scope ('and all its page copies'). This distinguishes it conceptually from siblings like archive_fork, though it never names those siblings explicitly. Clear purpose, but no direct sibling routing.

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

Usage Guidelines3/5

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

It explains a genuine usage split — behavior for merged vs unmerged forks — which helps an agent anticipate the outcome. However, it gives no explicit guidance on when to choose this tool over archive_fork, purge_fork_copies, or remove_fork_page. Usage is implied rather than prescribed.

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

delete_import_sourceDelete Import SourceC
DestructiveIdempotent

Delete an RSS import source

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesImport source ID,required

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered structurally; the description adds nothing on top of that. It does not say whether previously imported content is removed, whether dependent import jobs are cancelled, or whether the operation can be undone.

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

Conciseness3/5

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

A single front-loaded phrase with zero waste, but its brevity reflects under-specification rather than disciplined concision. Nothing is padded, yet nothing beyond the title is conveyed.

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

Completeness2/5

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

For a destructive mutation, the description omits the consequences that matter most: what data is destroyed and what happens to any content already imported from the source. Annotations cover the safety flags and the schema covers the ID, but the destructive-impact picture an agent needs before calling this is missing.

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

Parameters3/5

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

One parameter with 100% schema description coverage, so the schema already documents the required 'id'. The description contributes no additional semantics about the ID format or source of the value, making 3 the correct baseline.

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

Purpose4/5

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

States a specific verb and resource ('Delete an RSS import source'), which cleanly separates it from siblings like list_import_sources, create_import_source, update_import_source, and trigger_import_source. It stops short of 5 because it names no sibling explicitly, though the resource noun does the disambiguation work.

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

Usage Guidelines2/5

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

There is no guidance on when to delete an import source versus deactivating or triggering it, no mention of prerequisites or side effects, and no warning about irreversibility. The agent must infer all usage context from the tool name alone.

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

delete_redirectDelete RedirectC
DestructiveIdempotent

Delete a redirect.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRedirect ID (MongoDB ObjectID),required

TDQS

C2.4/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, establishing this is a destructive, repeatable operation. The description adds no additional behavioral context such as whether deletion is permanent, if there are cascading effects on linked content, or recovery options. It does not contradict the annotations.

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

Conciseness3/5

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

While extremely brief and front-loaded, the three-word description is so minimal it constitutes under-specification rather than efficient conciseness. It wastes no words, but also provides no informational value beyond the tool name itself.

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

Completeness3/5

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

Given the simplicity (single ID parameter), strong annotations, and complete schema coverage, the description is minimally sufficient for an agent to identify the tool's scope. However, it fails to enrich the structured data with any additional context about redirects or deletion behavior.

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

Parameters3/5

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

With 100% schema description coverage, the parameter 'id' is already well-documented in the schema as 'Redirect ID (MongoDB ObjectID),required'. The description adds no parameter-specific guidance, syntax details, or examples, warranting the baseline score for complete schema coverage.

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

Purpose2/5

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

The description 'Delete a redirect' is a tautology that restates the tool name/title with only slight modification (adding an article). While it identifies the resource type (redirect), it fails to distinguish this tool from sibling deletion tools like delete_content or delete_asset beyond what is already implied by the tool name.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives such as update_redirect (for modifying vs. removing) or create_redirect. There are no prerequisites, conditions, or exclusion criteria mentioned.

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

delete_snippetC
Destructive

Delete a snippet by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSnippet ID (MongoDB ObjectID),required

TDQS

C2.9/5.0
Behavior2/5

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

While the destructiveHint annotation confirms this is destructive, the description adds no behavioral context about what happens to content referencing the deleted snippet, whether this is a hard delete or soft delete, or error conditions if the ID is not found.

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

Conciseness4/5

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

The four-word description is efficiently front-loaded with no redundant information. However, extreme brevity for a destructive operation leaves it under-specified for the risk level involved.

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

Completeness3/5

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

Given the simple single-parameter input and lack of output schema, the description minimally covers the operation but omits critical context for a destructive tool: cascading effects, restore possibilities, and return status expectations.

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

Parameters3/5

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

With 100% schema coverage describing the MongoDB ObjectID requirement, the description meets the baseline. It mentions 'by ID' which aligns with the schema but adds no additional semantic context about ID format constraints or validation beyond the schema definition.

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

Purpose4/5

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

The description clearly states the verb (Delete) and resource (snippet), distinguishing it from sibling delete operations on assets, collections, or folders. However, it lacks explicit scoping details that would elevate it to a 5, such as clarifying this is for permanent single-item removal versus archiving.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like bulk_field_operation, nor does it mention prerequisites (e.g., whether the snippet must be unreferenced first) or irreversibility warnings beyond the annotation.

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

delete_templateDelete TemplateA
DestructiveIdempotent

Delete a template. Cannot delete system templates or templates that have content using them.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTemplate ID (MongoDB ObjectID),required

TDQS

A4/5.0
Behavior4/5

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

Annotations cover destructiveness and idempotency. The description adds valuable behavioral context: validation rules preventing deletion of system templates and templates with dependencies. This explains failure modes not captured in annotations.

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

Conciseness5/5

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

Two sentences, zero waste. Front-loaded with the action ('Delete a template'), followed immediately by critical constraints. Every word earns its place.

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

Completeness4/5

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

Appropriate for a single-parameter deletion tool. Captures the essential constraint logic (system/dependency blocks). Lacks mention of return values, but destructiveness and idempotency hints reduce ambiguity for a delete operation without output schema.

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

Parameters3/5

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

Schema has 100% coverage with clear ID description ('Template ID (MongoDB ObjectID)'). The description references 'a template' implying identification is needed but does not augment the parameter documentation beyond the schema.

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

Purpose4/5

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

Clear verb ('Delete') and resource ('template'). The scope is implicit given the tool name and sibling tools (delete_content, delete_folder, etc.), though it could explicitly specify 'content template' to distinguish from potential email/code templates.

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

Usage Guidelines4/5

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

Strong explicit constraints: 'Cannot delete system templates or templates that have content using them.' This clearly identifies when the operation will fail. Lacks explicit alternatives (e.g., 'use archive instead'), but the constraints provide critical usage guardrails.

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

delete_webhookDelete WebhookB
DestructiveIdempotent

Permanently delete a webhook.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWebhook ID,required

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered structurally. The word "Permanently" reinforces irreversibility, which adds a little context, but the description says nothing about side effects (in-flight deliveries, subscriptions) or auth requirements beyond what annotations give.

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

Conciseness4/5

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

One sentence, front-loaded with the action and the irreversibility qualifier, with zero filler. It is efficient, though so terse that it does little work beyond the tool name.

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

Completeness3/5

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

For a single-parameter delete with destructive/idempotent annotations and no output schema, the essentials are present: the action, its permanence, and a fully documented ID. Missing are cascade/irreversibility details and any confirmation or error behavior, which keeps it at minimum-viable completeness.

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

Parameters3/5

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

The single id parameter has 100% schema description coverage, so the schema already carries the semantics. The description adds no format, ID-source, or validity guidance beyond that, making the baseline 3 appropriate.

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

Purpose4/5

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

States a specific verb (delete) and resource (webhook) plus the permanence qualifier, so an agent can distinguish it from update_webhook, create_webhook, or regenerate_webhook_secret. It stops short of explicitly naming or routing against those siblings, 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.

Usage Guidelines2/5

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

There is no when-to-use guidance, no mention of alternatives (e.g., update_webhook if the agent only wants to modify), and no prerequisite such as needing a valid webhook ID or confirmation before a destructive call. The agent must infer everything from the name.

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

end_agent_sandboxEnd Agent SandboxA
Destructive

End the sandbox session. action='submit' keeps the fork for human review and merge (at /cm/forks/{id}); action='discard' permanently deletes the fork and all its changes. Agents cannot merge their own sandbox — merging is a human decision.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes'submit' keeps the fork and hands it to a human for review/merge; 'discard' deletes the fork and every change in it.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only give a blanket destructiveHint=true; the description resolves that ambiguity by specifying that 'discard' permanently deletes the fork and every change while 'submit' preserves it at /cm/forks/{id}. Disclosing the human-merge governance rule is behavior an agent cannot infer from annotations or schema.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the purpose, then the action semantics, then the governance constraint. No filler and nothing restating the tool title.

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

Completeness4/5

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

For a single-parameter tool with no output schema, the description covers both execution paths and the policy boundary, which is nearly everything an agent needs. It does not say what the call returns or what state the session is left in after 'submit', a minor gap given no output schema exists.

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

Parameters4/5

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

Schema coverage is 100% and the schema already defines both enum values, so 3 is the baseline. The description nonetheless adds the fork's review location (/cm/forks/{id}) and the irreversibility contrast between the two actions, which is slightly more than the schema conveys.

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

Purpose5/5

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

States a specific verb+resource ('End the sandbox session') and then unpacks the two terminal outcomes, keeping the fork for human review versus permanently deleting it. This clearly separates it from merge_fork and delete_fork, which are the nearest siblings an agent might 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.

Usage Guidelines4/5

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

Explicitly tells the agent which action to pick and why: 'submit' for human review/merge, 'discard' for permanent deletion. It also states a hard constraint (agents cannot merge their own sandbox), which is genuine when-to-use guidance. It stops short of saying when to prefer this over rollback_agent_session or get_agent_session_changes.

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

export_contentExport ContentA
Read-only

Export content items with their full field data as a structured JSON array.

Use for batch transformations: export → transform externally → re-import via bulk_update_content.

Scope filters (all optional):

  • template_name: most useful for bulk workflows, e.g. "Concept Page" or "Blog Post"

  • category, folder_path, content_ids: narrower scoping options

Use fields: ["field1", "field2"] to include only specific data fields instead of all fields.

Only live pages are exported: fork copies named in content_ids come back in "skipped" as {id, reason}.

Returns: total count and array of items with id, title, slug, full_path, template_name, published, and data.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoOnly include these field names (empty = all fields)
categoryNoFilter by category
content_idsNoExport only these specific IDs
folder_pathNoFilter by folder path prefix
template_nameNoFilter by template name

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral context: only live pages are exported and fork copies appear in 'skipped' as {id, reason}. It does not mention pagination or limits on large exports, but the fork/skipped disclosure is valuable beyond annotations.

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

Conciseness5/5

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

Front-loaded purpose sentence, then clearly sectioned scope filters, field selection, and return shape. Each line earns its place; the structured formatting makes scanning fast.

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

Completeness5/5

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

With no output schema, the description supplies the return shape (total count and item fields). For a zero-required-param read tool with full schema coverage, everything an agent needs to scope and call it correctly is present.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description goes further by annotating template_name as 'most useful for bulk workflows' with concrete examples ('Concept Page', 'Blog Post') and demonstrating the fields array syntax, adding meaning beyond the schema's terse descriptions.

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

Purpose5/5

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

States a specific verb (export) and resource (content items), plus the output form (structured JSON array with full field data). It is clearly distinguishable from siblings like list_content or get_content, which don't carry the batch-export/full-field intent.

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

Usage Guidelines5/5

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

Gives an explicit workflow (export → transform externally → re-import via bulk_update_content), naming the downstream sibling tool. Scope filters are described with guidance on which to prefer for bulk work.

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

force_unlock_contentForce Unlock ContentA
DestructiveIdempotent

Admin only: force-release any lock on a content item regardless of who holds it.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_idYesContent item ID,required

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely new context: an admin-only authorization requirement and the fact that this breaks a lock held by another party. It does not say what happens to the previous holder's work or whether the action is logged.

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

Conciseness5/5

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

One sentence, front-loaded with the authorization gate and the action, with zero redundant or decorative phrasing.

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

Completeness4/5

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

For a one-parameter admin action with no output schema and annotations covering the safety hints, the description is nearly sufficient. Only minor gaps remain, such as the error behavior when no lock exists or what the caller receives back.

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

Parameters3/5

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

Schema description coverage is 100% for the single content_id parameter, so the schema already carries the semantics. The description adds nothing about the identifier format or how to obtain it; baseline 3 applies when the schema does the work.

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

Purpose4/5

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

States a specific verb (force-release) and resource (lock on a content item) with the defining scope qualifier 'regardless of who holds it,' which cleanly separates it from the owner-scoped release_content_lock sibling. It stops short of naming that sibling, so the distinction must be inferred.

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

Usage Guidelines3/5

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

'Admin only' gives a clear permission prerequisite, and 'force-release any lock regardless of who holds it' implies the override scenario. However, it never explicitly says when to prefer this over release_content_lock or what situation warrants the override, leaving the routing decision implied.

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

fork_pageFork PageA
Idempotent

Copy a live page into a fork workspace so you can edit it without affecting the public site.

Provide either:

  • path: the URL path of the page (e.g. "/about", "/blog/my-post") — preferred when you know the URL

  • content_id: the MongoDB ObjectID of the content item

Returns the fork page ID. Use this ID with update_content to make edits:

  1. fork_page → get fork_page_id

  2. update_content with id=fork_page_id to edit

  3. get_content with id=fork_page_id to verify

  4. merge_fork when all edits are ready (admin only)

If the page is already in this fork, returns the existing fork copy.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoURL path of the live page to fork (e.g. /about). Use instead of content_id when you know the path.
fork_idYesFork workspace ID,required
content_idNoID of the live content item to fork into this workspace

TDQS

A4.7/5.0
Behavior4/5

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

Annotations provide idempotentHint:true and destructiveHint:false. Description adds valuable behavioral context: confirms idempotency with 'If the page is already in this fork, returns the existing fork copy', mentions output 'Returns the fork page ID', and notes admin requirements for the merge step. Does not contradict annotations.

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

Conciseness5/5

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

Front-loaded with purpose in first sentence. Efficiently structured with bullet points for parameter options and numbered list for workflow. Every sentence earns its place: purpose, input options, output/workflow, and idempotency edge case. No waste.

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

Completeness5/5

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

No output schema exists, but description documents return value (fork page ID) and complete lifecycle workflow including verification step. Covers edge case (already forked) and authorization note. Adequate for a complex CMS fork operation with 3 input parameters.

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

Parameters4/5

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

Schema has 100% coverage (baseline 3). Description adds selection guidance distinguishing path ('preferred when you know the URL') from content_id, and documents their mutual exclusivity via 'Provide either'. Adds semantic value beyond raw schema descriptions.

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

Purpose5/5

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

Opens with specific action 'Copy a live page into a fork workspace' plus clear benefit 'edit without affecting the public site'. Distinguishes from siblings like create_content (creates new) vs. forking existing, and explicitly references the workflow endpoint merge_fork.

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

Usage Guidelines5/5

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

Provides explicit 4-step workflow (fork_page→update_content→get_content→merge_fork) with tool names. Explains parameter selection logic ('preferred when you know the URL'). Notes authorization constraint 'admin only' for merge step. Handles idempotency case.

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

get_agent_sandboxGet Agent Sandbox StatusA
Read-only

Show whether an agent sandbox is active, and if so its fork ID, name, and the pages changed so far (with per-field diffs against live).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish the safe read-only profile, so the description's job is to add return semantics — and it does, enumerating fork ID, name, changed pages, and per-field diffs against live, plus the inactive case ('if so'). It stops short of stating what an inactive result looks like (null vs empty) or any error/pagination behavior.

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

Conciseness5/5

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

One sentence, front-loaded with the primary question (is it active) before the detail payload. No filler, no repetition of the title or annotations.

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

Completeness4/5

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

With no output schema, the description carries the full burden of describing the return value, and it does so reasonably well for a zero-parameter status tool. Missing only edge-case behavior: exact shape of the inactive response and whether diff detail is truncated for large change sets.

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

Parameters4/5

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

Zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. No key/ID input is accepted, meaning it operates on implicit session context, which the description does not clarify but also does not need to given the empty schema.

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

Purpose4/5

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

The description names a specific verb (show) and resource (agent sandbox) and states the scope of what is reported: activity status, fork ID, name, and changed pages. It is distinguishable from start_agent_sandbox/end_agent_sandbox, though its 'pages changed so far' overlap with get_agent_session_changes could blur the line with that sibling. Clear but not explicitly differentiated from every neighbor.

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

Usage Guidelines3/5

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

The read-only status framing implies usage (check sandbox state before acting on it), but it never states when to call this versus get_agent_session_changes, list_forks, or get_fork_diff. No prerequisites, no when-not guidance, no alternatives named.

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

get_agent_session_changesGet Agent Session ChangesA
Read-only

The audit ledger for an agent session: every content item it changed, with actions and timestamps. Defaults to the current MCP session. Requires audit permissions.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idNoAgent session ID. Defaults to this MCP session's own ID.

TDQS

A3.9/5.0
Behavior4/5

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

readOnlyHint=true already establishes the safety profile, so the description's added disclosure of the audit-permission prerequisite and the default-to-current-session scoping is genuine value beyond the annotation. It stops short of describing result ordering or volume limits.

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

Conciseness5/5

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

Two tight sentences with zero filler; the core purpose is front-loaded and the scoping/permission facts follow in priority order.

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

Completeness5/5

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

For a one-parameter read tool with no output schema, the description covers what is returned (changed content items with actions and timestamps), the default scope, and the permission requirement. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter's default is already documented in the schema, so the description's 'defaults to the current MCP session' is largely redundant. Baseline 3 is appropriate when the schema carries the parameter meaning.

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

Purpose4/5

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

States a specific verb+resource: the audit ledger of content items changed by an agent session, with actions and timestamps. It is clearly distinct from the broad list_audit_logs and from get_agent_sandbox, though it never names those siblings explicitly.

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

Usage Guidelines3/5

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

Provides useful context: defaults to the current MCP session and requires audit permissions. However, it gives no explicit when-to-use guidance or comparison against the sibling list_audit_logs, so the agent must infer the choice.

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

get_ai_trafficGet AI TrafficB
Read-only

AI visibility report: requests from AI crawlers by purpose (training, AI search, user-initiated fetch) and by crawler, the pages AI reads most, visits referred by AI assistants (ChatGPT, Perplexity, Claude, Gemini…), and where they land.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoDays to cover (default 30, max 90)

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the agent knows this is a safe read. The description adds the analytical dimensions returned (crawler breakdown, referred visits, landing pages), but says nothing about data freshness, rate limits, pagination, or how the default 30-day window affects results. It adds context over the annotation but not rich behavioral detail.

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

Conciseness4/5

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

A single front-loaded sentence that opens with the report type and then lists the key data categories. Every clause carries information, though the enumeration is somewhat dense and comma-heavy. It is appropriately sized for a simple read tool.

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

Completeness4/5

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

With no output schema, the description compensates by enumerating what the report contains (crawler purposes, top pages, referred visits, landing pages), which effectively communicates the return shape. For a one-parameter read-only tool this is largely complete; only the time-window interplay and freshness are unaddressed.

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

Parameters3/5

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

There is a single parameter (days) with full schema description coverage including default and max, so the schema carries the semantics. The description never mentions the time window or its defaults, adding no meaning beyond the schema. Baseline 3 is appropriate when schema coverage is complete.

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

Purpose4/5

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

The description names a specific resource (AI visibility report / get_ai_traffic) and enumerates its contents: crawler requests by purpose and crawler, most-read pages, AI-assistant referrals, and landing pages. No sibling tool covers AI traffic, so it is clearly distinguishable. It lacks a crisp leading verb but the scope is unmistakable.

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

Usage Guidelines2/5

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

The phrase 'AI visibility report' implies an analytics use case, but there is no explicit when-to-use guidance, no conditions selecting it over alternatives, and no mention of prerequisites or the data window. Nothing tells the agent when this tool is the right call versus get_maintenance_report, get_indexnow_status, or get_seo_settings.

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

get_approval_requestGet Approval RequestB
Read-only

Get details of a single approval request including decisions so far.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesrequired,Approval request ID

TDQS

B3.2/5.0
Behavior3/5

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

The readOnlyHint=true annotation already tells the agent this is a safe read, so the description carries a reduced burden. It adds that the response includes decision history, which is useful return-content context, but says nothing about auth requirements, pagination, or 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.

Conciseness4/5

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

A single tight sentence with the resource scope front-loaded and no filler. It is appropriately sized for a simple getter, though it is arguably terse to the point of leaving gaps rather than wasting words.

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

Completeness4/5

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

For a one-parameter read tool with annotations covering the safety profile and no output schema, the description is largely sufficient. It could have noted the return shape more fully, but nothing essential for invoking the tool correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% for the single 'id' parameter, so the schema already defines it fully. The description adds no format, source, or semantic 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.

Purpose4/5

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

The description states a specific verb ('Get') and resource ('approval request') and scopes it with 'single', which implicitly separates it from the list_approval_requests sibling. It adds that the result includes 'decisions so far'. It stops short of explicitly naming the sibling it contrasts with, so it lands just below the top tier.

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

Usage Guidelines2/5

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 guidance, nor any named alternative (e.g. list_approval_requests for multiple requests). The word 'single' weakly implies the tool is for one ID at a time, but the agent must infer the routing decision entirely on its own.

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

get_approval_workflowGet Approval WorkflowB
Read-only

Get a single approval workflow by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesrequired,Workflow ID

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safe-read profile is covered by structured data. The description adds no further behavior such as whether the result is cached, what happens on a missing ID, or auth requirements. With annotations covering safety, a baseline 3 is appropriate.

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

Conciseness4/5

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

A single front-loaded sentence with zero waste. It is efficient, though it is so terse that it forgoes any extra routing context.

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

Completeness3/5

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

For a simple one-parameter read tool with no output schema, annotations covering read-only behavior, and full schema coverage, the description is adequate but minimal. It omits any differentiation from the many sibling get_* tools or mention of what the returned workflow contains.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'id' parameter is documented in-schema, so the schema carries the load. The description adds no format guidance (e.g., ID shape/source) beyond what the schema provides – baseline 3.

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

Purpose4/5

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

Clear verb ('Get') plus resource ('approval workflow') and scope ('single ... by ID'). This implicitly distinguishes it from list_approval_workflows and create/update/delete_approval_workflow, though it never names a sibling explicitly.

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

Usage Guidelines3/5

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

Usage is only implied: 'single ... by ID' hints you use it when you have a specific workflow ID, versus list_approval_workflows for enumeration. No explicit when-to-use, prerequisites, or alternative is stated.

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

get_assetGet AssetA
Read-only

Get asset metadata by ID or path. Does not return file content (use the serve path to access the file).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoAsset ID (MongoDB ObjectID)
pathNoAsset serve path (e.g., /images/logo.png)

TDQS

A4.3/5.0
Behavior4/5

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

While annotations declare readOnlyHint=true indicating a safe operation, the description adds essential behavioral context by clarifying that 'get' retrieves metadata only, not binary file content. This manages expectations about the return payload that annotations alone don't convey.

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

Conciseness5/5

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

Two sentences, optimally structured: first establishes purpose and parameters, second provides critical behavioral constraint. Zero redundancy; every word earns its place.

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

Completeness5/5

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

For a simple retrieval tool with fully documented parameters and read-only annotations, the description is complete. It compensates for missing output schema by clarifying what is returned (metadata) and what isn't (file content).

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

Parameters3/5

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

With 100% schema description coverage (id and path fully documented), the schema carries the primary load. The description adds value by confirming these are alternative identifiers ('ID or path'), implying mutually exclusive usage, but does not elaborate on parameter formats beyond the schema.

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

Purpose5/5

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

The description clearly states the specific action ('Get'), resource ('asset metadata'), and identifiers ('by ID or path'). It further distinguishes itself from assumed file retrieval by explicitly stating it 'Does not return file content', which differentiates it from potential file-serving siblings.

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

Usage Guidelines4/5

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

The description provides clear guidance on limitations ('Does not return file content') and points toward the correct alternative method ('use the serve path to access the file'). However, it lacks explicit guidance on when to use this vs list_assets or other sibling tools.

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

get_collectionGet CollectionB
Read-only

Get a collection by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCollection ID (MongoDB ObjectID),required

TDQS

B3.2/5.0
Behavior3/5

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

The annotations declare readOnlyHint=true and openWorldHint=false, which cover the safety profile. The description adds no additional behavioral context (e.g., error handling when ID not found, what fields a collection contains, or caching behavior), but it does not contradict the annotations either.

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

Conciseness4/5

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

The description is extremely brief and front-loaded with the action. While it avoids waste, it borders on under-specification. However, for a simple read operation with comprehensive schema documentation, this length is appropriate and every word serves a purpose.

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

Completeness3/5

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

Given the simple single-parameter input, high schema coverage, and presence of read-only annotations, the description meets minimum viability. However, with no output schema provided, the description could improve completeness by briefly characterizing what a 'collection' represents in this domain or what the return structure contains.

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

Parameters3/5

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

With 100% schema coverage, the input schema already fully documents the 'id' parameter as a MongoDB ObjectID. The description mentions 'by ID' which aligns with the parameter name, but adds no semantic information beyond what the schema already provides, warranting the baseline score.

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

Purpose4/5

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

The description uses a specific verb ('Get') and resource ('collection'), and specifies the lookup method ('by ID'). This implicitly distinguishes it from list_collections (which returns multiple), though it could explicitly clarify that this retrieves a single item versus the list alternative.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. Given the presence of list_collections, create_collection, and update_collection siblings, the description should explicitly state when to prefer this single-item retrieval over listing or creation workflows.

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

get_contentGet ContentA
Read-only

Get a single content item by ID or path. Returns full content including all field data (title, slug, full_path, data fields, published state).

Prefer path when you know the URL: {"path": "/about"} Use id when you have the MongoDB ObjectID: {"id": "abc123"}

Set include_rendered=true to also receive the fully rendered HTML output (template + theme header/footer applied). Useful for verifying what visitors see without publishing.

Tip: to preview unsaved edits before publishing, use preview_content instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoContent ID (MongoDB ObjectID)
pathNoContent path (e.g., /about or /blog/my-post)
include_renderedNoIf true, include the fully rendered HTML output in the response

TDQS

A4.8/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, so the description appropriately focuses on output behavior rather than safety. It adds valuable context about what 'rendered' means (template + theme header/footer) and clarifies the difference between published content and preview states, though it could mention caching or error behaviors.

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

Conciseness5/5

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

Four tightly structured sentences that front-load the core purpose, followed by specific parameter guidance, optional flag explanation, and cross-reference. Every clause earns its place without redundancy.

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

Completeness5/5

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

With no output schema provided, the description comprehensively compensates by detailing exactly what fields are returned (title, slug, data fields, published state) and the optional rendered HTML output. It addresses the key sibling relationship with preview_content, leaving no critical gaps for a read operation.

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

Parameters5/5

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

Despite 100% schema coverage, the description adds substantial value with concrete JSON syntax examples ({'path': '/about'}), semantic usage guidance distinguishing URL vs ObjectID scenarios, and detailed explanation of the rendered output behavior beyond the boolean flag description.

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

Purpose5/5

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

Description clearly states the specific action (get), resource (single content item), and identification methods (ID or path). It distinguishes from sibling tools by explicitly mentioning 'preview_content' as an alternative for unsaved edits and implies singularity versus 'list_content'.

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

Usage Guidelines5/5

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

Provides explicit guidance on when to use each identifier ('Prefer path when you know the URL', 'Use id when you have the MongoDB ObjectID'). It explicitly states when NOT to use this tool ('use preview_content instead' for unsaved edits), giving clear alternatives.

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

get_content_lockGet Content LockA
Read-only

Get the current advisory lock status for a content item. Returns lock holder and expiry, or {locked: false} if unlocked.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_idYesContent item ID,required

TDQS

A3.8/5.0
Behavior4/5

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

readOnlyHint=true already tells the agent this is a safe read, so the bar is lower. The description goes beyond that by disclosing the return contract — lock holder, expiry, or {locked: false} — which is meaningful since there is no output schema. It does not explain the 'advisory' semantics or error cases, so it is 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.

Conciseness5/5

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

Two tight sentences: the action and scope come first, the return shape second. Every clause earns its place with no filler or repetition of the title.

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

Completeness4/5

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

With a single fully documented parameter and readOnlyHint coverage, the main remaining need is the output shape — which the description supplies (lock holder, expiry, unlocked sentinel). It omits any note on what an 'advisory' lock implies for contention, so it falls just short of complete.

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

Parameters3/5

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

There is only one parameter (content_id) and schema description coverage is 100%, so the schema already carries the semantics. The description adds nothing about identifier format or required scoping, matching the baseline for fully documented parameters.

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

Purpose4/5

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

The description gives a specific verb+resource ('Get the current advisory lock status for a content item') that an agent can immediately map to the operation. It does not explicitly name or differentiate itself from the lock siblings (acquire_content_lock, release_content_lock, force_unlock_content), though the verb makes the distinction inferable.

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

Usage Guidelines3/5

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

Usage is implied by the read-oriented framing, but the description offers no explicit when-to-use guidance or routing to alternatives like acquire_content_lock or force_unlock_content. An agent can infer this is a status check, but nothing is stated.

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

get_content_versionGet Content VersionB
Read-only

Get a specific version of a content item with full field data.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYesVersion number,required
content_idYesContent ID (MongoDB ObjectID),required

TDQS

B3.3/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true, so the description doesn't need to state safety. It adds 'with full field data' which provides useful context about the response payload richness, but doesn't describe error behavior (e.g., invalid version numbers) or versioning semantics.

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

Conciseness5/5

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

Single sentence with zero waste. 'Get', 'specific version', 'content item', and 'full field data' each provide distinct semantic value. Front-loaded with the action verb.

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

Completeness3/5

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

For a simple 2-parameter read operation with complete annotations and full schema coverage, the description covers the essential function. However, it lacks versioning workflow context (how version numbers relate to 'get_content_versions') and error scenarios, which would help an agent use this effectively in a sequence.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents both parameters (MongoDB ObjectID and version number). The description implies these concepts but doesn't add syntax details, format constraints, or examples beyond the schema.

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

Purpose4/5

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

Clear verb 'Get' and resource 'specific version of a content item'. The phrase 'specific version' effectively distinguishes this from sibling 'get_content_versions' (plural). However, it doesn't clarify the difference versus 'get_content' (current version) or 'revert_to_version'.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus 'get_content' (current state) or 'get_content_versions' (list all versions). No mention that one might need to call 'get_content_versions' first to discover valid version numbers.

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

get_content_versionsGet Content VersionsB
Read-only

Get the version history for a content item. Returns list of versions with timestamps.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_idYesContent ID (MongoDB ObjectID),required

TDQS

B3.4/5.0
Behavior3/5

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

Annotations establish readOnlyHint=true, so safety is covered. The description adds value by disclosing the return structure ("list of versions with timestamps"), which compensates partially for the missing output schema. However, it omits behavioral details like ordering, pagination, or whether deleted versions are included.

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

Conciseness5/5

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

Extremely efficient at two sentences: first establishes purpose, second establishes return format. No redundant information or filler.

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

Completeness4/5

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

For a simple read-only tool with one well-documented parameter and safety annotations, the description is appropriately complete. The mention of return structure compensates for the lack of output schema, though ordering or pagination details would improve it further.

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

Parameters3/5

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

With 100% schema description coverage for the single content_id parameter, the schema carries the full burden. The description mentions no parameters, so it neither adds nor subtracts meaning, meeting the baseline of 3.

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

Purpose4/5

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

The description uses specific verbs ("Get") and resources ("version history") and implies bulk retrieval via "list of versions," distinguishing it from sibling get_content_version (singular). However, it does not explicitly clarify when to use this versus the singular version retrieval tool.

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

Usage Guidelines2/5

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 like get_content (current state) or get_content_version (specific version). No mention of prerequisites or error conditions.

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

get_folderGet FolderC
Read-only

Get a folder by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFolder ID (MongoDB ObjectID),required

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true (safe read operation) and openWorldHint=false. The description adds no behavioral context beyond the basic operation, such as error behavior when the ID is not found, what fields are returned, or whether the operation is cached.

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

Conciseness4/5

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

Extremely efficient at four words. No wasted language. However, the brevity approaches under-specification given the lack of output schema and error behavior context, preventing a perfect score.

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

Completeness3/5

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

Acceptable for a simple retrieval tool with complete schema coverage and safety annotations. However, gaps remain regarding error handling (404 vs null responses) and differentiation from sibling list operations, keeping it at minimum viable rather than exemplary.

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

Parameters3/5

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

With 100% schema coverage, the schema adequately documents the single 'id' parameter as 'Folder ID (MongoDB ObjectID)'. The description references 'ID' but adds no additional semantic value regarding format expectations or validation beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose4/5

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

States specific verb (Get), resource (folder), and identification method (by ID). The 'by ID' phrasing implicitly distinguishes it from sibling list_folders which returns multiples. However, it does not explicitly clarify the single-resource vs collection distinction or mention the MongoDB ObjectID format mentioned in the schema.

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

Usage Guidelines2/5

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

Provides no explicit guidance on when to use this tool versus alternatives like list_folders or search_content. While 'by ID' implies use when the identifier is known, it does not state prerequisites (having the ID) or exclusion criteria (don't use for searching/browsing).

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

get_forkGet ForkA
Read-only

Get details of a fork workspace including its status and list of pages.

Returns: fork metadata + array of pages (id, title, full_path, updated_at). Use the page id with get_content or update_content to read/edit fork pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFork ID (returned by create_fork or list_forks),required

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, confirming this is a safe read operation. The description adds valuable return structure documentation: 'fork metadata + array of pages (id, title, full_path, updated_at)' that is not present in structured fields. This discloses exactly what data structure the agent will receive.

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

Conciseness5/5

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

Three well-structured sentences with zero waste: (1) core purpose, (2) return specification, (3) usage guidance. Front-loaded with the action, includes line breaks for readability, and every sentence earns its place by conveying distinct information not found in other fields.

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

Completeness4/5

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

Despite lacking a formal output schema, the description comprehensively documents the return format and fields. It contextualizes the tool within the broader workflow (referencing get_content/update_content). Minor gap: no mention of error cases (e.g., archived forks) or pagination behavior for forks with many pages.

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

Parameters3/5

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

Schema coverage is 100% with the 'id' parameter fully documented as 'Fork ID (returned by create_fork or list_forks),required'. Since the schema carries the full semantic load, the baseline score of 3 applies. The description text does not add additional parameter constraints, examples, or format details beyond the schema.

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

Purpose5/5

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

Description uses specific verb 'Get' with clear resource 'fork workspace' and scope 'including its status and list of pages'. The singular 'a fork' combined with the ID parameter clearly distinguishes this from list_forks (which returns multiple forks) and from sibling mutation tools like create_fork or merge_fork.

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

Usage Guidelines4/5

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

Provides explicit workflow guidance: 'Use the page id with get_content or update_content to read/edit fork pages.' This helps the agent understand how to use the output and references specific sibling tools. However, it lacks explicit guidance on when to use get_fork vs list_forks (e.g., 'use this when you have a specific Fork ID').

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

get_fork_diffGet Fork DiffA
Read-only

Per-field differences between each page in a fork and its live counterpart — the review surface for merging a fork. Status 'added' means the page exists only in the fork.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFork ID (returned by create_fork or list_forks),required

TDQS

A4/5.0
Behavior3/5

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

readOnlyHint=true already establishes the safe-read profile, and the description adds real value by defining diff semantics and one status value ('added'). It does not disclose other status values, result size, or pagination behavior on large forks, so it is helpful but incomplete beyond the annotation.

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

Conciseness5/5

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

Two sentences, no filler, with the core purpose front-loaded ahead of the status clarification. Every clause earns its place.

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

Completeness4/5

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

With no output schema, the description carries the burden of describing return values and does so at a high level (per-page field diffs, status semantics). Minor gaps around scale/pagination and the full status vocabulary keep it from a 5.

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

Parameters3/5

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

Schema coverage is 100% and the single 'id' parameter is already documented as a fork ID returned by create_fork/list_forks. The description adds nothing specific about the parameter, so the baseline 3 applies.

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

Purpose5/5

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

Names a precise resource and output shape: 'per-field differences between each page in a fork and its live counterpart.' This clearly separates it from get_fork (metadata), list_forks (index), and merge_fork (the mutation), so an agent can route without opening the schema.

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

Usage Guidelines4/5

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

Calling it 'the review surface for merging a fork' implicitly tells the agent to use it before merge_fork, which is strong contextual guidance. It stops short of an explicit when/when-not statement or naming merge_fork as the follow-up action.

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

get_import_jobGet Import JobB
Read-only

Get the status, results, and log of a specific import job

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesImport job ID,required
include_logsNoInclude job log lines (default true)

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds that the call surfaces status, results, and log content, which is useful, but says nothing about pagination, log volume, or failure states for a job that may still be running.

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

Conciseness5/5

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

A single front-loaded sentence with zero filler; the verb, resource, and payload are all stated immediately.

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

Completeness4/5

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

For a low-complexity read tool with full schema coverage and no output schema, the description adequately signals the returned payload. Only runtime behavior of in-progress jobs is left unaddressed.

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

Parameters3/5

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

Schema description coverage is 100%, so both 'id' and 'include_logs' are already documented with their defaults. The description's mention of 'log' loosely maps to include_logs but adds no format or behavior detail beyond the schema.

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

Purpose4/5

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

Names a specific verb ('Get') and resource ('a specific import job') and enumerates what it returns (status, results, log). It is distinguishable from list_import_jobs by the singular scoping, though the sibling is not named explicitly.

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

Usage Guidelines2/5

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

The description never states when to use this tool versus list_import_jobs, cancel_import_job, or the import trigger/source tools. It only describes what comes back, leaving the agent to infer usage from the name.

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

get_indexnow_statusGet IndexNow StatusA
Read-only

IndexNow notifies Bing, Yandex and other engines when pages change. Returns whether it is active (and why not if inactive), the key file URL, whether the key file verified, total URLs submitted, and recent submissions with HTTP results.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered; the description adds real value by disclosing the return contents, including the diagnostic 'why not if inactive' and key-file verification state. It goes beyond the annotation by telling the agent what it will learn, though it does not mention pagination or limits on 'recent submissions'.

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

Conciseness5/5

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

Two tight sentences: the first grounds the concept, the second front-loads the returned information. No filler and no repetition of the title.

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

Completeness4/5

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

With no output schema, the description carries the burden of explaining returns and largely does so, covering active state, key URL, verification, totals, and HTTP results. It falls just short on the shape of 'recent submissions' (count, ordering, time window), which is a minor gap for a zero-param diagnostic tool.

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

Parameters4/5

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

There are zero parameters and 100% schema coverage, so the baseline is 4. There is nothing to clarify beyond the schema.

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

Purpose5/5

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

States a specific verb and resource (return IndexNow status) and even defines what IndexNow is, then enumerates the exact fields returned. It is cleanly distinguishable from the sibling set_indexnow_enabled (write) and submit_indexnow (action) without opening any schema.

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

Usage Guidelines3/5

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

The description implies a diagnostic/monitoring use case (checking active state and why it is inactive), but never says when to reach for this vs. set_indexnow_enabled or submit_indexnow, and offers no explicit conditions or exclusions. Usage is inferable but not stated.

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

get_maintenance_reportGet Maintenance ReportA
Read-only

The latest site-health scan: stale pages (no update in ~6 months), published pages missing meta descriptions, and lingering drafts. Use it as a work queue — fix issues via the sandbox workflow.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

readOnlyHint=true already covers the safety profile, so the bar is lower, and the description still adds real context: the report reflects a previously run scan, the staleness threshold is roughly 6 months, and the intended downstream action is remediation via the sandbox. It does not disclose size limits, whether the report can expire, or permission requirements.

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

Conciseness5/5

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

Two sentences, zero waste, and the tool's contents are front-loaded ahead of the usage hint. Each clause carries information an agent would otherwise have to infer.

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

Completeness4/5

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

With no output schema, the description carries the burden of explaining return contents, and it does so by naming the three issue categories. What is missing is the report's freshness/expiry semantics and whether run_maintenance_scan must precede it — modest gaps for an otherwise well-covered zero-parameter read tool.

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

Parameters4/5

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

The tool takes no parameters, so the baseline is 4. The description correctly implies no filtering or scoping inputs are needed, which is consistent with the empty schema.

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

Purpose5/5

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

States a specific verb+resource: retrieving the latest site-health scan report, and enumerates exactly what it contains (stale pages, missing meta descriptions, lingering drafts). The word 'latest' implicitly distinguishes it from the sibling run_maintenance_scan, which generates a fresh scan rather than reading the existing one.

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

Usage Guidelines4/5

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

Explicitly frames the tool as a work queue and routes the agent to the sandbox workflow for fixing the issues it surfaces. It gives clear context for when to call it, but never states the alternative case — e.g. that run_maintenance_scan must be invoked if the report is stale.

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

get_seo_settingsGet SEO & AI SettingsB
Read-only

The site's search & AI settings: AI crawler policy (training / AI search / user fetch, per-crawler overrides) with the resulting robots.txt, Markdown copies, default author/publisher for structured data, and feed settings.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds the scope of returned configuration (crawler policy, generated robots.txt, Markdown copies, feed settings), which partially compensates for the absent output schema, but it says nothing about auth requirements or whether these settings are site-wide versus per-environment.

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

Conciseness4/5

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

A single front-loaded sentence that lists the returned areas without padding. It is a long noun phrase with no verb, so it reads slightly more like a field inventory than a statement of action, but it wastes no words.

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

Completeness4/5

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

With no output schema, the description usefully documents what the call returns — crawler policy, robots.txt, Markdown copies, author/publisher defaults, feed settings. Combined with the readOnly annotation, an agent has enough to call it correctly, though sibling disambiguation is missing.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No argument syntax is needed for a no-arg read.

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

Purpose4/5

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

The description names a specific resource — the site's search & AI settings — and enumerates its contents (AI crawler policy, robots.txt, structured-data defaults, feed settings). That is far more concrete than a restated title. It stops short of 5 because it never distinguishes itself from siblings such as get_site_config or update_seo_settings, which an agent must choose between.

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

Usage Guidelines2/5

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

There is no when-to-use guidance and no mention of the obvious read/write pairing with update_seo_settings, nor any exclusion against get_site_config. The agent is left to infer that this is the read side of SEO configuration.

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

get_site_configGet Site ConfigB
Read-only

Get site configuration including title templates.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already indicate read-only/safe behavior via 'readOnlyHint: true'. The description adds content scope ('including title templates') but omits other behavioral details like error conditions, permission requirements, or cache behavior. With annotations covering safety, this is minimally acceptable.

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

Conciseness5/5

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

Single efficient sentence front-loaded with the action verb. 'Including title templates' adds specific value without verbosity. Zero waste.

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

Completeness3/5

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

Adequate for a simple parameter-less getter with annotations present, mentioning one key configuration aspect (title templates). However, lacks return value description or enumeration of other configuration fields available given no output schema exists.

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

Parameters4/5

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

Input schema has zero parameters. Per scoring rules, 0 params equals baseline 4.

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

Purpose4/5

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

Clear verb ('Get') and resource ('site configuration') with specific content detail ('title templates'). However, it does not explicitly distinguish from sibling 'update_site_config' (e.g., by stating this is read-only retrieval vs. modification).

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

Usage Guidelines2/5

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, prerequisites, or conditions. The agent must infer usage solely from the action description.

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

get_snippetB
Read-only

Get a snippet by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSnippet ID (MongoDB ObjectID),required

TDQS

B3.2/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true, establishing it as a safe read operation. The description adds the lookup mechanics ('by ID') confirming the schema intent, but provides no additional context on error behaviors (e.g., 404), rate limits, or return structure.

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

Conciseness4/5

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

Extremely brief (4 words) but appropriately sized for a single-parameter getter. The sentence is front-loaded and contains no redundant information, though its terseness borders on tautology with the tool name.

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

Completeness3/5

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

Adequate for a simple read operation with complete schema coverage and safety annotations. However, lacking an output schema, the description omits what fields or structure are returned, which could improve agent debugging.

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

Parameters3/5

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

With 100% schema description coverage, the baseline is 3. The description mentions 'by ID', aligning with the parameter, but adds no syntax details, format examples, or semantic meaning beyond what the schema already provides.

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

Purpose4/5

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

States a specific verb ('Get'), resource ('snippet'), and lookup method ('by ID'). The 'by ID' phrasing implicitly distinguishes this from the sibling 'list_snippets' tool, though it does not explicitly name that alternative.

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

Usage Guidelines2/5

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

Provides no guidance on when to use this tool versus siblings like 'list_snippets' (for browsing) or 'search_content' (for querying). No prerequisites, error handling, or workflow context is mentioned.

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

get_templateGet TemplateA
Read-only

Get a single template by ID or slug. Returns full template including fields and HTML layout.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoTemplate ID (MongoDB ObjectID)
slugNoTemplate slug

TDQS

A4/5.0
Behavior4/5

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

Adds valuable return payload context ('full template including fields and HTML layout') beyond the readOnlyHint annotation. Confirms this retrieves complete object data, not just metadata. No contradictions with annotations.

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

Conciseness5/5

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

Two sentences, zero waste. First sentence defines operation and lookup keys; second sentence describes return payload. Front-loaded with essential information, no redundancy with title or schema.

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

Completeness4/5

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

Appropriate for a simple 2-parameter retrieval tool. Compensates for missing output schema by describing return structure ('fields and HTML layout'). With readOnlyHint annotation present, no need for safety warnings.

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

Parameters3/5

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

With 100% schema coverage, baseline is 3. Description mentions 'ID or slug' which implies alternative identifiers, but doesn't add syntax details, format constraints, or explicit mutual exclusivity guidance beyond what the schema property descriptions already provide.

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

Purpose5/5

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

Clear specific verb ('Get') + resource ('template') + scope ('single' vs sibling 'list_templates'). The ID/slug specification distinguishes from bulk operations and the 'fields and HTML layout' distinguishes from metadata-only retrieval tools.

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

Usage Guidelines3/5

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

Implies usage by mentioning 'by ID or slug' but lacks explicit guidance on when to use this vs 'list_templates' (browse/search vs direct lookup) and doesn't clarify that ID and slug are mutually exclusive lookup methods (both marked optional in schema).

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

get_themeGet ThemeA
Read-only

Get current theme settings including colors, fonts, and custom HTML for header/footer.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations establish readOnlyHint=true; description adds valuable behavioral context by disclosing exactly which theme components are returned (colors, fonts, header/footer HTML), which helps the agent understand the scope and shape of the data without contradicting safety annotations.

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

Conciseness5/5

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

Single efficient sentence front-loaded with the action verb. Every clause earns its place: the main clause establishes the operation, while the prepositional phrase specifies the thematic domains returned. No redundancy or filler.

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

Completeness4/5

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

While lacking an output schema, the description compensates by enumerating the primary return value categories (colors, fonts, HTML). Adequate for a simple read operation, though explicit mention of whether this returns the active/live theme versus pinned version would improve completeness.

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

Parameters4/5

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

Zero parameters (input schema is empty object), which per guidelines warrants a baseline score of 4. The description appropriately implies no filtering or input is required to retrieve the current theme settings.

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

Purpose5/5

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

Excellent specificity with verb 'Get', resource 'theme settings', and concrete examples of returned data (colors, fonts, custom HTML). The term 'current' implicitly distinguishes this from sibling version-management tools like get_theme_version and update_theme.

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

Usage Guidelines2/5

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

Provides no explicit guidance on when to use this versus get_theme_version/get_theme_versions or whether this retrieves the active/pinned version. No prerequisites or exclusions mentioned.

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

get_theme_versionGet Theme VersionB
Read-only

Get a specific version of theme settings with full data.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYesVersion number,required

TDQS

B3.3/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true. Description adds 'with full data' indicating complete theme configuration is returned, not just metadata. However, missing disclosure of error behavior (e.g., returns 404 if version not found) or whether archived/unpinned versions are accessible.

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

Conciseness5/5

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

Single sentence with zero waste. 'specific version' and 'full data' each earn their place by defining scope and completeness. Front-loaded with action and resource.

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

Completeness3/5

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

Adequate for a simple read operation with one required parameter and readOnly annotations. 'Full data' hints at return value structure given no output schema is defined. However, lacks sibling differentiation and error condition documentation that would justify higher score.

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

Parameters3/5

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

Schema coverage is 100% with parameter 'version' documented as 'Version number,required'. Description neither adds semantic context (e.g., that version is an integer ID from get_theme_versions) nor repeats schema info. Baseline 3 appropriate when schema carries full descriptive burden.

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

Purpose4/5

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

Uses specific verb 'Get' with resource 'theme settings' and scope 'specific version' and 'full data'. Distinguishes from sibling get_theme_versions (list vs specific instance) and get_theme (current vs historical), though could be more explicit about the version-number lookup pattern.

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

Usage Guidelines2/5

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

No guidance provided on when to use this versus get_theme (current settings) or get_theme_versions (list available versions first). No mention that the version number must be obtained from get_theme_versions or that invalid versions will error.

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

get_theme_versionsGet Theme VersionsA
Read-only

Get the version history for theme settings. Returns list of versions with timestamps.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, confirming safe read operation. Description adds valuable output context not present in annotations: specifically that it returns a 'list of versions with timestamps', which helps the agent understand the data structure returned despite the lack of 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.

Conciseness5/5

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

Two short sentences with zero waste. Front-loaded with the action verb, followed immediately by return value description. Every word earns its place.

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

Completeness4/5

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

Appropriately complete for a zero-parameter read-only tool. Compensates for missing output schema by describing the return structure (list with timestamps). Could mention that theme ID is inferred from context or required in environment, but sufficient as-is.

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

Parameters4/5

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

Zero parameters present, meeting the baseline score of 4. No parameters require semantic explanation.

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

Purpose4/5

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

States specific action (Get) and resource (version history for theme settings). Implies distinction from sibling 'get_theme_version' (singular) through use of 'history' and 'list', but does not explicitly clarify when to use the plural vs singular variant.

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

Usage Guidelines3/5

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

Provides implied usage through the term 'history' suggesting archival/audit use cases, but lacks explicit when-to-use guidance or prerequisites (e.g., no mention that this is for retrieving version IDs needed by 'revert_theme_to_version').

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

import_csvImport CSVB

Import content from CSV data. Each row becomes a content page. Specify which column is the title; all columns become content fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
csv_dataYesRaw CSV text (first row must be headers),required
folder_pathNoFolder path for imported pages (default /imports)
slug_columnNoHeader name of the column to use as the URL slug (defaults to slugified title)
auto_publishNoAutomatically publish imported pages (default false)
title_columnYesHeader name of the column to use as the page title,required
template_nameNoTemplate name for imported pages

TDQS

B3.2/5.0
Behavior3/5

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

The annotations already declare destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description usefully adds the row-to-page mapping and column-to-field behavior, but says nothing about whether the import is synchronous or spawns a job (relevant given siblings like get_import_job and cancel_import_job), nor about permissions or limits.

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

Conciseness4/5

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

Three short sentences, front-loaded with the core operation and each sentence adding information (transformation model, title column, field mapping). No filler or repetition of the title.

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

Completeness3/5

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

For a mutation tool with no output schema, the description covers the essential mechanics but omits whether the result is a job, what happens on partial failure, and where pages land by default. Annotations carry the safety burden, but the operational picture is incomplete.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema documents all six parameters, making the baseline 3 appropriate. The description adds the semantic that "all columns become content fields" and how the title column is chosen, which is slightly beyond the schema but not deep parameter guidance.

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

Purpose4/5

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

States a specific verb and resource ("Import content from CSV data") and clarifies the transformation ("Each row becomes a content page"), so the agent grasps the operation immediately. It does not differentiate itself from close siblings like import_markdown or bulk_create_content, which is the only gap.

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

Usage Guidelines2/5

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

The description explains what the tool does but never says when to use it versus alternatives such as import_markdown, bulk_create_content, or create_import_source. There are no exclusions, prerequisites, or selection criteria, leaving routing entirely to inference.

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

import_markdownImport MarkdownA

Import one or more Markdown pages into LightCMS. Each page can include YAML frontmatter (title, slug, folder, template, published, publish_at). Ideal for bulk content creation by AI agents — generate markdown with frontmatter and import directly.

Example frontmatter:

title: My Page slug: my-page folder: /blog template: Blog Post published: false

Page body content here.

ParametersJSON Schema
NameRequiredDescriptionDefault
pagesYesArray of markdown pages to import,required
auto_publishNoAutomatically publish imported pages (default false)
default_folderNoDefault folder path when not specified in frontmatter (default /imports)
default_templateNoDefault template name when not specified in frontmatter

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare openWorldHint=false and destructiveHint=false, lowering the bar. The description usefully discloses the per-page frontmatter surface that controls behavior (title, slug, folder, template, published, publish_at), but says nothing about auth/permission needs, slug or path collisions, validation/error behavior, or whether the import runs synchronously or creates a job (relevant given list_import_jobs/get_import_job exist as siblings).

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

Conciseness4/5

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

Front-loaded with purpose, then capabilities, then a compact worked example. Every element earns its place; the example is the one slightly long block, but it directly enables correct invocation.

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

Completeness3/5

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

There is no output schema, and the description never says what comes back or how progress/completion is observed, which matters for a bulk import in a system that exposes import jobs. Frontmatter behavior is well covered, but the post-invocation contract is left implicit.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3, and the description exceeds it: it enumerates the frontmatter keys that actually drive per-page configuration (crucial because the schema's 'content' param only hints at frontmatter) and supplies a concrete frontmatter example. This meaningfully augments the schema for the highest-leverage parameter.

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

Purpose4/5

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

States a specific verb and resource ('Import one or more Markdown pages into LightCMS') and scopes it as a bulk operation, which separates it conceptually from single-page tools like create_content. It does not explicitly name or rule out the closest siblings (import_csv, bulk_create_content, create_import_source), so the agent must infer the boundary from the 'Markdown/frontmatter' framing.

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

Usage Guidelines3/5

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

'Ideal for bulk content creation by AI agents' gives a positive usage signal, but there is no when-not guidance and no named alternative for other import paths (CSV import, single-page creation, import sources/jobs). Usage is implied rather than contrasted.

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

list_approval_requestsList Approval RequestsA
Read-only

List pending approval requests. Use filter=mine to see only requests in your queue.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNomine (my queue) or all (default: all pending)

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds that the default is all pending requests, which is useful context, but says nothing about volume, pagination, 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.

Conciseness5/5

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

Two short sentences with zero waste, and the core purpose is front-loaded ahead of the filter hint.

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

Completeness4/5

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

A simple read-only list tool with one optional parameter needs little more than this. It is nearly complete, though a note on default scope beyond 'all pending' and result limits would close the remaining gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents the filter parameter and its mine/all values. The description largely restates the mine semantics rather than adding format or behavior beyond the schema, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource: list pending approval requests. An agent can distinguish it from get_approval_request (singular fetch) and list_approval_workflows (a different resource) by the resource noun, though the description never names those siblings explicitly.

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

Usage Guidelines3/5

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

Gives one usage cue, filter=mine for your own queue, but no when-to-use vs alternatives or when-not to use it. The distinction from list_approval_workflows is left to inference from the tool names.

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

list_approval_workflowsList Approval WorkflowsA
Read-only

List all configured approval workflows. Requires approval.manage_workflows permission.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered, but the description adds a genuine behavioral constraint the annotations lack: it requires the approval.manage_workflows permission. It does not mention pagination or result ordering, which caps it below 5.

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

Conciseness5/5

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

Two short sentences, front-loaded with the action and followed by the gating requirement. Nothing is padded or restated.

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

Completeness4/5

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

For a zero-parameter, read-only listing tool with no output schema, the description covers what the agent needs to call it: the target resource and the required permission. Additional return-shape or pagination detail would help but is not strictly required here.

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

Parameters4/5

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

The tool takes zero parameters, so per the rubric the baseline is 4. There is no parameter surface for the description to illuminate or fail to illuminate.

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

Purpose4/5

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

States a specific verb+resource ('List all configured approval workflows'), clearly readable as a collection-listing operation. It implicitly separates itself from the singular get_approval_workflow, but does not explicitly distinguish itself from the close sibling list_approval_requests.

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

Usage Guidelines3/5

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

Usage is only implied by the verb 'List' — the description never states when to reach for this versus list_approval_requests or get_approval_workflow. No exclusions or prerequisites beyond the permission note.

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

list_asset_foldersList Asset FoldersA
Read-only

List all unique folder paths in the asset library.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations declare read-only safety (readOnlyHint=true) and closed-world scope (openWorldHint=false). Description adds 'unique' constraint (valuable behavioral detail) and 'asset library' scope, but omits output format, pagination behavior, or empty-result handling.

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

Conciseness5/5

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

Single sentence with zero waste. Front-loaded action verb, no filler words. Efficiently conveys scope, uniqueness constraint, and domain.

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

Completeness4/5

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

Appropriately complete for a zero-parameter read operation. Describes return concept (folder paths) sufficiently despite missing output schema. No prerequisites or complex behaviors to document.

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

Parameters4/5

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

Zero parameters present; baseline score 4 applies per rubric. Schema is empty object with 100% coverage. No parameter compensation needed.

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

Purpose4/5

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

Clear verb (List), resource (folder paths), and scope (asset library, unique). Distinguishes from 'list_assets' by specifying 'folder paths' and from 'list_folders' by specifying 'asset library', though lacks explicit sibling differentiation guidance.

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

Usage Guidelines2/5

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

No when-to-use or when-not-to-use guidance provided. Does not clarify relationship to sibling 'list_folders' or 'list_assets', leaving ambiguity about which listing tool is appropriate for which use case.

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

list_assetsList AssetsB
Read-only

List all assets in the asset library. Assets are files like images, documents, CSS, JS, etc.

ParametersJSON Schema
NameRequiredDescriptionDefault
folderNoFilter by folder path (e.g., /images)

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true. The description adds value by specifying the scope ('all assets') and defining asset types, but omits pagination behavior, default limits, or error handling when the folder parameter doesn't exist.

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

Conciseness4/5

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

Two efficient sentences with no redundancy. The first establishes the operation; the second clarifies the resource type. Could slightly improve by mentioning the optional folder filter in the main sentence.

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

Completeness3/5

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

Adequate for a simple read operation with one optional parameter and strong annotations. Missing description of return value structure or pagination behavior, which would be necessary for complete agent understanding given no output schema exists.

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

Parameters3/5

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

Schema coverage is 100%, so the schema fully documents the optional folder filter. The description implies filtering is optional by stating 'List all assets,' but adds no semantic details about path formats or wildcard support beyond the schema's example.

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

Purpose4/5

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

The description states a specific verb ('List') and resource ('assets'), and defines what constitutes an asset ('files like images, documents, CSS, JS'), helping distinguish from sibling list_asset_folders. However, it lacks explicit contrast with get_asset (single vs. bulk retrieval).

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

Usage Guidelines2/5

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

No guidance provided on when to use this versus get_asset for retrieving a single asset, or whether pagination applies. No mention of performance considerations for large asset libraries.

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

list_audit_logsList Audit LogsA
Read-only

List recent audit log entries. Admin only. Supports filtering by action and resource type.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of entries to return (default 50, max 200)
actionNoFilter by action (e.g. content.create, login.success)
resourceNoFilter by resource type (e.g. content, template, user)

TDQS

A3.8/5.0
Behavior4/5

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

readOnlyHint=true already tells the agent this is a safe read, so the bar is lower. The description adds genuinely non-annotated behavior: the tool is restricted to admins. It stops short of disclosing ordering, retention window, or pagination beyond what the limit parameter implies.

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

Conciseness5/5

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

Three tight sentences, appropriately sized for a simple list tool, with the core purpose front-loaded and no filler.

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

Completeness4/5

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

For a low-complexity read-only list tool with full schema coverage and no output schema, the description plus annotations cover access, scope, and filterability. Missing only minor details like default ordering or how 'recent' is bounded.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters are already self-documenting. The description's mention of action and resource-type filtering merely restates the schema and says nothing about limit or result volume. Baseline 3 is appropriate.

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

Purpose4/5

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

The description states a specific verb and resource: 'List recent audit log entries.' An agent immediately knows the domain, even though it doesn't explicitly contrast with sibling listers like list_comments or list_webhooks, which are clearly different resources anyway.

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

Usage Guidelines3/5

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

'Admin only' is a useful access prerequisite, but there is no explicit statement of when to reach for this tool versus other list/search tools (e.g. scoped_search_replace or search_content), nor any exclusion guidance. Usage context is implied rather than stated.

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

list_collectionsList CollectionsA
Read-only

List all content collections. Collections group and display content by category.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only safety (readOnlyHint=true). The description adds semantic context that collections organize content by 'category'. Does not disclose pagination behavior, empty state handling, or auth requirements, but meets the lower bar set by existing annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. Front-loaded with the action (List all content collections), followed by brief domain context. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a zero-parameter read operation with readOnly annotations, but gaps remain: no output schema exists, so description should ideally characterize the returned collection list structure or typical response shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters present per input schema. As per guidelines, 0 parameters earns baseline score of 4. No parameter documentation burden exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific action (List) and resource (all content collections) clearly. Distinguishes from 'get_collection' (singular) by using 'List all' versus 'get', though it could explicitly contrast with the singular fetch sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides domain context explaining what collections are ('group and display content by category'), which implies usage. However, lacks explicit when-to-use guidance versus alternatives like 'get_collection' or when pagination might be relevant.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_commentsList CommentsB
Read-only

List all discussion comments on a content item.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_idYesrequired,Content ID to list comments for

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint=true annotation already establishes this is a non-destructive read. The description adds only that comments are 'discussion comments' on a content item, offering no additional behavioral context such as ordering, pagination, or whether it includes replies. Modest value on top of annotations justifies a 3.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence with no filler, and the resource and scope are front-loaded. It is appropriately sized, though extremely terse for the amount of guidance it could offer.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only, single-parameter list tool with no output schema, the description is minimally adequate. It omits ordering, pagination, and whether threaded replies are included, which an agent would need for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single content_id parameter is fully documented in the schema. The description adds no syntax or format detail beyond what the schema already provides, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('discussion comments') scoped to a content item, which cleanly distinguishes it from siblings like create_comment and delete_comment. It is clear but lacks any sibling routing language or scope qualifiers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the name and the 'on a content item' scope. There is no statement of when to use this versus related tools, nor any note on filtering, ordering, or pagination behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_contentList ContentA
Read-only

List all content items with optional filters. Returns content metadata including title, path, publish status, and timestamps.

Add include_data: true to get full field data for all items in one call, or include_fields: ["field1", "field2"] to fetch only specific fields — both avoid per-item get_content calls for bulk workflows.

Up to 20 concurrent update_content calls are safe. For larger batches, prefer bulk_update_content (up to 100 items per call).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of items to return (1-500). When set, returns paginated response with {items, total, limit, offset, has_more}
offsetNoNumber of items to skip (for pagination). Requires limit to be set
categoryNoFilter by content category
folder_idNoFilter by folder ID (MongoDB ObjectID)
include_dataNoIf true, include all template field data in results (avoids per-item get_content calls)
include_forksNoAlso list fork copies (working copies inside fork workspaces). Off by default; use get_fork to see one fork's pages
include_fieldsNoInclude only these specific field names from the data object (more efficient than include_data for large content)
include_deletedNoInclude soft-deleted content in results

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description usefully adds the return shape (metadata fields) and the efficiency implications of include_data/include_fields versus per-item get_content calls. It stops short of pagination/limits behavior, but that is largely in 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose and return values well, but the final paragraph about 20 concurrent update_content calls and bulk_update_content is off-topic for a list tool and dilutes focus. A sentence or two is spent on behavior that does not belong to this operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a fully documented 8-parameter schema, read-only annotations, and no output schema, the description supplies what structured fields cannot: the return fields and the bulk-read strategy. Nothing essential for invoking list_content correctly is missing, though the misplaced update-concurrency note adds noise rather than completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description goes beyond the schema by explaining the trade-off behind include_data and include_fields (both avoid per-item get_content calls for bulk workflows), giving an agent a reason to set them rather than just their type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List all') plus resource ('content items') and notes optional filters, and it lists the returned metadata fields (title, path, publish status, timestamps). It does not explicitly differentiate itself from siblings like search_content, but the purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives real usage strategy for bulk reading (include_data / include_fields avoid per-item get_content calls) and names bulk_update_content as the alternative for large batches. However, it offers no guidance on when to prefer this over search_content, and the closing paragraph about concurrent update_content calls concerns a different tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_foldersList FoldersB
Read-only

List all content folders. Folders organize content into URL path segments.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only safety (readOnlyHint: true). Description adds domain context that folders map to URL path segments, which helps understand the data model. However, lacks behavioral details like pagination limits, performance characteristics, or cache behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with zero waste. First declares action, second provides domain context. Appropriately front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Simple tool with no input parameters and safety annotations provided. Description adequately covers the 'what' but lacks return value specification (no output schema exists). Does not mention if results are paginated or ordered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters present, which per scoring rules establishes a baseline of 4. No parameter documentation required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'List' and resource 'content folders'. Explicitly specifies 'content' which distinguishes from sibling tool 'list_asset_folders'. Second sentence explains domain purpose (URL path segments).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus 'get_folder' (which retrieves a specific folder) or versus 'list_asset_folders'. No mention of pagination, filtering, or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_forksList ForksA
Read-only

List all content fork workspaces. Forks let you stage changes to multiple pages as a batch before merging them live.

Each fork shows its status (active/merged/archived), page count, and who created it. Use get_fork to see the specific pages in a fork.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true. Description adds valuable context: explains the fork domain concept (batch staging) and documents return payload contents (status, page count, creator) despite lack of output schema. Does not mention pagination or side effects beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with zero waste: first states action + domain concept, second documents return values, third provides sibling guidance. Information is front-loaded and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, description fully compensates by detailing what fields are returned. With zero parameters and simple listing behavior, the description is complete covering purpose, usage guidance, and return value structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has zero parameters. Per guidelines, 0 params baseline is 4. Description correctly provides no parameter details since none exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb 'List' with resource 'content fork workspaces' and distinguishes scope from sibling get_fork by noting this lists 'all' workspaces while get_fork is for 'specific pages'. It also defines what forks are conceptually (staging changes before merging).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs users to sibling tool get_fork with 'Use get_fork to see the specific pages in a fork', clearly indicating when to use the alternative instead of this listing tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_import_jobsList Import JobsB
Read-only

List recent import jobs with their status and results

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of jobs to return (default 20, max 100)

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safe-read profile is covered. The description adds that results include status and results per job, which is modest extra value, but says nothing about ordering, time window for 'recent', or result size behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence with no wasted words. It is appropriately minimal for a simple list tool, though 'recent' is left undefined which costs a little precision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only list tool with no output schema, the definition is adequate but thin: it does not bound 'recent', state ordering, or hint at pagination, all of which an agent may need to interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single limit parameter is fully documented with default and max in the schema. The description adds nothing beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (import jobs) with the scope qualifier 'recent' and the payload ('status and results'). It naturally contrasts with the singular get_import_job sibling, but never names that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance and no alternatives named. The agent gets no signal on when to prefer this over get_import_job for a specific job, or how 'recent' is bounded in time relative to list_import_sources.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_import_sourcesList Import SourcesB
Read-only

List all configured RSS/Atom import sources

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered externally. The description only adds that sources are RSS/Atom-typed and that all configured entries are returned without filtering; it says nothing about pagination or result size.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler or redundancy. It is terse to the point of under-specification, but as a conciseness measure it is close to ideal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-argument, read-only listing tool with annotations covering the safety profile and no output schema, the description supplies what an agent needs to invoke it. The only meaningful gap is the absence of routing guidance versus list_import_jobs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline of 4 applies. There is nothing in the schema for the description to explain or compensate for.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and a specific resource ('configured RSS/Atom import sources'), which is enough for an agent to distinguish it from mutation siblings such as create_import_source, update_import_source, and delete_import_source. It does not, however, explicitly distinguish itself from the closely related list_import_jobs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisite or exclusion statements, and no mention of the nearest alternative (list_import_jobs, trigger_import_source). Usage is only implied by the word 'configured'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_redirectsList RedirectsA
Read-only

List all URL redirects configured for the site.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and openWorldHint=false. Description adds 'for the site' which reinforces the closed-world scope, but does not disclose pagination limits, default sorting, or the structure of returned redirect objects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single front-loaded sentence with zero redundancy. Every word conveys essential scope (all, configured, site) and action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Appropriately complete for a zero-parameter read-only tool. Description sufficiently covers the operation's intent, though it lacks details about the return structure (absent output schema) which would be necessary for optimal completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool accepts zero parameters. With no parameters to document, this meets the baseline expectation for the dimension.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb (List) and resource (URL redirects) with scope ('all', 'configured for the site'). Distinguishes from sibling create/delete_redirect operations by being a bulk listing operation, though it doesn't explicitly differentiate from other list_* tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use versus alternatives (e.g., when to list vs. create/update redirects) or prerequisites. Does not mention pagination behavior for sites with large numbers of redirects.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_scheduled_contentList Scheduled ContentA
Read-only

List all unpublished content items that have a scheduled publish time set.

ParametersJSON Schema
NameRequiredDescriptionDefault
folderNoOptional folder path filter (e.g. /blog)

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read, so the description's main added value is the scoping constraint (unpublished and scheduled). It says nothing about result ordering, pagination, or what the returned fields look like, so with the annotation carrying the safety profile a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the verb and the distinguishing scope constraint. Every word earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with one optional filter and no output schema, the description covers the essential scope well. Minor gaps around ordering/pagination behavior keep it from a 5, but 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single optional folder parameter is fully documented in the schema, so the description adds no parameter-level meaning. Baseline 3 applies when the schema does all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and a precisely scoped resource (unpublished content items with a scheduled publish time), which distinguishes it from the broader list_content and from schedule_content_publish. It does not, however, explicitly name a sibling it is not, so it falls just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The scope (unpublished + scheduled publish time) implies when to reach for it, but there is no explicit when-to-use statement, no exclusions, and no reference to alternates such as list_content or list_approval_requests. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_snippetsA
Read-only

List all snippets. Snippets are reusable Go-template HTML fragments used in lc:query index page directives.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true (safe read), but description adds valuable domain context: snippets contain 'Go-template HTML' and are used in 'lc:query index page directives' - behavioral traits not inferable from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste: first states purpose, second defines domain concept. Appropriately front-loaded and sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a zero-parameter read operation given annotations cover safety profile. Could improve by noting pagination behavior or output structure (absent output schema), but adequately covers domain context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters per input schema, triggering baseline score of 4 as per rubric. No parameter documentation burden exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verb 'List' and resource 'snippets', with 'all' implicitly distinguishing from sibling get_snippet. Second sentence defines snippets as 'reusable Go-template HTML fragments', clearly differentiating from templates/assets siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'all' qualifier implies bulk retrieval versus single-item siblings like get_snippet, but lacks explicit when-to-use guidance or named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_templatesList TemplatesB
Read-only

List all available templates. Templates define content structure with fields and HTML layout.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, confirming the safe read nature. The description adds minimal behavioral context: 'all available' implies broad scope without filtering, and the definitional sentence clarifies what templates contain (fields/HTML). However, it lacks details on pagination, response format, or empty result handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences. The first sentence is front-loaded with the core action. The second sentence provides domain context about template structure, which earns its place by helping distinguish templates from similar resources like snippets or assets, though it shifts slightly from describing the tool to describing the resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (no parameters, read-only) and lack of output schema, the description is minimally adequate. However, it should ideally hint at the return value structure (e.g., 'returns array of template metadata') to compensate for the missing output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema contains zero parameters (empty object with additionalProperties:false). Per evaluation guidelines, zero parameters establishes a baseline score of 4, as there are no parameter semantics to elaborate upon.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List') and resource ('templates') in the first sentence. The scope 'all available' implicitly distinguishes from sibling 'get_template' (single item retrieval), though it does not explicitly name that alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no guidance on when to use this tool versus alternatives like 'get_template' (for single template details) or 'create_template'. The second sentence defines what templates are conceptually, not when to invoke the listing operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_webhook_deliveriesList Webhook DeliveriesB
Read-only

List recent delivery attempts for a webhook.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWebhook ID,required
limitNoMaximum number of deliveries to return (default 50)

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the non-mutating nature is covered. The word "recent" implies a bounded, recency-ordered window, which is a small piece of behavioral context, but the description says nothing about whether failed/pending deliveries are included or how results are ordered or paged.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. It is efficient, though it errs toward terseness rather than covering any extra ground.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read-only list tool with no output schema, the description is adequate to call the tool correctly, but it leaves the return shape (fields per delivery, ordering, truncation behavior) entirely undisclosed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both `id` and `limit` (including the default of 50) are already fully documented in the schema. The description adds no format or constraint detail beyond that, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: listing delivery attempts scoped to a single webhook. It is clearly distinct in meaning from list_webhooks, but it never names that sibling or contrasts the two explicitly, so the differentiation is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of prerequisites (the webhook must exist / id is required), and no exclusions. An agent working alongside list_webhooks, get_webhook, and update_webhook gets no signal about which diagnostic situation calls for this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_webhooksList WebhooksA
Read-only

List all registered webhooks. Secrets are never returned.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already declares this is a safe read, so the bar is lower. The description adds a genuinely useful behavioral fact beyond the annotations: 'Secrets are never returned', which tells the agent it cannot harvest signing secrets here (relevant given regenerate_webhook_secret exists). It doesn't cover pagination or ordering, but the added disclosure is meaningful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste, with the core action front-loaded ahead of the caveat. Nothing is padded or repeated from the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-argument list tool with no output schema, the description covers the action and one important output constraint. It stops short of describing what a webhook record contains (id, url, events, enabled state) or whether results are paginated, which is the only remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a param-free tool is 4. No param-level gaps exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (registered webhooks) with scope ('all'), so the agent immediately knows this is a retrieval of webhook registrations. It does not explicitly distinguish itself from the close sibling list_webhook_deliveries, which shares the 'webhook' noun but returns delivery attempts rather than registrations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the name and description: call this when you need the set of registered webhooks. No when-to-use statement, no prerequisites, and no explicit pointer to create_webhook/update_webhook/delete_webhook or list_webhook_deliveries as alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

merge_forkMerge ForkA
Destructive

Merge all pages in a fork workspace into live content. Requires admin role.

For each page in the fork:

  • If a matching live page exists (same URL): updates it with the fork content (fork wins). If the live page was edited after the fork was created, records a conflict but still merges.

  • If no live page exists at that URL: creates a new live page. It keeps the publish state it had in the fork (normally draft) unless publish_new is true, which publishes it. Pages on hold always stay drafts.

After merging, the fork status changes to "merged", its page copies are deleted, and the created/updated counts are kept on the fork record. Published live pages are regenerated immediately.

Returns: updated and created counts, created_ids and updated_ids (live page IDs), not_published (new pages publish_new left as drafts, with the reason), and any conflicts detected.

ALWAYS confirm with the user before merging, as this pushes changes to the live site.

ParametersJSON Schema
NameRequiredDescriptionDefault
fork_idYesFork workspace ID to merge into live,required
publish_newNoAlso publish the pages this merge creates. Default false: new pages keep the publish state they had in the fork (normally draft). Pages on hold always stay drafts

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag destructiveHint=true and openWorldHint=false; the description goes well beyond that, spelling out per-page conflict handling, fork-wins precedence, publish-state preservation, the pages-on-hold exception, the post-merge state change (status becomes 'merged', copies deleted, counts retained), and immediate regeneration of published pages. That is exactly the additional context the annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in one sentence, the per-page rules are laid out as a scannable list, and the return-value rundown and confirmation warning are cleanly separated. Despite its length, each block carries distinct operational information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating the returned fields (updated/created counts, created_ids, updated_ids, not_published, conflicts), and it covers the destructive/mutation implications, admin requirement, and side effects. 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented, including publish_new's default and the hold exception. The description restates much of the same publish_new behavior rather than adding syntax or edge-case detail beyond it, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb (merge) and resource (fork workspace pages into live content), which cleanly distinguishes it from siblings like archive_fork, delete_fork, purge_fork_copies, and get_fork_diff. An agent can pick this tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states a concrete prerequisite (requires admin role) and an explicit operational rule (ALWAYS confirm with the user before merging, since it pushes changes to the live site). It does not, however, name alternatives or say when to prefer e.g. purge_fork_copies or archive_fork, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pin_theme_versionPin Theme VersionA
Idempotent

Lock a theme version so it is protected from automatic pruning or accidental overwrite. Pinned versions are marked with locked=true in get_theme_versions.

Use this to preserve milestone theme states (e.g., after a major redesign) before making further changes.

Example: {"version": 5}

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYesTheme version number to pin/unpin,required

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations establish idempotency and non-destructiveness; description adds crucial behavioral context about 'automatic pruning' protection (lifecycle management) and observability ('marked with locked=true in get_theme_versions'). Discloses protection scope beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three well-structured sentences: functional definition, usage context, and practical example. Every sentence earns its place with zero redundancy. Front-loaded with the core action and mechanism.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Appropriately complete for low-complexity tool (single parameter, no output schema). Covers protection mechanism, verification method, usage scenario, and input format without needing return value documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter already documented as 'Theme version number to pin/unpin'. Description provides syntax example ({'version': 5}) but does not significantly expand semantic meaning beyond the comprehensive schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific action (Lock/protect) on specific resource (theme version) with clear scope protection from 'automatic pruning or accidental overwrite'. Distinguishes from siblings by referencing get_theme_versions for observability of the locked state and implies relationship to unpinning operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance ('preserve milestone theme states...before making further changes') with contextual example (after major redesign). References get_theme_versions for verification. Does not explicitly name unpin_theme_version as the reversal mechanism, though sibling naming makes this inferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_contentPreview ContentA
Read-only

Render a content item's HTML without saving or publishing. Use this to verify what a page will look like before publishing.

Also accepts optional title/data overrides to preview unsaved edits: {"id": "abc123", "data": {"body": "New text"}}

Returns rendered_html and any warnings (missing required fields, unclosed tags, unresolved placeholders).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContent ID (MongoDB ObjectID),required
dataNoOverride field data for the preview (not saved). Merged on top of existing data.
titleNoOverride title for the preview (not saved)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true in annotations, description confirms safety with 'without saving.' Critically, it compensates for missing output schema by disclosing return structure ('rendered_html and any warnings') and specific warning types (missing fields, unclosed tags, unresolved placeholders).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four efficient sentences: purpose, usage, parameter example with syntax, and return value disclosure. No repetition of schema details, appropriately front-loaded with core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Thoroughly complete for a preview tool: describes output to compensate for missing output schema, provides parameter usage examples for the nested data object, and clarifies behavioral boundaries (read-only) given the complexity of 3 parameters including nested overrides.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 100% schema coverage (baseline 3), description adds value via concrete JSON example showing override syntax, and reinforces 'not saved' semantics for the data/title overrides. The example provides concrete usage context beyond the schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb 'Render' with resource 'content item's HTML' and explicitly distinguishes from siblings by stating 'without saving or publishing,' clearly differentiating it from update_content and publish_content in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear when-to-use context ('verify what a page will look like before publishing'), implicitly establishing the workflow relationship with publish_content. Does not explicitly name the alternative tool, so 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.

publish_contentPublish ContentA
DestructiveIdempotent

Publish a content item, making it visible on the public site. Generates the static HTML page.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContent ID (MongoDB ObjectID),required

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety profile (destructive, idempotent). Description adds valuable implementation detail ('Generates the static HTML page') and user-facing effect ('visible on the public site') that help the agent understand the scope of the operation beyond the hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences with no waste. Front-loaded with action and primary effect, followed by technical implementation detail. Every word serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a single-parameter mutation tool with good annotations. Explains the observable effects (visibility, HTML generation) sufficiently despite lacking output schema. Could improve by mentioning idempotency behavior or error cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear parameter description ('Content ID (MongoDB ObjectID)'). The description mentions 'content item' but doesn't add parameter-specific semantics beyond the schema, which is appropriate given the high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb ('Publish') and resource ('content item') with specific effects ('making it visible on the public site'). Loses one point for not explicitly differentiating from sibling 'publish_multiple' (single vs batch) or 'unpublish_content'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Describes the outcome (visibility, HTML generation) but lacks explicit guidance on when to use vs alternatives like 'preview_content' or 'publish_multiple', and doesn't mention prerequisites (content must exist first).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publish_multiplePublish MultipleA
DestructiveIdempotent

Publish multiple content items in a single call. Use this instead of calling publish_content in a loop.

Examples:

  • Publish specific pages: {"ids": ["abc123", "def456"]}

  • Publish all drafts at once: {"publish_all_drafts": true}

Held pages and fork copies are never published by this tool: they come back in "skipped" as {id, reason}. publish_all_drafts ignores fork copies entirely.

Returns published IDs, skipped items, and any failures.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoList of content IDs to publish. Mutually exclusive with publish_all_drafts.
publish_all_draftsNoIf true, publish every unpublished (draft) content item in the site

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint, destructiveHint, and openWorldHint, so the safety/mutation profile is covered. The description adds genuinely non-obvious behavior beyond that: held pages and fork copies are never published and surface in 'skipped' as {id, reason}, and publish_all_drafts ignores fork copies entirely. These edge cases would be invisible from the schema alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and the routing directive, then compact examples, then the skip/return semantics. Every sentence carries distinct information and nothing is redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by naming the return payload (published IDs, skipped items, failures). Combined with the mutual-exclusivity note and skip rules, an agent has everything needed to call and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description earns above baseline: it illustrates the shape of 'ids' ({"ids": ["abc123", "def456"]}) and clarifies that publish_all_drafts silently ignores fork copies, which the schema property description does not say.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (bulk publish of content items) and immediately distinguishes itself from the sibling publish_content by routing the agent away from looping. An agent can identify the tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative (publish_content) and the condition that selects this tool ('instead of calling publish_content in a loop'). The examples further demonstrate the two invocation modes, so the when-to-use decision is fully inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

purge_fork_copiesPurge Fork CopiesA
DestructiveIdempotent

Delete the page copies still attached to a merged or archived fork. Requires admin role.

Merges clean up after themselves since v7.4; forks merged before that kept their copies. Live pages are never touched, and the fork record is kept. Active forks are refused.

Use dry_run: true first to see the count and the list of {id, full_path}. Returns the number deleted and writes an audit log entry.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoIf true, return the count and the list of {id, full_path} without deleting anything
fork_idYesID of a merged or archived fork,required

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds substantial context beyond them: admin role requirement, that live pages are untouched, that the fork record survives, that active forks are refused, and that an audit log entry is written. These are exactly the safety-relevant details an agent needs before invoking a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and requirement, then history, then safety, then the dry-run recommendation. Each paragraph earns its place, though the v7.4 backstory is slightly more narrative than strictly necessary for tool selection.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with no output schema, the description covers what gets deleted, what is preserved, refusal conditions, the returned count, and the audit log side effect. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both fork_id and dry_run, including dry_run's exact behavior. The description's mention of dry_run re-frames it as recommended practice rather than adding new semantic detail, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('delete the page copies still attached to a merged or archived fork') with precise scope. An agent can immediately distinguish this from sibling tools like delete_fork, delete_content, or remove_fork_page.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names prerequisites ('Requires admin role'), when the tool is relevant (forks merged before v7.4 that kept their copies), when-not (active forks refused, live pages never touched), and recommends a safe ordering ('Use dry_run: true first'). This is close to ideal usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

regenerate_all_contentRegenerate All ContentA
Idempotent

Regenerate all published static HTML pages. Use after major theme or template changes.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety properties (idempotentHint, destructiveHint). The description adds valuable behavioral context by specifying the operation rebuilds 'static HTML pages' and implies it is triggered by structural changes (themes/templates). However, it omits operational details like whether this runs asynchronously, potential site performance impact during regeneration, or whether unpublished/draft content is affected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no redundancy. The first sentence states the action and scope; the second provides usage context. Every word earns its place with no filler or repetition of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and no output schema, the description adequately covers the tool's purpose and trigger conditions. It leverages the provided annotations for safety hints. A minor gap exists in not clarifying whether this affects the entire site or specific scopes, though 'all' suggests global scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters, the baseline score applies. The description requires no parameter clarification, and the schema is trivially complete at 100% coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description provides a specific verb ('regenerate'), a clear resource ('published static HTML pages'), and scope ('all'). The phrase 'static HTML pages' distinguishes this from dynamic content updates and siblings like update_content or publish_content that handle CMS records rather than cached HTML files.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool ('after major theme or template changes'), providing clear contextual guidance for the agent. However, it lacks explicit guidance on when not to use it (e.g., 'do not use for single page updates') or named alternatives from the sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

regenerate_webhook_secretRegenerate Webhook SecretA
Destructive

Generate a new HMAC-SHA256 signing secret for a webhook. The old secret stops working immediately. The new secret is returned ONCE — save it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWebhook ID,required

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare destructiveHint=true; the description goes well beyond that by disclosing the immediate invalidation of the old secret, the HMAC-SHA256 algorithm, and — critically — that the new secret is returned only once and must be saved. That irreversibility and one-time-visibility detail is exactly the operational context an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with zero filler, front-loaded with the action, then the destructive consequence, then the one-time-return warning. Every sentence carries distinct, actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with no output schema, the description covers what an agent must know: what it produces, that it destroys the prior secret immediately, and that the value cannot be retrieved later. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (id) exists and schema description coverage is 100%, so the schema fully documents it. The description adds no additional meaning about the id argument, which matches the baseline of 3 when the schema does all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (generate/regenerate) and resource (HMAC-SHA256 signing secret for a webhook), which is unambiguous. It doesn't explicitly contrast itself with the nearby update_webhook or create_webhook siblings, but the action is distinct enough that confusion is unlikely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied — an agent can infer you call this when rotating a compromised or stale credential. There is no explicit 'use this when' guidance, no exclusions, and no pointer to update_webhook for non-secret changes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reindex_embeddingsReindex EmbeddingsA
Idempotent

Regenerate vector embeddings for all published content. Required after initial setup or if embeddings become stale.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare idempotentHint=true and destructiveHint=false, establishing safety profile. Description adds operational context (triggers: initial setup, staleness) but omits details about execution duration, performance impact, or whether it blocks other operations. Appropriate given annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero redundancy: first defines operation, second specifies usage triggers. Front-loaded with concrete action verb and no filler text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Appropriately complete for a parameterless maintenance operation with good safety annotations. Describes scope (all published content) and timing, though could briefly mention relationship to search functionality or execution mode (async vs sync).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters present, meeting baseline for this score per evaluation rules. Schema requires no additional semantic elaboration.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'Regenerate' and specific resource 'vector embeddings' scoped to 'all published content'. Effectively distinguishes from sibling 'regenerate_all_content' by specifying the target resource (embeddings vs content), though explicit contrast with that sibling is absent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states trigger conditions ('after initial setup or if embeddings become stale'), providing clear when-to-use guidance. Lacks explicit when-not-to-use warnings or named alternatives, but the conditional requirement signals appropriate usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reject_requestReject RequestA
Destructive

Reject an approval request. A comment explaining the rejection is required and will be posted to the content's discussion thread.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesrequired,Approval request ID
commentYesrequired,Rejection reason (required)

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply destructiveHint=true, so the description carries most of the burden; it usefully discloses the side effect that the comment 'will be posted to the content's discussion thread', which tells the agent the rejection reason is publicly visible. It stops short of stating permissions required, whether the decision is final, or whether the request can be resubmitted via submit_for_approval.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with the action front-loaded and the side effect immediately following. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema and minimal annotations, the description covers the action and its most important side effect and both required parameters are documented. It is nearly complete, missing only downstream consequences (finality, resubmission path, permission requirements).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3, but the description adds meaning beyond the schema by explaining the purpose of the comment (it explains the rejection) and where it is surfaced (the discussion thread), which shapes how the agent should author that value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('Reject an approval request'), which is unambiguous and inherently distinguishes it from the sibling approve_request. It does not explicitly name that sibling, but the verb alone makes the intent unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use or when-not guidance and no mention of alternatives such as approve_request or cancel_approval_request. The agent must infer the appropriate context entirely from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

release_content_lockRelease Content LockA
Idempotent

Release the advisory lock on a content item held by the current API user.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_idYesContent item ID,required

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=false, so safety and repeatability are covered by structured data. The description adds the ownership constraint (you can only release your own lock), which is genuine behavioral context, but says nothing about auth requirements or what happens if no lock is held.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with no filler, front-loading the action and the resource. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter lock-release tool with no output schema, the essentials are present, but the description omits the sibling relationship with force_unlock_content and get_content_lock, and does not state error/no-op behavior. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single content_id parameter, so the schema carries parameter meaning. The description adds no format or validation detail beyond identifying the item whose lock is released, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('Release') and resource ('advisory lock on a content item') plus a scope qualifier ('held by the current API user'). It does not, however, distinguish itself from the sibling force_unlock_content, which is the one distinction an agent most needs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'held by the current API user' implies the call is only valid for locks you own, which hints at when to prefer force_unlock_content. That inference is never stated explicitly, and there are no prerequisites or failure conditions spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_fork_pageRemove Fork PageA
DestructiveIdempotent

Remove a page from a fork workspace (discards the fork copy, does not affect the live page).

ParametersJSON Schema
NameRequiredDescriptionDefault
fork_idYesFork workspace ID,required
page_idYesID of the fork page to remove (not the live content ID),required

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and idempotentHint=true. The description adds critical behavioral context beyond annotations: 'discards the fork copy' clarifies what gets destroyed, while 'does not affect the live page' provides essential safety information that prevents accidental misuse. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with parenthetical delivers complete information without waste. Every component earns its place: action verb, target resource, destruction clarification, and safety boundary. Front-loaded with the core operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite being a destructive operation (destructiveHint=true), the description adequately covers scope and safety. No output schema is present, but for a removal operation, describing what is/isn't affected suffices. Could slightly improve by mentioning irreversibility explicitly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% description coverage with 'Fork workspace ID' and 'ID of the fork page to remove (not the live content ID)'. The description does not add parameter-specific semantics, but with high schema coverage, the baseline 3 is appropriate per rubric rules.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verb 'Remove' with clear resource 'page from a fork workspace'. The parenthetical '(discards the fork copy, does not affect the live page)' effectively distinguishes this from sibling tools like 'delete_content' (live deletion) and 'delete_fork' (entire workspace deletion) by scoping the operation to fork copies only.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical clause 'does not affect the live page' provides explicit usage boundaries (when NOT to use), establishing that this tool is for fork workspace cleanup only. While it doesn't explicitly name alternatives like 'delete_content', the negative constraint clearly signals this is inappropriate for live content management.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restore_contentRestore ContentA
Idempotent

Restore a soft-deleted content item. Regenerates static page if content was published.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContent ID (MongoDB ObjectID),required

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds valuable side-effect disclosure ('Regenerates static page if content was published') beyond what annotations provide (idempotentHint, destructiveHint). However, misses error behavior (what if ID not found/not deleted) and authorization requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. Main action front-loaded in first sentence; second sentence adds distinct value by describing side effects. Structure is optimal for quick agent comprehension.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a single-parameter state-change operation. Combines clear annotations with description covering the restoration scope and side effects. Lacks error case documentation but acceptable given tool simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with complete parameter documentation ('Content ID (MongoDB ObjectID), required'). Description provides no additional parameter semantics, but baseline 3 is appropriate given schema already documents everything.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific action ('Restore') and resource ('soft-deleted content item'), distinguishing it from sibling create_content. The 'soft-deleted' qualifier clearly scopes the operation to recovery of trashed items versus creating new content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The term 'soft-deleted' implies prerequisite state, but lacks explicit guidance on when to use versus alternatives (e.g., create_content) or when not to use (e.g., hard-deleted items). No sibling comparisons or workflow guidance provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revert_theme_to_versionRevert Theme to VersionA
Destructive

Revert theme to a previous version. Creates a new version with the old data.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYesVersion number to revert to,required
version_commentNoOptional comment for the revert (e.g., 'Reverted to v3')

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true, but the description adds crucial behavioral context: 'Creates a new version with the old data.' This disclosure that reverting creates a new version entry (rather than destructive rollback) is valuable transparency beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. First sentence establishes operation and resource; second sentence provides essential behavioral information about version creation. Every word earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive 2-parameter tool with complete schema documentation, the description appropriately explains what the operation does and its non-destructive version creation behavior. No output schema exists, but the description sufficiently covers the operation's intent and side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the schema adequately documents both parameters (version number and optional comment). The description implies the version parameter but does not add semantic details, syntax constraints, or examples beyond what the schema provides. Baseline 3 is appropriate given comprehensive schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verb 'Revert' with resource 'theme' and scope 'to a previous version'. The second sentence 'Creates a new version with the old data' clarifies the semantic behavior. It distinguishes from sibling 'revert_to_version' by explicitly mentioning 'theme' in the description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through resource naming (theme vs content), but provides no explicit when-to-use guidance or comparison to siblings like 'revert_to_version' or 'restore_content'. The agent must infer applicability from the tool name and description alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revert_to_versionRevert to VersionA
Destructive

Revert content to a previous version. Creates a new version with the old data.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYesVersion number to revert to,required
content_idYesContent ID (MongoDB ObjectID),required
version_commentNoOptional comment for the revert (e.g., 'Reverted to v3')

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Excellent clarification of behavioral nuance: despite 'destructiveHint' annotation signaling state mutation, description explains it 'creates a new version with the old data' rather than destructive overwrite. This preserves history and mitigates data loss fears, adding crucial context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise with two information-dense sentences. Front-loaded action ('Revert content...') with mechanism explanation following. Zero redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the essential 'copy-on-write' behavioral quirk adequately for a destructive operation, but lacks coverage of error cases, return value shape, or prerequisites given no output schema exists. Acceptable but gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, parameters are already well-documented. Description implies 'content' maps to content_id and 'previous version' to version, but adds no syntax details, format specifics, or examples beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verb (revert) and resource (content/version) clearly. Distinguishes from sibling 'revert_theme_to_version' by specifying 'content', but does not explicitly differentiate from 'restore_content' (restore from trash vs. version revert).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no guidance on when to use this tool versus alternatives (e.g., 'get_content_versions' to identify target version first) or prerequisites. No mention of error conditions (e.g., invalid version number).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rollback_agent_sessionRollback Agent SessionA
DestructiveIdempotent

Undo every content change made by an agent session as a unit: content the session created is soft-deleted, deleted content is restored, and updated content reverts to its latest pre-session version. Defaults to the current MCP session ("undo everything I did"). Non-content changes (templates, settings) are listed for manual review but not auto-reverted.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idNoAgent session ID. Defaults to this MCP session's own ID.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag destructive/idempotent/openWorld; the description adds substantial detail beyond them: soft-delete vs restore vs revert semantics per change type, unit-of-work behavior, and the explicit carve-out that templates/settings are not auto-reverted. This is exactly the added behavioral context the dimension rewards.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then the per-type semantics, then the caveat. Three dense sentences with no filler; slightly long but each clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description covers the mutation's behavior thoroughly enough for correct invocation. The one gap is that it doesn't describe what the 'listed for manual review' output looks like, but that is minor for a rollback tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameter is already documented, but the description adds the meaningful default semantics ('Defaults to this MCP session's own ID', i.e. 'undo everything I did') that the schema does not convey as behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb (undo/rollback) and resource (every content change from an agent session) and goes further by enumerating the exact semantics: creates are soft-deleted, deletes restored, updates reverted. It is clearly distinct from siblings like get_agent_session_changes and end_agent_sandbox.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the default case ('undo everything I did') and clarifies scope limits (non-content changes are only listed, not reverted). It gives clear context for when to call it, though it doesn't explicitly name a preview alternative such as get_agent_session_changes before committing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_maintenance_scanRun Maintenance ScanA
Idempotent

Run a site-health scan now and return the fresh report. Scans also run automatically once a day.

ParametersJSON Schema
NameRequiredDescriptionDefault
link_checkNoAlso start an async broken-link check job

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description usefully adds that scans also run on a daily schedule, but it omits the call's operational shape: whether the scan blocks or runs asynchronously, approximate latency, and that link_check=true spawns a separate async job.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, action and return value front-loaded, with the scheduling fact as supporting context. Nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter trigger with no output schema, the description covers intent and return ('fresh report') adequately, and annotations carry the safety profile. It stops short of describing scan duration/blocking behavior or what the report contains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage and a single optional boolean, the schema already documents link_check fully, including its async side effect. The description adds no parameter-level meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+outcome: run a site-health scan now and return the fresh report. 'Fresh' implicitly contrasts with the sibling get_maintenance_report (which presumably returns the stored report), but the sibling is never named, so the differentiation is inferred rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The timing context ('now', plus the note that scans already run once a day) hints that this is for on-demand freshness rather than routine reads, but there is no explicit when-to-use/when-not statement and no alternative such as get_maintenance_report is named for the case where a recent report already exists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schedule_content_publishSchedule Content PublishA
Idempotent

Set a future publish date/time for a content item. The scheduler automatically publishes it when the time arrives.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_idYesContent item ID,required
publish_atYesISO 8601 datetime when to publish (e.g. 2026-03-24T15:00:00Z),required

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare idempotentHint=true and destructiveHint=false, so the safety/idempotency profile is already covered. The description adds real behavioral context by explaining that the scheduler publishes automatically when the time arrives, but omits permissions needed, what happens if a schedule already exists, and how to undo (cancel_scheduled_publish).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero waste; the core action is front-loaded and the automatic-publish consequence follows immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter write tool with no output schema, the description covers the action and the deferred-execution behavior adequately. It still leaves gaps around permissions, overwrite/duplicate scheduling semantics, and how the schedule is cancelled or listed, which the sibling set makes relevant.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents content_id and the ISO 8601 format with an example, so baseline is 3. The description only restates that the date must be in the future, adding no syntax or constraint detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Set a future publish date/time for a content item.' The 'future' qualifier implicitly separates it from publish_content (immediate) and cancel_scheduled_publish, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'future publish date/time' and the note that the scheduler publishes automatically, which tells the agent this is for deferred publishing rather than immediate release. However, it never names alternatives like publish_content or cancel_scheduled_publish, nor states when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scoped_search_replace_executeScoped Search Replace ExecuteA
Destructive

Execute a search-and-replace limited to a subset of pages. ALWAYS run scoped_search_replace_preview first and show results to the user before executing.

Scope options (all optional):

  • content_ids, folder_path, template_name, category

Set auto_republish: true to immediately re-publish all previously-published pages after updating them, collapsing the execute + publish_multiple flow into one call.

Only live pages are changed: fork copies named in content_ids come back in "skipped" as {id, reason}.

Example: {"search": "old text", "replace": "new text", "folder_path": "/blog", "auto_republish": true, "version_comment": "Updated old references"}

ParametersJSON Schema
NameRequiredDescriptionDefault
regexNoIf true, treat search as a Go regular expression. Use $1, $2 for capture group references in replace.
searchYesText to search for,required
replaceYesReplacement text (empty string to delete)
categoryNoLimit to pages in this category
content_idsNoLimit to specific content IDs
folder_pathNoLimit to pages whose URL starts with this path (e.g. /blog)
template_nameNoLimit to pages using this template name (e.g. 'Concept Page')
auto_republishNoIf true (execute only), re-publish all previously-published pages immediately after updating them (saves a separate publish_multiple call)
version_commentNoVersion comment for updated pages

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: only live pages are changed and fork copies named in content_ids are returned in a 'skipped' list as {id, reason}. It still omits whether the operation is reversible/rollbackable, but the added fork-skip semantics are meaningful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the operation and the mandatory preview step, then uses a bullet list for scope options and closes with a concrete JSON example. The scope bullet list mostly duplicates the schema and could be trimmed, but overall it is well-structured and appropriately sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive bulk mutation, it covers the precondition (preview first), the scoping dimensions, live-vs-fork behavior, and the skipped-return shape. Auth/permission requirements and reversibility are not addressed, but with destructiveHint set and no output schema, the description is largely complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is documented in the schema itself (including the auto_republish publish_multiple collapsing detail and the regex capture-group syntax). The description's scope-option list and auto_republish note largely restate schema content, adding grouping but little new meaning. Baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (execute), resource (search-and-replace) and scope (limited to a subset of pages), and names the preview sibling. The scope options are enumerated clearly. It does not distinguish itself from the sibling search_replace_execute (the unscoped variant), so an agent must infer that difference from the word 'scoped'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition ('ALWAYS run scoped_search_replace_preview first and show results to the user before executing') and routes the agent to that alternative. It also explains when to enable auto_republish to collapse the execute + publish_multiple flow, which is actionable guidance rather than mere description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scoped_search_replace_previewScoped Search Replace PreviewA
Read-only

Preview a search-and-replace limited to a subset of pages. Safer than site-wide replacement.

Scope options (all optional — leave blank to match all pages):

  • content_ids: specific page IDs

  • folder_path: pages under /blog, /docs, etc.

  • template_name: pages using "Concept Page", "Blog Post", etc.

  • category: pages with a matching category

Only live pages are searched: fork copies named in content_ids come back in "skipped" as {id, reason}.

Example: {"search": "old text", "replace": "new text", "folder_path": "/blog"}

Always run preview before execute.

ParametersJSON Schema
NameRequiredDescriptionDefault
regexNoIf true, treat search as a Go regular expression. Use $1, $2 for capture group references in replace.
searchYesText to search for,required
replaceYesReplacement text (empty string to delete)
categoryNoLimit to pages in this category
content_idsNoLimit to specific content IDs
folder_pathNoLimit to pages whose URL starts with this path (e.g. /blog)
template_nameNoLimit to pages using this template name (e.g. 'Concept Page')
auto_republishNoIf true (execute only), re-publish all previously-published pages immediately after updating them (saves a separate publish_multiple call)
version_commentNoVersion comment for updated pages

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already declared, the description still adds real context: only live pages are searched and fork copies named in content_ids are returned in 'skipped' as {id, reason}, plus that auto_republish applies to execute only. This goes beyond the annotations, though it does not describe the preview output shape more fully.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then bulleted scope options, a caveat on skipped pages, and a compact example. Every line carries information; nothing is redundant padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only preview with no output schema, the description covers scope, defaults, safety framing, and a key edge case (skipped forks). It could say more about what the preview response contains, but it is sufficient to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds the default semantics ('all optional — leave blank to match all pages') and illustrates each scope filter with concrete values, which the schema does not state. A worked example ties the parameters together usefully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (preview) and resource (search-and-replace) plus its distinguishing scope (limited to a subset of pages). It explicitly contrasts with site-wide replacement and ties itself to the execute sibling via 'Always run preview before execute', so an agent can place it without opening other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Safer than site-wide replacement' and 'Always run preview before execute' give clear when-to-use guidance and route to the execute step. It does not explicitly differentiate itself from the non-scoped search_replace_preview sibling, which is the one remaining ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_contentSearch ContentB
Read-only

Search across all content items by title or full text. Returns matching content with paths and match context.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query string,required
search_typeNoSearch type: 'name' (title only) or 'fulltext' (all fields). Defaults to 'fulltext'
include_forksNoAlso search fork copies (working copies inside fork workspaces). Off by default
include_deletedNoInclude soft-deleted content in results

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the return shape ('with paths and match context'), which is useful since no output schema exists, but says nothing about result limits, pagination, ordering, or the cost of a full-text scan. Modest added value over the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the operation before the return description. Nothing is wasted, though the content is thin enough that it under-explains rather than over-explains.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter, read-only search tool with no output schema, the definition covers what is searched and roughly what comes back. It omits result caps, pagination/continuation behavior, and any note on search scope (spaces, workspaces, languages), which an agent needs to call a search reliably.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema documents search_type, include_forks, and include_deleted more precisely than the description does (e.g. defaults, fork semantics). The description's 'by title or full text' merely restates the search_type enum, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search across all content items') plus the matching modes ('by title or full text'), so the core operation is unambiguous. It does not, however, differentiate itself from search-adjacent siblings such as end_user_search, list_content, or get_content, which an agent must choose between.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use or when-not-to-use guidance, no mention of prerequisites or alternatives. The only implicit signal is 'across all content items', which hints at scope but does not tell the agent why it should pick this over end_user_search or a plain listing call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_replace_executeSearch Replace ExecuteA
Destructive

Execute a site-wide search-and-replace across all content. Modifies every matching page permanently.

MANDATORY workflow:

  1. Run search_replace_preview and show the user which pages will be affected.

  2. Get explicit user confirmation before executing.

  3. Run search_replace_execute with a clear version_comment.

Set auto_republish: true to immediately re-publish all previously-published pages after updating them, collapsing the execute + publish_multiple flow into one call.

For targeted replacements, use scoped_search_replace_execute instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
pairsNoArray of {search, replace, regex} pairs for bulk mode. Applies all replacements in a single pass per page.
regexNoIf true, treat search as regex (single-pair mode)
searchNoText to search for (single-pair mode)
replaceNoText to replace with (single-pair mode)
auto_republishNoIf true, re-publish updated pages immediately
version_commentNoComment for version history

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, but the description adds substantive context beyond them: that all matching pages are changed permanently, the required preview/confirmation safety flow, and the side effect that auto_republish re-publishes previously-published pages. This is exactly the 'what gets destroyed' context the annotations alone don't convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the blast radius, then the mandatory workflow, then the parameter note, then the alternative. Every sentence earns its place and the numbered steps are easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description covers side effects, the safety workflow, the cross-tool relationship (preview/publish_multiple/scoped variant), and permanence. Nothing an agent needs to invoke this destructive tool safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the description adds meaning by explaining that auto_republish collapses the execute + publish_multiple flow into one call, which is not stated in the schema. It does not, however, discuss the pairs array vs single-pair mode relationship in the body text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource+scope ('Execute a site-wide search-and-replace across all content') and immediately clarifies the blast radius ('Modifies every matching page permanently'). It explicitly distinguishes itself from the scoped sibling, so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit mandatory workflow (preview, confirm, execute with version_comment) plus a named alternative for the other case ('For targeted replacements, use scoped_search_replace_execute instead'). It also tells the agent when to set auto_republish, i.e. when publish_multiple would otherwise be needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_replace_previewSearch Replace PreviewA
Read-only

Preview a site-wide search-and-replace without making any changes. ALWAYS run this before search_replace_execute.

Returns: affected page count, total match count, and per-page field breakdown. Only live pages are searched; fork copies are never matched or rewritten. For targeted replacements (a folder, template, or category), use scoped_search_replace_preview instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
pairsNoArray of {search, replace, regex} pairs for bulk mode. Scans each page once, applying all pairs in order. Much faster than calling preview multiple times.
regexNoIf true, treat search as regex (single-pair mode)
searchNoText to search for (single-pair mode)
replaceNoText to replace with (single-pair mode)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the 'no changes' guarantee is partly redundant, but the description adds real behavioral detail: only live pages are searched and fork copies are never matched or rewritten. It does not cover the batch-vs-single-pair execution cost beyond what the schema says.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Short, front-loaded: action and safety first, mandate second, return shape third, sibling routing last. Every sentence carries distinct information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by naming the return shape (affected page count, total match count, per-page field breakdown). Combined with the safety and scoping notes, it is complete enough for an agent to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all four parameters (pairs, regex, search, replace, and the nested regex flag) are already documented in the schema. The description adds nothing about parameter syntax or precedence, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Preview a site-wide search-and-replace') and immediately distinguishes scope ('site-wide') from the scoped variant. An agent can tell it apart from search_replace_execute and scoped_search_replace_preview without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'ALWAYS run this before search_replace_execute' and names the alternative for targeted replacements with the selecting condition (folder, template, category). Both when-to-use and when-to-use-something-else are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_indexnow_enabledEnable/Disable IndexNowA
Idempotent

Turn automatic IndexNow submission on or off for this site (on by default).

ParametersJSON Schema
NameRequiredDescriptionDefault
enabledYestrue to submit changed pages to IndexNow automatically, false to stop

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=false, covering the safety profile, and the description usefully adds the default state and the site-level scope. It does not say what disabling actually stops (polling, future changed-page submissions, in-flight work) or whether any permission is required, so the added behavioral value is modest.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the action and resource, with the default state appended where it is most useful. Nothing is wasted or repeated from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-boolean, idempotent, non-destructive toggle with a fully documented parameter and no output schema, the description supplies what an agent needs plus the default-state caveat. Only the effects of disabling remain unspecified, a minor gap for a tool this simple.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter is documented at 100% coverage in the schema, including the meaning of true ('submit changed pages automatically') and false ('stop'). The description adds no syntax, format, or edge-case detail beyond that, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb pair (turn on/off) and a specific resource (automatic IndexNow submission) scoped to 'this site', which is enough to separate it from get_indexnow_status and submit_indexnow. It stops short of explicitly naming those siblings, so an agent must infer the boundary rather than being told.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical '(on by default)' is the only decision support offered: it implies the agent only needs this tool when the feature has previously been switched off. There is no explicit when-to-use/when-not guidance and no mention of get_indexnow_status or submit_indexnow as alternatives, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_agent_sandboxStart Agent SandboxA

Start a sandboxed editing session backed by a content fork ("pull request for content").

While the sandbox is active:

  • update_content / update_content_by_path transparently copy pages into the fork and edit the copies (copy-on-write). Live content is never modified.

  • create_content creates new pages inside the fork.

  • Publishing, deleting, bulk operations, and search/replace-execute are blocked.

  • The site is unaffected until a human reviews the fork at /cm/forks and merges it.

Recommended for any multi-page or risky editing task. End with end_agent_sandbox.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoShort name for the sandbox fork (e.g. 'refresh-pricing-pages'). Auto-generated when omitted.
descriptionNoWhat this agent session intends to change — shown to the human reviewer.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare destructiveHint=false and openWorldHint=false; the description adds far more — copy-on-write semantics (live content never modified), a precise list of what is blocked (publishing, deleting, bulk ops, search/replace-execute), the required human review/merge at /cm/forks, and which tools behave differently inside the sandbox. This is exactly the extra context the annotations leave out.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, followed by a scannable bullet list of behavioral consequences and a closing call to action. No sentence is redundant; every bullet conveys a distinct, actionable constraint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a session-lifecycle tool with no output schema, the description covers initiation, in-session semantics, blocked operations, safety guarantees, and teardown. Nothing an agent needs to invoke it safely and correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both the 'name' and 'description' parameters are already fully documented in the schema (including the auto-generation behavior when 'name' is omitted). The description adds no parameter-level detail, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Start a sandboxed editing session backed by a content fork.' The parenthetical 'pull request for content' and the explicit copy-on-write behavior clearly separate it from siblings like create_fork, fork_page, and end_agent_sandbox.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Recommended for any multi-page or risky editing task. End with end_agent_sandbox.' gives a clear when-to-use condition and names the companion teardown tool. It stops short of naming when NOT to use it (e.g., single-page edits vs. create_fork), so it falls just 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.

submit_for_approvalSubmit Content for ApprovalB

Explicitly submit a content item for editorial approval. Contributors must submit content for approval before it can be published.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_idYesrequired,Content ID to submit for approval

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare destructiveHint=false and a title, so the description carries most of the behavioral burden. It usefully discloses the publish-gating workflow constraint, but says nothing about permissions required, whether a notification or approval request is generated, or whether re-submitting an already-pending item errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, action stated first, prerequisite second, with no filler. Slight redundancy in restating 'submit content for approval' twice, but size is appropriate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation with no output schema and thin annotations, the description covers the intent and the workflow gate but omits the outcome (what state change occurs, who reviews next). Adequate but with a visible gap around post-submission behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single content_id parameter, so the schema already documents it fully. The description adds no format, ID-source, or constraint detail beyond the schema, which is the expected baseline here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('submit') and resource ('a content item') with the target of the action ('editorial approval'). It is clearly distinguishable from approve_request/reject_request/cancel_approval_request, though it never names those siblings to sharpen the contrast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence provides a real prerequisite: content must be submitted for approval before it can be published. That implies when to use it, but there is no explicit guidance on alternatives (cancel_approval_request, list_approval_requests) or on what to do if a submission already exists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_indexnowSubmit URLs to IndexNowA

Submit pages to IndexNow now. Changes are already submitted automatically on publish/update/delete; use this to resubmit specific paths, or all=true to submit every published page (once per hour max).

ParametersJSON Schema
NameRequiredDescriptionDefault
allNoSubmit every published page (limited to once per hour)
pathsNoSpecific site paths to submit, e.g. ["/blog/post"]

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real behavior beyond the annotations (openWorldHint, destructiveHint=false): the one-per-hour rate limit on the all=true mode and the fact that submissions already happen automatically on content changes. Permissions and error behavior are not covered, but the rate-limit disclosure is a substantive addition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, and the key constraint (already automatic; use for resubmission) is front-loaded before the parameter guidance. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter submit tool with no output schema, the description supplies everything needed: what triggers it, the two modes, and the rate limit. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (all, paths) are already documented in the schema, including the hourly limit and the path-array example. The description restates the same semantics rather than adding new meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (submit), resource (pages), and destination (IndexNow) in the first sentence. It also implicitly separates itself from the automatic publish/update/delete submission path, so an agent can tell what this call is uniquely for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the routing condition clearly: use it to resubmit specific paths, or all=true for a full submit. It also notes that publish/update/delete already submit automatically, which effectively tells the agent when this call is not needed. It stops short of naming related siblings like set_indexnow_enabled or get_indexnow_status as alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trigger_import_sourceTrigger Import SourceA

Manually trigger an RSS import source to run immediately

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesImport source ID,required

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare openWorldHint=true (external RSS fetch) and destructiveHint=false, so the safety profile is covered. The description adds that this is an on-demand execution, but does not disclose whether the run is synchronous or returns a job handle, nor whether concurrent runs are allowed — meaningful gaps for a trigger tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. Every word contributes to identifying the action, the target and the timing behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter trigger the description is workable, but it omits the follow-up path an agent needs — there is no output schema, yet it never says whether a job is created or that get_import_job/list_import_jobs should be used to track the run.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single 'id' parameter, so the schema already carries the semantics. The description adds no format, allowed value, or lookup guidance beyond it; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (trigger) plus resource (RSS import source) and qualifies the outcome (run immediately), which cleanly separates it from the list_/create_/update_/delete_import_source siblings. An agent can identify what this does without consulting the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The word 'manually' implies the intended case: forcing an immediate run instead of waiting for the scheduled cadence. However, it never names alternatives, states prerequisites (e.g. whether the source must be enabled or idle), or warns about repeat invocation, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unpin_theme_versionUnpin Theme VersionA
Idempotent

Remove the lock from a previously pinned theme version.

Example: {"version": 5}

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYesTheme version number to pin/unpin,required

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explains that 'unpin' means removing a lock, which adds conceptual context beyond the annotations. However, it fails to disclose what state the theme enters after unpinning (does it track latest? stay fixed?) or mention the idempotent nature explicitly, though annotations cover safety profiles (destructiveHint=false, idempotentHint=true). No contradictions found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely efficient: one descriptive sentence followed by a concrete example. Every element earns its place, with the action front-loaded and zero redundant text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter state-change operation with good annotations covering safety/idempotency, the description adequately covers the core operation. It lacks explanation of the post-unpin behavior (which would help agents predict system state), but given the simplicity and lack of output schema, this is reasonable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the baseline is 3. The description adds an example JSON structure ('Example: {"version": 5}'), which helps clarify the expected format, but doesn't add semantic meaning beyond the schema's 'Theme version number to pin/unpin' description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Remove the lock') with a specific resource ('previously pinned theme version'), clearly distinguishing this from sibling tools like pin_theme_version (inverse operation) and revert_theme_to_version (which changes active version rather than just removing a lock).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'previously pinned' implies a precondition that the version must be locked, but there's no explicit guidance on when to use this vs. pin_theme_version, nor any mention of prerequisites like checking current pin status or what happens after unpinning (e.g., auto-updates resuming).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unpublish_contentUnpublish ContentA
DestructiveIdempotent

Unpublish a content item, removing it from the public site. Removes the static HTML page.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContent ID (MongoDB ObjectID),required

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Aligns with destructiveHint=true by describing removal actions. Adds valuable specific context beyond annotations by specifying 'Removes the static HTML page' as the mechanism, clarifying the scope of destruction without contradicting idempotentHint=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. Front-loaded with primary action and effect ('Unpublish... removing it from the public site'), followed by technical implementation detail ('Removes the static HTML page'). Optimal length for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Sufficient for a single-parameter destructive operation with good annotations. Describes the external effect (removal from public site) and mechanism (static HTML). Could be elevated by describing the resulting content state (draft/archived) or return confirmation, but adequate given schema simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with the 'id' parameter fully documented in the schema ('Content ID (MongoDB ObjectID)'). Description mentions no parameters, but baseline 3 is appropriate given complete schema coverage requiring no additional semantic explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific action 'Unpublish' on resource 'content item', clearly distinguishing from sibling 'delete_content' by specifying removal occurs only from 'the public site' while implying the item persists internally. Also adds technical specificity with 'static HTML page'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage context ('public site') but lacks explicit guidance on when to use versus 'delete_content' or other alternatives. No mention of prerequisites or state transitions (e.g., does it become a draft?).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_approval_workflowUpdate Approval WorkflowC

Update an existing approval workflow.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesrequired,Workflow ID to update
modeYesrequired,sequential or concurrent
nameYesrequired,Workflow name
triggerYesrequired,Trigger type: all_contributor | folder_path | template_id | tag
approversNoOrdered list of approvers
descriptionNoOptional description
trigger_valueNoValue for the trigger

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide only destructiveHint=false, so the description carries most of the behavioral burden for a mutation tool. It reveals nothing about whether this is a full replace or partial update, whether name/trigger conflicts are rejected, or whether changes require re-approval. 'Update an existing workflow' is effectively tautological with the name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single short sentence with no wasted words, but at only five words it is under-specified rather than genuinely concise. Structure is fine but content is thin for a 7-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 7 parameters, 4 required, and no output schema, the description omits critical context: whether unspecified fields are preserved, what the required identifiers are, and what the result returns. Schema coverage helps, but the description leaves the agent without behavioral or workflow context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in the schema, including enum-like values for mode and trigger. The description adds no syntax or semantic detail beyond the schema, which sets the baseline at 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (Update) and resource (approval workflow), which clearly differentiates it from create_approval_workflow, delete_approval_workflow, get_approval_workflow, and list_approval_workflows by verb alone. However, it does not say what aspects of the workflow can be updated, nor explicitly reference the sibling read/delete variants.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus create_approval_workflow or get_approval_workflow, and no mention of prerequisites such as needing an existing workflow id. The agent must infer usage entirely from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_collectionUpdate CollectionC
DestructiveIdempotent

Update a collection's settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCollection ID (MongoDB ObjectID),required
nameNoCollection name
slugNoCollection URL slug
categoryNoContent category to include
sort_fieldNoField to sort by
sort_orderNoSort order: asc or desc
descriptionNoCollection description
item_templateNoHTML template for each item
page_templateNoHTML template for collection page
items_per_pageNoItems per page for pagination

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate idempotent and destructive behavior, but the description fails to explain what is destroyed (e.g., are previous settings overwritten irreversibly?) or the scope of the update (partial vs full replacement).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely brief at four words, which prevents redundancy, but front-loads so little information that it borders on under-specification rather than efficient conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Inadequate for a destructive, idempotent operation with 10 parameters. Lacks explanation of side effects, return values, error conditions, or the relationship between parameters like templates and pagination settings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the schema adequately documents each parameter. The description adds minimal semantic value beyond grouping parameters as 'settings', meeting the baseline expectation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the action (update) and resource (collection settings), but is vague about what constitutes 'settings' and does not differentiate from sibling tools like update_content or update_template.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no guidance on when to use this tool versus alternatives (e.g., update_content for items within a collection), nor mentions prerequisites or constraints beyond the ID requirement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_contentUpdate ContentA
DestructiveIdempotent

Update an existing content item by ID. Creates a new version automatically. Only send fields you want to change.

For partial data updates, only the keys you include in "data" are changed — existing keys are preserved (merge semantics). Use clear_fields: ["field1", "field2"] to explicitly set fields to empty string. Set dry_run: true to validate the update without saving. To update by URL path instead of ID, use update_content_by_path. Always include version_comment so the version history is useful.

Up to 20 concurrent update_content calls are safe. For larger batches (>20 items), prefer bulk_update_content instead.

Example: {"id": "abc123", "data": {"body": "Updated text"}, "version_comment": "Revised intro paragraph"}

Content data fields support rich markup features:

  • [[Wikilinks]] and [[Page Title|display text]] — link to other pages by title or path; auto-update when paths change

  • [[include:snippet-name]] — embed a named snippet inline (reusable callouts, CTAs, disclaimers)

  • #hashtags — mention #tagname anywhere to automatically tag the page

  • Markdown fields (type "markdown") — GitHub Flavored Markdown converted to HTML at publish time Templates can use {{.lc_toc}} in their HTML layout to inject an auto-generated table of contents.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContent ID (MongoDB ObjectID),required
dataNoTemplate field values
holdNotrue puts the page on hold so it cannot be published; false clears the hold. Holding a published page does not unpublish it
slugNoURL slug
tagsNoTags for lc:query index pages
titleNoContent title
dry_runNoIf true, validate the update without saving
noindexNotrue hides the page from search engines and AI; false makes it visible again
categoryNoContent category
og_imageNoOpen Graph image URL
raw_modeNoUse raw HTML mode
use_themeNoApply site theme/layout
author_urlNoAuthor profile URL; empty string clears it
use_footerNoInclude site footer
use_headerNoInclude site header
author_nameNoAuthor name for structured data and feeds; empty string reverts to the site default
folder_pathNoFolder path
template_idNoTemplate ID (MongoDB ObjectID)
clear_fieldsNoField names to clear to empty string (removes ambiguity about how to delete field content)
set_raw_modeNoSet to true to explicitly update raw_mode (needed to set it to false)
set_use_themeNoSet to true to explicitly update use_theme (needed to set it to false)
set_use_footerNoSet to true to explicitly update use_footer (needed to set it to false)
set_use_headerNoSet to true to explicitly update use_header (needed to set it to false)
version_commentNoOptional comment describing this version change
meta_descriptionNoSEO meta description

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare idempotentHint=true and destructiveHint=true, but the description adds the context those hints cannot convey: automatic version creation, merge semantics (unlisted keys preserved), clear_fields for explicit deletion, and dry_run validation. It also discloses a concurrency safety ceiling, which is genuinely new operational information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded — purpose, merge semantics, clear_fields, dry_run, and routing all appear before the lengthy markup reference block. The markup and {{.lc_toc}} template section is the weakest part: it is closer to reference material and is somewhat tangential to selecting or calling this specific tool, making the description longer than strictly required.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 25-parameter mutation tool with no output schema, the description covers the non-obvious surfaces (merge vs clear, dry-run, versioning, batch routing, concurrency). It is slightly short on failure/conflict behavior — e.g. whether a version conflict or an existing content lock (acquire_content_lock exists as a sibling) affects the update — which is the main remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema on the semantically hardest parameter: it explains merge behavior for 'data', the clear_fields escape hatch, and the rich markup grammar ([[Wikilinks]], [[include:...]], #hashtags, markdown) accepted inside data fields. This is real added meaning rather than restated schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Update an existing content item by ID') plus the key side effect ('Creates a new version automatically'), and explicitly names the siblings it is not — update_content_by_path and bulk_update_content. An agent can distinguish it from the other ~100 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing rules: use update_content_by_path for URL-path targeting, bulk_update_content for batches >20, and states that up to 20 concurrent calls are safe. It also tells the caller to only send changed fields and to include version_comment. This is when-to-use and when-to-use-something-else guidance, not inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_content_by_pathUpdate Content by PathA
DestructiveIdempotent

Update content identified by its URL path instead of its ID. Useful when you know the page URL but not the MongoDB ID.

Example: {"path": "/about", "title": "About Us", "data": {"body": "Updated content"}}

The path always resolves to the live page, never to a fork copy (inside an agent sandbox the write goes to the sandbox copy as usual).

Only the fields you provide are changed. Always include a version_comment describing what changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoField values to update
holdNotrue puts the page on hold so it cannot be published; false clears the hold. Holding a published page does not unpublish it
pathYesURL path of the content to update (e.g. /about or /blog/my-post),required
tagsNoTags for lc:query index pages
titleNoNew title
noindexNotrue hides the page from search engines and AI; false makes it visible again
categoryNoContent category
og_imageNoOpen Graph image URL
publishedNoPublish state
author_urlNoAuthor profile URL; empty string clears it
author_nameNoAuthor name for structured data and feeds; empty string reverts to the site default
version_commentNoVersion comment
meta_descriptionNoSEO meta description

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely non-obvious behavior: the path resolves to the live page and never a fork, except inside an agent sandbox where the write hits the sandbox copy, plus PATCH-style 'only fields you provide are changed' semantics. It omits permission/auth requirements and lock interplay.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The distinguishing fact (path vs ID) is front-loaded, followed by a compact example and then the two behavioral caveats. Every sentence carries distinct information; none repeats the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter destructive mutation with no output schema, the description covers purpose, partial-update semantics, fork/sandbox resolution, and the version_comment requirement. It leaves out permission/lock requirements and any approval-workflow interaction present among siblings, but is otherwise sufficient to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description goes beyond it by supplying a worked example, stating that unlisted fields are untouched, and telling the agent to always include version_comment – semantic guidance the schema only labels generically.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (update content) plus the scoping key (by URL path) and explicitly distinguishes itself from the ID-based variant ('instead of its ID'). An agent can tell this apart from sibling update_content without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear when-to-use guidance: 'Useful when you know the page URL but not the MongoDB ID,' which implicitly routes the agent away from the ID-based tool. It does not name the alternative tool explicitly or mention any exclusions (e.g., when a lock or approval is required instead).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_import_sourceUpdate Import SourceC
DestructiveIdempotent

Update an RSS import source configuration

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesImport source ID,required
urlNoRSS/Atom feed URL
nameNoName of the import source
activeNoWhether the source is active
scheduleNoImport schedule: hourly, daily, or weekly
folder_pathNoFolder path for imported content
auto_publishNoAutomatically publish imported content
template_nameNoTemplate name to use for imported content

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=true, and openWorldHint=false, but the description adds no behavioral context of its own. It does not explain partial-update semantics, what 'destructive' means here, permission requirements, or what happens to fields left unset.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no wasted words. It is efficient, though its brevity borders on under-specification rather than ideal conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutation tool with no output schema, the description says nothing about partial updates (whether omitted/null fields are preserved or cleared), authorization needs, or the result of the operation. Annotations cover the safety profile but not the update semantics an agent needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all eight parameters including enum-like values for schedule. The description adds no meaning 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

'Update an RSS import source configuration' states a specific verb (update) and resource (RSS import source), which naturally separates it from create/delete/list siblings. It is clear but does not explicitly name an alternative or clarify scope beyond the resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as create_import_source, delete_import_source, or trigger_import_source, and no prerequisites or conditions are stated. Usage must be inferred from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_redirectUpdate RedirectC
DestructiveIdempotent

Update an existing redirect.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRedirect ID (MongoDB ObjectID),required
to_pathNoDestination path or URL
from_pathNoSource path
descriptionNoOptional description
status_codeNo301 or 302

TDQS

C2.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=true, establishing the safety profile. The description adds no information about whether this performs partial updates (implied by schema but not confirmed) or full replacement, what gets returned, or side effects like cache invalidation. It merely states the obvious operation type.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely brief at four words, avoiding verbosity. However, the single sentence fails to earn its place by providing tautological information that matches the title. It is concise but insufficiently informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool with no output schema, the description should clarify update semantics (partial vs. full) and expected returns. With five parameters and only one required, the partial update capability is strongly implied but undocumented, leaving agents to infer behavior from schema structure alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are well-documented in structured fields. The description adds no additional parameter context (e.g., path format expectations, that empty strings might unset fields), but baseline 3 is appropriate given the schema's completeness.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Update an existing redirect' is a tautology that restates the tool name with minimal variation. While it adds the word 'existing' to imply the resource must pre-exist, it fails to distinguish from sibling tools like 'create_redirect' or explain what distinguishes an update from a creation operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives (e.g., when to update vs. delete and recreate), nor does it mention prerequisites beyond the implied existence of the redirect. There are no explicit exclusions or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_seo_settingsUpdate SEO & AI SettingsA
Idempotent

Change search & AI settings. Only the fields you pass change. Blocking AI training crawlers does not affect Google/Bing search.

ParametersJSON Schema
NameRequiredDescriptionDefault
author_urlNoDefault author profile URL
feed_limitNoItems per feed (1-500)
author_nameNoDefault author name for structured data and feeds
author_typeNoDefault author type: Person or Organization
robots_extraNoExtra robots.txt lines appended verbatim
feed_disabledNotrue turns off /feed.xml and /atom.xml
author_same_asNoAuthor profile URLs (schema.org sameAs)
feed_all_pagesNoInclude every page in the site feed
feed_templatesNoTemplate names included in the site feed
content_signalsNoEmit a Content-Signal line in robots.txt
feed_categoriesNoCategories included in the site feed
training_policyNoAI training crawlers (GPTBot, ClaudeBot, Google-Extended…): allow or disallow
ai_search_policyNoAI search crawlers (OAI-SearchBot, PerplexityBot…): allow or disallow
crawler_overridesNoPer-crawler overrides by robots token, e.g. {"GPTBot":"disallow"}; replaces the whole map
markdown_disabledNotrue turns off Markdown copies at /<page>.md
publisher_same_asNoSite/organization profile URLs (schema.org sameAs)
user_fetch_policyNoUser-initiated AI fetchers (ChatGPT-User, Claude-User…): allow or disallow

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real value beyond them: it clarifies partial-update semantics (unspecified fields are untouched) and pre-empts a likely agent misconception that blocking AI training crawlers also de-indexes the site. No auth/permission requirements are mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with purpose before the two behavioral caveats. Every sentence carries non-redundant information and nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 17-parameter, zero-required mutation tool with a fully documented schema and no output schema, the description covers the essentials an agent needs (partial update, the AI-crawler/SEO non-interaction). It omits permission requirements and any hint that the crawl-policy fields interact with each other, but the schema handles the destructive map-replacement detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across all 17 properties, so the schema carries the full parameter burden, including the notable 'replaces the whole map' caveat on crawler_overrides. The description names no individual fields, so no meaning is added beyond the schema — the baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Change') and resource ('search & AI settings'), and the sibling get_seo_settings makes the read/write pairing inferable. However, the label 'search & AI settings' undersells the actual scope (feeds, robots.txt, author structured data, Markdown copies), so an agent can't fully predict coverage from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use, when-not-to-use, or 'call get_seo_settings first' guidance. The partial-update sentence ('Only the fields you pass change') implicitly tells the agent this is the appropriate tool for incremental tweaks, but nothing routes between this and its read sibling or other config tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_site_configUpdate Site ConfigC
DestructiveIdempotent

Update site configuration. Title templates support {{title}} and {{site_name}} placeholders.

ParametersJSON Schema
NameRequiredDescriptionDefault
title_templateNoPage title template with {{title}} and {{site_name}} placeholders
title_template_no_titleNoTitle template when page has no title

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations indicate destructive and idempotent behavior, the description fails to explain what 'destructive' means in this context (e.g., whether it replaces all existing title templates) or clarify that partial updates are supported since both parameters are optional. It mentions placeholder syntax but omits behavioral implications of the operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences total. The first sentence ('Update site configuration') is redundant with the tool title and name. The second sentence contains the specific placeholder information. Reasonably brief but front-loaded with less valuable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of annotations (destructive/idempotent hints) and complete schema coverage, the description barely suffices for a two-parameter tool. However, it fails to explain the partial update behavior (optional parameters), the specific scope limitation (title templates only), or elaborate on the destructive implications hinted in annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already fully documents both parameters including the placeholder syntax. The description generically states that title templates support placeholders, which adds minimal value beyond the schema but does not contradict it. Baseline score appropriate for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the tool updates 'site configuration' which is somewhat tautological with the tool name, but adds specificity by mentioning title templates and their placeholders. However, it misleadingly implies broad configuration updates when the schema only contains title template parameters, failing to precisely scope the tool's limited functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no guidance on when to use this tool versus alternatives like get_site_config, nor does it mention prerequisites such as understanding current configuration before updating. No explicit warnings about the destructive nature despite the annotation hint.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_snippetA

Update an existing snippet's name and/or HTML template.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSnippet ID (MongoDB ObjectID),required
htmlYesGo template HTML,required
nameYesSnippet name,required

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate non-destructive mutation (destructiveHint:false) and stable IDs (openWorldHint:false). The description adds context that this operates on 'existing' resources and identifies which fields are mutable, but doesn't disclose behavioral specifics like error handling for missing IDs or whether unchanged fields must be resubmitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

高效单句结构(9个词),动作前置。'and/or'略显冗余且与schema中所有字段均为required存在轻微冲突,但整体上零废话。

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

对于带有完整schema描述的简单三参数更新工具而言基本够用,但缺少关于部分更新行为的重要细节(鉴于schema要求所有字段,而描述暗示可选更新),且未说明返回值或错误场景。

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% description coverage, establishing baseline 3. The description reinforces semantic relationships by grouping 'name' and 'html' as the updatable fields versus 'id' as the identifier, but doesn't resolve the tension between 'and/or' phrasing and the schema's required field constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('Update'), specific resource ('snippet'), and clear field scope ('name and/or HTML template'). The phrase 'existing snippet' clearly distinguishes this from sibling create_snippet.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'existing snippet' implicitly signals this is for modifications, not creation. However, it lacks explicit when-to-use guidance (e.g., 'use create_snippet for new snippets') and doesn't clarify that all fields must be provided even for partial updates despite the 'and/or' phrasing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_templateUpdate TemplateA
DestructiveIdempotent

Update an existing template. Changing the HTML layout will regenerate all content using this template.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTemplate ID (MongoDB ObjectID),required
nameNoTemplate name
slugNoTemplate slug
fieldsNoTemplate fields definition
categoryNoTemplate category
descriptionNoTemplate description
html_layoutNoHTML layout (changing this regenerates all content using this template)

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true but don't specify what is destroyed. The description adds crucial context that changing HTML layout regenerates all content using the template, explaining the scope and trigger of the destructive operation beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste: first states purpose immediately, second delivers critical side-effect warning. Every word earns its place; appropriately front-loaded with no redundant or verbose language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no output schema, the description adequately covers the core operation and major side effect (regeneration). Given annotations cover safety hints and schema covers all parameters, this is complete enough, though could mention ID retrieval pattern.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description mentions HTML layout changes causing regeneration, but this information is already present in the html_layout parameter's description within the schema. No additional semantic details provided for other parameters like id, name, or fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states specific verb (Update) and resource (template), distinguishing from siblings like create_template or delete_template. The second sentence adds critical scope detail about regeneration behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an important side-effect warning (HTML layout changes regenerate content) which implies when to be careful, but lacks explicit when-to-use guidance versus alternatives like create_template or prerequisites such as needing the template ID.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_themeUpdate ThemeA
DestructiveIdempotent

Update theme settings. Only the fields you provide are changed — all other settings are preserved (partial update, safe to call without get_theme first).

Changing header_html or footer_html triggers background regeneration of all published pages. Changing colors, fonts, or custom_css does NOT require content regeneration.

Use pin_theme_version to protect important milestones before making major changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
logo_urlNoLogo image URL
head_htmlNoCustom HTML for <head> section
site_nameNoSite name
custom_cssNoAdditional custom CSS
text_colorNoText color (hex)
font_familyNoBody font family CSS value
footer_htmlNoCustom footer HTML (changing regenerates all content)
header_htmlNoCustom header HTML (changing regenerates all content)
accent_colorNoAccent theme color (hex)
heading_fontNoHeading font family CSS value
site_taglineNoSite tagline
border_radiusNoBorder radius CSS value
primary_colorNoPrimary theme color (hex)
secondary_colorNoSecondary theme color (hex)
background_colorNoBackground color (hex)

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds critical side-effect details beyond annotations: header_html/footer_html trigger background regeneration of all published pages while colors/fonts/custom_css do not, and clarifies partial update semantics. Annotations declare idempotent/destructive hints; description adds regeneration timing and scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly structured paragraphs: partial update semantics upfront, regeneration behavior specifics in middle, workflow recommendation at end. No redundancy with schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive for a 15-parameter mutation tool: covers mutation type (partial), side effects (regeneration), sibling interactions (get_theme, pin_theme_version), and safety profile. With 100% schema coverage and annotations present, no output schema needed in description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage establishing baseline 3. Description adds semantic value by grouping specific parameters (header_html/footer_html vs colors/fonts/custom_css) by their regeneration behavior, explaining operational significance of modifying each group.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb 'Update' with resource 'theme settings', clearly distinguishes from sibling get_theme by noting 'safe to call without get_theme first', and differentiates from pin_theme_version by explaining this performs the update while that protects milestones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit prerequisites ('safe to call without get_theme first'), clear workflow guidance ('Use pin_theme_version to protect important milestones before making major changes'), and behavioral conditions for regeneration provide clear when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_webhookUpdate WebhookB
DestructiveIdempotent

Update an existing webhook (name, URL, events, active). Partial update — only provided fields change.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWebhook ID,required
urlNoNew endpoint URL
nameNoNew name
activeNoEnable or disable the webhook
eventsNoNew event list

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=true, so the agent knows the safety profile. The description adds meaningful behavioral context with "Partial update — only provided fields change," but leaves the surprising destructiveHint unexplained (e.g., whether the events array replaces or merges, or what data can be lost), which is a notable gap for a destructive mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the core action front-loaded and the partial-update behavior called out second. No filler, though the single-purpose brevity leaves nothing else addressed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a mutation tool whose annotations carry the safety profile and which has no output schema. However, it omits whether omitted fields are cleared, whether events replace the existing list, and any auth/permission context that would fully equip an agent before invoking a destructive update.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters are already documented. The description lists the mutable fields (name, URL, events, active) but adds no syntax, format, or replacement-vs-merge semantics beyond what the schema provides; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb+resource ("Update an existing webhook") and it enumerates the fields that can change, so an agent immediately knows what the tool does. It does not explicitly distinguish itself from siblings like create_webhook or delete_webhook, but the verb makes the distinction inferable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus create_webhook, delete_webhook, or regenerate_webhook_secret, and no prerequisites/preconditions stated. The only actionable hint is "Partial update — only provided fields change," which describes behavior rather than usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_assetUpload AssetA

Upload or replace an asset in the asset library. Re-uploading to the same serve_path replaces the existing file in place — no need to delete first.

Provide file content via one of:

  • file_path: Absolute local path to the file (preferred for files >100KB — avoids MCP transport size limits)

  • data_base64: Base64-encoded file content (fine for small files)

Validates file type and MIME type for security.

ParametersJSON Schema
NameRequiredDescriptionDefault
filenameYesOriginal filename with extension,required
file_pathNoAbsolute local filesystem path to read the file from. Preferred over data_base64 for large files — avoids MCP transport size limits.
serve_pathYesURL path where file will be served (e.g., /images/logo.png),required
data_base64NoBase64-encoded file content. Use for small files (<100KB). For larger files, prefer file_path.
descriptionNoOptional description of the asset

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds security validation behavior ('Validates file type and MIME type') and infrastructure constraints ('MCP transport size limits') not present in annotations. Clarifies upsert/replacement semantics. Annotations declare non-destructive operation, and description frames replacement as a convenience feature rather than data destruction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly focused paragraphs: action/replacement behavior, content provision options with clear bullet structure, and validation notice. No redundant text; every sentence conveys distinct operational information. Well front-loaded with primary action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive coverage of upload semantics, security constraints, and transport limitations for a 5-parameter file operation. Absence of output schema is noted but description sufficiently covers input concerns and behavioral expectations for successful invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage (baseline 3), description adds crucial semantic guidance: specifies mutual exclusivity ('via one of'), size thresholds (>100KB) for choosing between file_path and data_base64, and explains the replacement semantics of serve_path parameter beyond the schema's basic definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific action ('Upload or replace') and resource ('asset in the asset library'). Explicitly distinguishes from sibling delete_asset by noting replacement happens 'in place — no need to delete first', and implicitly distinguishes from upload_asset_from_url by specifying local file content provision methods.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear operational guidance: explains replacement behavior (re-uploading to same serve_path replaces existing file) and selection criteria for content sources (file_path preferred for >100KB to avoid transport limits vs data_base64 for small files). Stops short of explicitly naming upload_asset_from_url as the alternative for remote URLs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_asset_from_urlUpload Asset from URLA

Fetch a public URL and store it as a LightCMS asset. Useful for importing images or files from the web without downloading them locally first.

Example: {"url": "https://example.com/logo.png", "serve_path": "/assets/logo.png", "description": "Site logo"}

If serve_path is omitted, the filename is derived from the URL. Returns id, serve_path, mime_type, and size.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPublic URL of the file to fetch (must be http or https),required
serve_pathNoURL path where asset will be served (e.g. /assets/logo.png). Auto-derived from URL filename if omitted.
descriptionNoOptional description

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide destructiveHint=false and openWorldHint=true. The description adds valuable behavioral details not in annotations: the automatic filename derivation logic ('If serve_path is omitted...') and the complete return value structure ('Returns id, serve_path, mime_type, and size') which compensates for the missing 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured with purpose first, use case second, concrete example third, and behavioral details last. Every sentence adds distinct value (purpose, differentiation, example, default logic, return values) with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 100% schema coverage and annotations covering safety (destructiveHint), the description provides appropriate completeness by documenting the return payload (compensating for no output schema) and providing a concrete usage example. It adequately covers the tool's contract for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the baseline is 3. The description adds an inline JSON example demonstrating realistic values for all three parameters, and explicitly explains the default behavior for serve_path derivation, adding semantic meaning beyond the schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Fetch a public URL and store it as a LightCMS asset') with clear resource and verb. It distinguishes itself from the sibling 'upload_asset' by emphasizing 'from the web without downloading them locally first,' clearly scoping the tool to URL-based ingestion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context ('Useful for importing images or files from the web') and implies the benefit over alternatives ('without downloading them locally first'). However, it does not explicitly name 'upload_asset' as the alternative for local files or state explicit 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 65 tool updatesv7.3.4
    • Addedacquire_content_lock
    • Addedapprove_request
    • Addedbackfill_published_dates
    • Addedbulk_create_content
    • Addedcancel_approval_request
    • Addedcancel_import_job
    • Addedcancel_scheduled_publish
    • Addedcreate_approval_workflow
    • Addedcreate_comment
    • Changedcreate_content5 fields changed
      • addedInput schema / properties / author_name
        Added value: +{
        +  "description": "Author name for structured data and feeds (defaults to the site author)",
        +  "type": "string"
        +}
      • addedInput schema / properties / author_url
        Added value: +{
        +  "description": "Author profile URL",
        +  "type": "string"
        +}
      • addedInput schema / properties / hold
        Added value: +{
        +  "description": "Put the page on hold: it cannot be published (directly, in bulk, on a schedule or by merging a fork) until hold is cleared. Cannot be combined with published=true",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / noindex
        Added value: +{
        +  "description": "Hide this page from search engines and AI (noindex; excluded from sitemap, llms.txt, feeds, IndexNow)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / upsert
        Added value: +{
        +  "description": "If true, update existing content at the same path instead of returning a duplicate key error",
        +  "type": "boolean"
        +}
    • Addedcreate_import_source
    • Addedcreate_webhook
    • Addeddelete_approval_workflow
    • Addeddelete_comment
    • Addeddelete_import_source
    • Addeddelete_webhook
    • Addedend_agent_sandbox
    • Addedforce_unlock_content
    • Addedget_agent_sandbox
    • Addedget_agent_session_changes
    • Addedget_ai_traffic
    • Addedget_approval_request
    • Addedget_approval_workflow
    • Addedget_content_lock
    • Addedget_fork_diff
    • Addedget_import_job
    • Addedget_indexnow_status
    • Addedget_link_check_results
    • Addedget_maintenance_report
    • Addedget_seo_settings
    • Addedimport_csv
    • Addedimport_markdown
    • Addedlist_approval_requests
    • Addedlist_approval_workflows
    • Addedlist_audit_logs
    • Addedlist_comments
    • Changedlist_content3 fields changed
      • addedInput schema / properties / include_forks
        Added value: +{
        +  "description": "Also list fork copies (working copies inside fork workspaces). Off by default; use get_fork to see one fork's pages",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Maximum number of items to return (1-500). When set, returns paginated response with {items, total, limit, offset, has_more}",
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Number of items to skip (for pagination). Requires limit to be set",
        +  "type": "integer"
        +}
    • Addedlist_import_jobs
    • Addedlist_import_sources
    • Addedlist_scheduled_content
    • Addedlist_webhook_deliveries
    • Addedlist_webhooks
    • Changedmerge_fork1 field changed
      • addedInput schema / properties / publish_new
        Added value: +{
        +  "description": "Also publish the pages this merge creates. Default false: new pages keep the publish state they had in the fork (normally draft). Pages on hold always stay drafts",
        +  "type": "boolean"
        +}
    • Addedpurge_fork_copies
    • Addedregenerate_webhook_secret
    • Addedreject_request
    • Addedrelease_content_lock
    • Addedrollback_agent_session
    • Addedrun_maintenance_scan
    • Addedschedule_content_publish
    • Changedsearch_content1 field changed
      • addedInput schema / properties / include_forks
        Added value: +{
        +  "description": "Also search fork copies (working copies inside fork workspaces). Off by default",
        +  "type": "boolean"
        +}
    • Changedsearch_replace_execute7 fields changed
      • changedInput schema / properties / auto_republish / description
        Previous value: -"If true, re-publish all previously-published pages immediately after updating them (saves a separate publish_multiple call)"New value: +"If true, re-publish updated pages immediately"
      • addedInput schema / properties / pairs
        Added value: +{
        +  "description": "Array of {search, replace, regex} pairs for bulk mode. Applies all replacements in a single pass per page.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "regex": {
        +        "description": "If true, treat search as a Go regular expression",
        +        "type": "boolean"
        +      },
        +      "replace": {
        +        "description": "Text to replace with,required",
        +        "type": "string"
        +      },
        +      "search": {
        +        "description": "Text to search for,required",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "search",
        +      "replace"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / regex / description
        Previous value: -"If true, treat search as a Go regular expression. Use $1, $2 for capture group references in replace."New value: +"If true, treat search as regex (single-pair mode)"
      • changedInput schema / properties / replace / description
        Previous value: -"Text to replace with,required"New value: +"Text to replace with (single-pair mode)"
      • changedInput schema / properties / search / description
        Previous value: -"Text to search for,required"New value: +"Text to search for (single-pair mode)"
      • changedInput schema / properties / version_comment / description
        Previous value: -"Comment for version history (defaults to 'Bulk search and replace')"New value: +"Comment for version history"
      • removedInput schema / required
        Removed value: -[
        -  "search",
        -  "replace"
        -]
    • Changedsearch_replace_preview5 fields changed
      • addedInput schema / properties / pairs
        Added value: +{
        +  "description": "Array of {search, replace, regex} pairs for bulk mode. Scans each page once, applying all pairs in order. Much faster than calling preview multiple times.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "regex": {
        +        "description": "If true, treat search as a Go regular expression",
        +        "type": "boolean"
        +      },
        +      "replace": {
        +        "description": "Text to replace with,required",
        +        "type": "string"
        +      },
        +      "search": {
        +        "description": "Text to search for,required",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "search",
        +      "replace"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / regex / description
        Previous value: -"If true, treat search as a Go regular expression. Use $1, $2 for capture group references in replace."New value: +"If true, treat search as regex (single-pair mode)"
      • changedInput schema / properties / replace / description
        Previous value: -"Text to replace with,required"New value: +"Text to replace with (single-pair mode)"
      • changedInput schema / properties / search / description
        Previous value: -"Text to search for,required"New value: +"Text to search for (single-pair mode)"
      • removedInput schema / required
        Removed value: -[
        -  "search",
        -  "replace"
        -]
    • Addedset_indexnow_enabled
    • Addedstart_agent_sandbox
    • Addedstart_link_check
    • Addedsubmit_for_approval
    • Addedsubmit_indexnow
    • Addedtrigger_import_source
    • Addedupdate_approval_workflow
    • Changedupdate_content4 fields changed
      • addedInput schema / properties / author_name
        Added value: +{
        +  "description": "Author name for structured data and feeds; empty string reverts to the site default",
        +  "type": [
        +    "null",
        +    "string"
        +  ]
        +}
      • addedInput schema / properties / author_url
        Added value: +{
        +  "description": "Author profile URL; empty string clears it",
        +  "type": [
        +    "null",
        +    "string"
        +  ]
        +}
      • addedInput schema / properties / hold
        Added value: +{
        +  "description": "true puts the page on hold so it cannot be published; false clears the hold. Holding a published page does not unpublish it",
        +  "type": [
        +    "null",
        +    "boolean"
        +  ]
        +}
      • addedInput schema / properties / noindex
        Added value: +{
        +  "description": "true hides the page from search engines and AI; false makes it visible again",
        +  "type": [
        +    "null",
        +    "boolean"
        +  ]
        +}
    • Changedupdate_content_by_path4 fields changed
      • addedInput schema / properties / author_name
        Added value: +{
        +  "description": "Author name for structured data and feeds; empty string reverts to the site default",
        +  "type": [
        +    "null",
        +    "string"
        +  ]
        +}
      • addedInput schema / properties / author_url
        Added value: +{
        +  "description": "Author profile URL; empty string clears it",
        +  "type": [
        +    "null",
        +    "string"
        +  ]
        +}
      • addedInput schema / properties / hold
        Added value: +{
        +  "description": "true puts the page on hold so it cannot be published; false clears the hold. Holding a published page does not unpublish it",
        +  "type": [
        +    "null",
        +    "boolean"
        +  ]
        +}
      • addedInput schema / properties / noindex
        Added value: +{
        +  "description": "true hides the page from search engines and AI; false makes it visible again",
        +  "type": [
        +    "null",
        +    "boolean"
        +  ]
        +}
    • Addedupdate_import_source
    • Addedupdate_seo_settings
    • Addedupdate_webhook
  2. 72 tool updatesv4.2.0
    • First observedarchive_fork
    • First observedbulk_field_operation
    • First observedbulk_update_content
    • First observedcreate_collection
    • First observedcreate_content
    • First observedcreate_folder
    • First observedcreate_fork
    • First observedcreate_redirect
    • First observedcreate_snippet
    • First observedcreate_template
    • First observeddelete_asset
    • First observeddelete_collection
    • First observeddelete_content
    • First observeddelete_folder
    • First observeddelete_fork
    • First observeddelete_redirect
    • First observeddelete_snippet
    • First observeddelete_template
    • First observedend_user_search
    • First observedexport_content
    • First observedfork_page
    • First observedget_asset
    • First observedget_backlinks
    • First observedget_collection
    • First observedget_content
    • First observedget_content_version
    • First observedget_content_versions
    • First observedget_folder
    • First observedget_fork
    • First observedget_site_config
    • First observedget_snippet
    • First observedget_template
    • First observedget_theme
    • First observedget_theme_version
    • First observedget_theme_versions
    • First observedlist_asset_folders
    • First observedlist_assets
    • First observedlist_collections
    • First observedlist_content
    • First observedlist_folders
    • First observedlist_forks
    • First observedlist_redirects
    • First observedlist_snippets
    • First observedlist_templates
    • First observedmerge_fork
    • First observedpin_theme_version
    • First observedpreview_content
    • First observedpublish_content
    • First observedpublish_multiple
    • First observedregenerate_all_content
    • First observedreindex_embeddings
    • First observedremove_fork_page
    • First observedrestore_content
    • First observedrevert_theme_to_version
    • First observedrevert_to_version
    • First observedscoped_search_replace_execute
    • First observedscoped_search_replace_preview
    • First observedsearch_content
    • First observedsearch_replace_execute
    • First observedsearch_replace_preview
    • First observedunpin_theme_version
    • First observedunpublish_content
    • First observedupdate_collection
    • First observedupdate_content
    • First observedupdate_content_by_path
    • First observedupdate_redirect
    • First observedupdate_site_config
    • First observedupdate_snippet
    • First observedupdate_template
    • First observedupdate_theme
    • First observedupload_asset
    • First observedupload_asset_from_url

TDQS

B3.3/5.0

Scored across 129 tools

Disambiguation3/5

Most tools target clearly distinct resources, but several clusters create real ambiguity: the fork tools (create_fork/fork_page/merge_fork) vs the sandbox tools (start_agent_sandbox/end_agent_sandbox) describe the same underlying mechanism, search_replace_execute vs scoped_search_replace_execute vs preview variants overlap, and update_content vs update_content_by_path vs bulk_update_content compete for the same job. Detailed descriptions help, but an agent still has to reason carefully about which of several near-duplicates to pick.

Naming Consistency4/5

Names overwhelmingly follow a predictable verb_noun snake_case pattern (list_content, get_content, create_content, update_content, delete_content), with parallel families for templates, folders, collections, snippets, redirects, webhooks, and approvals. Minor deviations exist — get_theme_version (singular) alongside get_theme_versions, force_unlock_content vs acquire/release_content_lock, and import_csv/import_markdown — but they remain readable and semantically consistent.

Tool Count2/5

129 tools is excessive even for a broad CMS domain, far past the 50+ 'extreme mismatch' threshold. Many operations could be consolidated (e.g., separate lock get/acquire/release/force, singular/plural version getters, three publish paths), so each tool does not clearly earn its place.

Completeness5/5

The surface is remarkably complete: full content CRUD plus versions, soft-delete/restore, drafts/publish/scheduling, locks, comments, templates/fields, folders, collections, snippets, themes with versioning, assets, webhooks, redirects, imports, approval workflows, forks/sandbox staging, SEO/IndexNow, maintenance scans, and audit logs. Almost no lifecycle gap is left uncovered.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers