LightCMS
LightCMS MCP server lets an AI agent fully manage a LightCMS site through tools.
Content: create, read, update, delete/restore, publish/unpublish, bulk update, publish multiple, preview, version history/revert, export, backlinks.
Templates & snippets: CRUD templates and reusable Go-template snippets for rendering and
lc:queryindex pages.Assets: list, get, upload (file/base64/URL), delete, and browse asset folders.
Organization: manage folders, collections, redirects, and site configuration.
Search: full-text/semantic/hybrid search, site-wide or scoped search-and-replace preview/execute, reindex embeddings.
Theme: read/update theme, inspect versions, pin/unpin, revert.
Forks: create/list/get fork workspaces, fork pages, remove pages, merge, archive, delete for staged review before live.
Bulk ops: bulk field operation, bulk content update, dry-run validation, auto-republish options.
Safety: RBAC/admin restrictions, preview/dry-run, mandatory confirmation for destructive site-wide changes.
LightCMS
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 |
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 |
|
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 |
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 |
|
llms.txt + JSON-LD | Auto-generated |
MCP for Readers | Public read-only MCP endpoint at |
Local Embeddings |
|
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 |
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 |
Dashboard Sections | Requiring Approvals and Recent Comments appear on the admin dashboard when relevant. |
New Webhook Events |
|
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 |
RSS/Atom Import | Configure recurring feed sources with hourly/daily/weekly schedules, template mapping, folder targeting, and auto-publish. |
Markdown Import | Upload |
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 |
10 new MCP import tools |
|
Agentic bulk content creation |
|
Deduplication | Imports match by |
What's New in v4.5
Feature | Summary |
Webhooks | HMAC-SHA256 signed events for |
Scheduled Publishing | Set a future |
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 |
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: |
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:queryDirectives: Embed live content queries directly in template layouts — at publish time they expand into rendered lists of matching pagesContent 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_attimestamp; a background scheduler auto-publishes at the right timeContent 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
.mdfiles or.ziparchives 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_markdownis specifically designed for AI agents to generate and import large content batches in a single call, replacing dozens ofcreate_contentcalls with oneimport_markdown+ oneget_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_newMerges 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_copiesFork Copies Stay Out of the Way (v7.4+): Fork copies are left out of content listings and search unless
include_forksis set, and can never be published directly or in bulk — only mergedHold Flag (v7.4+): Mark any draft
holdto block every way of publishing it (publish, bulk publish, scheduled publish, approval, fork merge) until the flag is clearedFull 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. Supportsdry_runvalidation before committing, andauto_republishto re-publish all previously-published pages in the same call, eliminating a separate publish stepbulk_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 typepublish_multiple: Publish a list of IDs — or all drafts at once withpublish_all_drafts: true— in a single request instead of looping overpublish_contentexport_content: Dump full field data for a scoped set of pages as a structured JSON array. Designed for export → transform → re-import pipelines; pair withbulk_update_contentfor large-scale content migrationsScoped Search & Replace: Both
scoped_search_replace_previewandscoped_search_replace_executeaccept scope filters (folder, template, category, IDs) so agents can target precise subsets rather than running site-wide operationsParallel-Safe Read API:
list_contentwithinclude_data: truereturns full field values in one fetch; agents can fan out reads across multiplelist_content/get_contentcalls concurrently and then batch-write withbulk_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 requiredTwo-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 countContent 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
Smart End-User Search
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-enforcedMCP 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
Clone the repository
Copy
config.dev.json.exampletoconfig.dev.jsonEdit
config.dev.jsonwith your MongoDB connection stringRun
go run cmd/server/main.goVisit http://localhost:8082/cm and log in with your email and password
On first run, an admin account is created — set
LIGHTCMS_ADMIN_EMAILto use your email, or it defaults toadmin@localhost
MongoDB Atlas Setup
Step 1: Create an Atlas Account
Go to MongoDB Atlas
Sign up for a free account (no credit card required)
Step 2: Create a Cluster
Click "Build a Database"
Select "M0 FREE" (Shared) tier
Choose your preferred cloud provider and region (closest to you)
Click "Create Deployment"
Step 3: Set Up Database Access
Create a database user:
Username:
lightcms(or your choice)Password: Generate a secure password (save this!)
Click "Create User"
Add your IP address:
Click "Add My Current IP Address"
Or add
0.0.0.0/0to allow access from anywhere (less secure, but convenient for development)Click "Finish and Close"
Step 4: Get Your Connection String
Click "Connect" on your cluster
Select "Drivers"
Copy the connection string, it looks like:
mongodb+srv://lightcms:<password>@cluster0.xxxxx.mongodb.net/?retryWrites=true&w=majorityReplace
<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.jsonEdit 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.jsonEdit 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.goOr use the run script:
./run.shConfiguration
LightCMS uses JSON config files. Create either:
config.dev.json- for developmentconfig.prod.json- for production (takes precedence if both exist)
Field | Description |
| Server port (e.g., "8082" for dev, "80" for prod) |
| MongoDB Atlas connection string |
| MongoDB database name. Optional, default |
| Environment: "development" or "production" |
| Random string for session encryption |
| Public URL of the site |
|
|
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
Public site: http://localhost:8082
Admin panel: http://localhost:8082/cm
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.comCreating Content
Log in to the admin panel at
/cmGo to Content → New Content
Select a template (Blog Post, Press Release, Explanatory Page, etc.)
Fill in the fields
Check "Published" and save
Managing Users (Admin Only)
Go to Users in the left sidebar (visible to admins only)
Create users with email, display name, and role (admin / editor / viewer)
Users receive a temporary password and are prompted to change it on first login
Disable accounts or reset passwords from the edit page
View a full audit trail of all user actions at Audit Log
Creating Custom Templates
Go to Templates → New Template
Define your fields (text, textarea, richtext, date, image, select)
Create an HTML layout using
{{.field_name}}placeholdersSave 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:
Open any content item in the editor
Find the Tags field (below the main fields)
Type a tag name and press Enter — repeat for multiple tags
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:
Go to Settings → Snippets in the admin panel
Click New Snippet, give it a name (e.g.
glossary-pill)Write HTML using Go template variables:
<a href="{{.FullPath}}">{{.Title}}</a>Available variables inside a snippet:
Variable | Description |
| The content item's title |
| The public URL path (e.g. |
| URL slug only (e.g. |
| Meta description field |
| 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 |
| Yes | Filter expression. Currently supports |
| No | Sort field and direction: |
| 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 & Machine Intelligence</h2>
<div class="concept-links">
<!-- lc:query filter="tag:AI & Machine Intelligence" sort="title:asc" snippet="glossary-pill" -->
</div>
<h2>Games & Interactive Experiences</h2>
<div class="concept-links">
<!-- lc:query filter="tag:Games & Interactive Experiences" sort="title:asc" snippet="glossary-pill" -->
</div>
<h2>3D Graphics & 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 |
| The content item's title |
| URL slug |
| Publication timestamp |
| 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.
Wikilinks
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 |
| Link to a page matched by title (case-insensitive) |
| Same, with custom link text |
| Link to a page by its exact URL path |
| 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 #aiadds 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).
Go to Collections → New Collection
Set the category filter to match your content's category
Define item and page templates
The collection will be available at
/collection-slug
Customizing the Theme
Go to Theme in the admin panel
Adjust colors, fonts, and border radius
Add custom CSS if needed
Save to apply changes site-wide
End-User Search
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=10Parameter | Description |
| Search query (required) |
|
|
| 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=8Returns 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 configurationDefault 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.
Log in at
/cmGo to Settings → API Keys
Click Create New Key, give it a name and description
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 |
| Dynamic client registration (RFC 7591) |
| Authorization page (admin login + consent) |
| Token exchange and refresh |
| Token revocation (RFC 7009) |
| 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
Client fetches
/.well-known/oauth-authorization-serverto discover endpointsClient calls
POST /oauth/registerwith its name and redirect URIClient redirects admin to
/oauth/authorizewith PKCE challengeAdmin enters password and approves access
Client exchanges the authorization code for access + refresh tokens
Client uses the access token as a Bearer token on
/mcpor/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/contentEndpoints
Resource | Endpoints |
Content |
|
Templates |
|
Snippets |
|
Assets |
|
Theme |
|
Config |
|
Redirects |
|
Folders |
|
Collections |
|
Search |
|
API Keys |
|
Utility |
|
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 GitHubConfiguration
export LIGHTCMS_URL=http://localhost:8082
export LIGHTCMS_API_KEY=lc_your_key_hereOr 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 outputRun lightcms --help for full usage.
MCP Server (AI-Powered Content Management)
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.
Create an API key in the admin panel at
/cm→ Settings → API KeysRun the setup script:
export LIGHTCMS_API_KEY=lc_your_key_here
./setup-mcp.shOr 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-mcpRestart 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:
The client discovers your LightCMS instance via well-known endpoints
It registers as an OAuth client (one-time, automatic)
You authorize the client by entering your admin password in the browser
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 |
| OAuth server metadata (RFC 8414) |
| Protected resource metadata (RFC 9728) |
| MCP server card with tool schemas |
Authentication
The MCP HTTP endpoint accepts both authentication methods:
API keys (
lc_prefix) — long-lived, created in admin panelOAuth 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:
list_templates— finds the Blog Post template and its IDcreate_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" } }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:
get_theme— reads current theme settings (colors, fonts, header/footer HTML)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:
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.
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:
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:
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.get_content— retrieves the about page by path to get its current dataupdate_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:
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
/newsare 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:
get_content— retrieves the homepage by path (/) to get its IDget_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-08revert_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:
create_folder— creates the URL path segment:{ "name": "Documentation", "slug": "docs" }get_content— retrieves the API reference page to get its IDupdate_content— moves it into the new folder:{ "id": "...", "folder_path": "/docs" }The page is now accessible at
/docs/api-referenceinstead 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:
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:
create_snippet— creates a reusable rendering template for each result:{ "name": "glossary-pill", "html": "<a href=\"{{.FullPath}}\">{{.Title}}</a>" }create_template— creates the index page template withlc:querydirectives 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 & 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 & 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>" }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." } }update_content— tags several existing concept pages (each call):{ "tags": ["AI & Machine Intelligence"] }publish_content— publishes the index page; thelc:querydirectives 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:
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: bodyThe 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:
list_content— fetches all content under/docswith 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.
(parallel) Agent fans out into batches of 50 and calls
bulk_update_contentconcurrently:{ "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: truere-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:
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.
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": "..." } }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.
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_idsandupdated_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:
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"
}Wikilinks
# 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-serverSecurity Notes
For production:
Use a strong
session_secret— minimum 32 characters (generate withopenssl rand -hex 32). The server hard-fails on startup if this requirement isn't met in production.Set
LIGHTCMS_ADMIN_EMAILso the initial admin account uses your real emailChange the default admin password immediately after first login
Use HTTPS (put behind a reverse proxy like nginx or caddy)
Restrict MongoDB Atlas IP whitelist to your server IPs
API keys inherit the permissions of their owning user — keep admin keys secure
Review the audit log regularly at
/cm/auditRegularly backup your MongoDB database
Configure
max_upload_bytesin site settings to cap file upload size for your use case
Security features built in:
CSRF protection on all
/cmroutesAdmin 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/endpointsLogin 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-IPheader used for real client IP (unspoofable, unlikeX-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 toolsacquire_content_lockAcquire Content LockAIdempotent
Acquire an advisory lock on a content item for the current API user. Returns conflict if another user holds the lock.
| Name | Required | Description | Default |
|---|---|---|---|
| content_id | Yes | Content item ID,required |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | required,Approval request ID | |
| comment | No | Optional approval comment |
TDQS
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.
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.
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.
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.
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.
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 ForkAIdempotent
Archive a fork without merging it. The fork and its pages are preserved but the fork becomes read-only. Requires admin role.
| Name | Required | Description | Default |
|---|---|---|---|
| fork_id | Yes | Fork workspace ID to archive,required |
TDQS
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.
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.
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.
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.
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.
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 DatesAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Only count the pages that would change |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Array of content items to create (max 100),required | |
| upsert | No | If true, update existing content at the same path instead of failing on duplicates | |
| version_comment | No | Version comment for all created items |
TDQS
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.
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.
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.
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.
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.
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 OperationADestructive
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"}
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Suffix string for wrap operation | |
| field | Yes | Field name to operate on,required | |
| value | No | Value for set/prepend/append operations | |
| before | No | Prefix string for wrap operation | |
| dry_run | No | Preview affected pages without saving | |
| category | No | Limit to pages in this category | |
| operation | Yes | Operation: clear, set, prepend, append, or wrap,required | |
| content_ids | No | Limit to specific content IDs | |
| folder_path | No | Limit to pages under this path | |
| template_name | No | Limit to pages using this template | |
| version_comment | No | Version comment |
TDQS
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.
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.
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.
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.
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.
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 ContentADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | If true, validate all IDs exist without saving | |
| updates | Yes | Array of content updates (max 100),required | |
| version_comment | No | Version comment applied to all updates |
TDQS
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.
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.
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.
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.
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.
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 RequestADestructive
Cancel a pending approval request.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | required,Approval request ID to cancel |
TDQS
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.
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.
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.
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.
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.
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 JobBDestructive
Cancel a running import job
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Import job ID to cancel,required |
TDQS
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.
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.
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.
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.
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.
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 PublishBIdempotent
Clear the scheduled publish time for a content item.
| Name | Required | Description | Default |
|---|---|---|---|
| content_id | Yes | Content item ID,required |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | required,sequential or concurrent | |
| name | Yes | required,Workflow name | |
| trigger | Yes | required,Trigger type: all_contributor | folder_path | template_id | tag | |
| approvers | No | Ordered list of approvers | |
| description | No | Optional description | |
| trigger_value | No | Value for the trigger (e.g. folder path or template ID) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Collection name,required | |
| slug | Yes | Collection URL slug,required | |
| category | No | Content category to include | |
| sort_field | No | Field to sort by | |
| sort_order | No | Sort order: asc or desc | |
| description | No | Collection description | |
| item_template | No | HTML template for each item | |
| page_template | No | HTML template for collection page | |
| items_per_page | No | Items per page for pagination |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | required,Comment text | |
| mentions | No | Optional list of user ID strings to mention | |
| content_id | Yes | required,Content ID to post a comment on |
TDQS
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.
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.
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.
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.
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.
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:
Call list_templates to find the right template and its field names.
Create the content with data matching those fields.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Template field values,required | |
| hold | No | 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 | |
| slug | Yes | URL slug for the content,required | |
| tags | No | Tags for lc:query index pages (e.g. ['AI & Machine Intelligence', 'Generative AI']) | |
| title | Yes | Content title,required | |
| upsert | No | If true, update existing content at the same path instead of returning a duplicate key error | |
| noindex | No | Hide this page from search engines and AI (noindex; excluded from sitemap, llms.txt, feeds, IndexNow) | |
| category | No | Content category for collections | |
| og_image | No | Open Graph image URL | |
| raw_mode | No | Use raw HTML mode | |
| published | No | Publish immediately | |
| use_theme | No | Apply site theme/layout | |
| author_url | No | Author profile URL | |
| use_footer | No | Include site footer | |
| use_header | No | Include site header | |
| author_name | No | Author name for structured data and feeds (defaults to the site author) | |
| folder_path | No | Folder path (e.g., /blog) | |
| template_id | Yes | Template ID (MongoDB ObjectID),required | |
| version_comment | No | Optional comment describing this version | |
| meta_description | No | SEO meta description |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name for the folder,required | |
| slug | Yes | URL segment for the folder,required | |
| parent_id | No | Parent folder ID for nested folders |
TDQS
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.
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.
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.
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.
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.
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:
create_fork — create the workspace
fork_page — copy pages you want to edit into the fork (returns a fork page ID)
update_content (with the fork page ID) — make your edits
merge_fork — merge all changes to the live site (admin only)
Returns the fork ID needed for subsequent fork operations.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Fork workspace name,required | |
| description | No | Optional description of what this fork is for |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | RSS/Atom feed URL,required | |
| name | Yes | Name of the import source,required | |
| active | No | Whether the source is active (default true) | |
| schedule | No | Import schedule: hourly, daily, or weekly (default daily) | |
| folder_path | No | Folder path for imported content (e.g., /blog/imported) | |
| auto_publish | No | Automatically publish imported content (default false) | |
| template_name | No | Template name to use for imported content |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to_path | Yes | Destination path or URL (e.g., /new-page),required | |
| from_path | Yes | Source path (e.g., /old-page),required | |
| description | No | Optional description/note | |
| status_code | No | 301 (permanent) or 302 (temporary), defaults to 301 |
TDQS
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.
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.
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.
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.
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.
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:
| Name | Required | Description | Default |
|---|---|---|---|
| html | Yes | Go template HTML. Available fields: .Title .FullPath .Tags .MetaDescription .Category .Data,required | |
| name | Yes | Snippet name (used in lc:query directives),required |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Template name,required | |
| slug | Yes | Template slug for URLs,required | |
| fields | Yes | Template fields definition,required | |
| category | No | Template category for grouping | |
| description | No | Template description | |
| html_layout | Yes | HTML layout with {{.FieldName}} placeholders,required |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Endpoint URL to deliver events to,required | |
| name | Yes | Name for the webhook,required | |
| active | No | Whether the webhook is active (default true) | |
| events | Yes | Event types to subscribe to (e.g. content.publish),required |
TDQS
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.
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.
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.
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.
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.
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 WorkflowCDestructive
Delete an approval workflow.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | required,Workflow ID to delete |
TDQS
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.
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.
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.
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.
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.
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 AssetADestructiveIdempotent
Delete an asset from the library. Removes both the file and database record.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Asset ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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 CollectionADestructiveIdempotent
Delete a collection. This does not delete the content in the collection.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Collection ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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 CommentBDestructive
Delete a discussion comment. Requires comment.delete permission (admin only).
| Name | Required | Description | Default |
|---|---|---|---|
| comment_id | Yes | required,Comment ID to delete | |
| content_id | Yes | required,Content ID the comment belongs to |
TDQS
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.
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.
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.
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.
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.
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 ContentADestructiveIdempotent
Soft-delete a content item. The content can be restored later. Removes the static HTML page.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Content ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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 FolderADestructiveIdempotent
Delete an empty folder. Cannot delete folders that contain content or subfolders.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Folder ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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 ForkADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fork_id | Yes | Fork workspace ID to permanently delete,required |
TDQS
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.
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.
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.
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.
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.
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 SourceCDestructiveIdempotent
Delete an RSS import source
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Import source ID,required |
TDQS
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.
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.
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.
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.
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.
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 RedirectCDestructiveIdempotent
Delete a redirect.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Redirect ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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_snippetCDestructive
Delete a snippet by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Snippet ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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 TemplateADestructiveIdempotent
Delete a template. Cannot delete system templates or templates that have content using them.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Template ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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 WebhookBDestructiveIdempotent
Permanently delete a webhook.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Webhook ID,required |
TDQS
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.
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.
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.
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.
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.
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 SandboxADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | 'submit' keeps the fork and hands it to a human for review/merge; 'discard' deletes the fork and every change in it. |
TDQS
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.
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.
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.
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.
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.
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.
end_user_searchEnd User SearchBRead-only
Search published content using full-text exact match, semantic (AI) similarity, or hybrid mode. Returns page titles, paths, and snippets.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Search mode: exact, semantic, or hybrid (default hybrid) | |
| limit | No | Max results 1-50 (default 10) | |
| query | Yes | Search query,required |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true (safe operation). The description adds valuable return structure disclosure ('page titles, paths, and snippets') which compensates for the missing output schema, but omits other behavioral details like rate limits, result ordering, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two well-structured sentences with zero redundancy. Front-loaded with the action 'Search published content', followed by mechanism (match modes), then return values. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 100% schema coverage and readOnly annotations, the description is appropriately complete. It compensates for the missing output schema by specifying the return payload structure ('titles, paths, and snippets'). Could be improved by noting result limits or pagination behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for all three parameters (query, mode, limit). The description reinforces the mode options ('full-text exact match', 'semantic (AI)') but does not add syntax guidance, format requirements, or examples 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.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb ('Search') and resource ('published content') with specific scope. The phrase 'published content' effectively distinguishes this end-user facing search from administrative alternatives like 'search_content' that might include drafts, though it doesn't explicitly name the sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus the sibling 'search_content' tool, or when to prefer exact vs semantic vs hybrid modes. The description provides no 'when-not-to-use' constraints or prerequisite conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_contentExport ContentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Only include these field names (empty = all fields) | |
| category | No | Filter by category | |
| content_ids | No | Export only these specific IDs | |
| folder_path | No | Filter by folder path prefix | |
| template_name | No | Filter by template name |
TDQS
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.
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.
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.
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.
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.
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 ContentADestructiveIdempotent
Admin only: force-release any lock on a content item regardless of who holds it.
| Name | Required | Description | Default |
|---|---|---|---|
| content_id | Yes | Content item ID,required |
TDQS
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.
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.
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.
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.
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.
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 PageAIdempotent
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:
fork_page → get fork_page_id
update_content with id=fork_page_id to edit
get_content with id=fork_page_id to verify
merge_fork when all edits are ready (admin only)
If the page is already in this fork, returns the existing fork copy.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | URL path of the live page to fork (e.g. /about). Use instead of content_id when you know the path. | |
| fork_id | Yes | Fork workspace ID,required | |
| content_id | No | ID of the live content item to fork into this workspace |
TDQS
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.
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.
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.
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.
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.
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 StatusARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 ChangesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | No | Agent session ID. Defaults to this MCP session's own ID. |
TDQS
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.
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.
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.
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.
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.
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 TrafficBRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Days to cover (default 30, max 90) |
TDQS
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.
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.
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.
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.
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.
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 RequestBRead-only
Get details of a single approval request including decisions so far.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | required,Approval request ID |
TDQS
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.
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.
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.
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.
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.
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 WorkflowBRead-only
Get a single approval workflow by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | required,Workflow ID |
TDQS
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.
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.
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.
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.
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.
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 AssetARead-only
Get asset metadata by ID or path. Does not return file content (use the serve path to access the file).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Asset ID (MongoDB ObjectID) | |
| path | No | Asset serve path (e.g., /images/logo.png) |
TDQS
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.
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.
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.
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.
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.
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_backlinksGet BacklinksARead-only
Find all published pages that link to the given URL path. Links are tracked automatically whenever a page is published — both [[Wikilinks]] and ordinary links in content fields are indexed.
Use this to discover which pages reference a given page (wiki-style backlink graph), assess the impact of deleting or renaming a page, or find orphaned pages with no inbound links.
Example: {"path": "/about"} returns every published page whose content contains a link to /about.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | URL path to find backlinks for (e.g. /about),required |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds valuable indexing mechanics beyond annotations: explains links are 'tracked automatically whenever a page is published' (data freshness constraint) and specifies both [[Wikilinks]] and ordinary <a href> links are indexed (scope completeness). No contradiction with readOnlyHint:true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight paragraphs: mechanism (link tracking types), use cases (three scenarios), example (JSON). Front-loaded with core action. Every sentence delivers unique information; zero redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but description compensates by stating tool 'returns every published page whose content contains a link to /about', clarifying return type (pages) and scope. Lacks detail on pagination or field selection, but adequate for simple read-only tool with good annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage ('URL path to find backlinks for (e.g. /about)'), so baseline applies. Description provides JSON example {'path': '/about'} but primarily illustrates return behavior rather than adding parameter constraints, formats, or validation rules not in schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with specific verb 'Find' + resource 'published pages' + relationship 'that link to given URL path'. Clearly distinguishes from sibling get_content (returns page content) and search_content (full-text search) by focusing specifically on backlink relationships.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Lists three concrete use cases: 'discover which pages reference a given page (wiki-style backlink graph)', 'assess the impact of deleting or renaming a page', and 'find orphaned pages'. Provides clear when-to-use context, though lacks explicit 'when not to use' or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_collectionGet CollectionBRead-only
Get a collection by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Collection ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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 ContentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Content ID (MongoDB ObjectID) | |
| path | No | Content path (e.g., /about or /blog/my-post) | |
| include_rendered | No | If true, include the fully rendered HTML output in the response |
TDQS
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.
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.
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.
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.
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.
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 LockARead-only
Get the current advisory lock status for a content item. Returns lock holder and expiry, or {locked: false} if unlocked.
| Name | Required | Description | Default |
|---|---|---|---|
| content_id | Yes | Content item ID,required |
TDQS
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.
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.
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.
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.
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.
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 VersionBRead-only
Get a specific version of a content item with full field data.
| Name | Required | Description | Default |
|---|---|---|---|
| version | Yes | Version number,required | |
| content_id | Yes | Content ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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 VersionsBRead-only
Get the version history for a content item. Returns list of versions with timestamps.
| Name | Required | Description | Default |
|---|---|---|---|
| content_id | Yes | Content ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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 FolderCRead-only
Get a folder by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Folder ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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 ForkARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Fork ID (returned by create_fork or list_forks),required |
TDQS
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.
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.
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.
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.
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.
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 DiffARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Fork ID (returned by create_fork or list_forks),required |
TDQS
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.
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.
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.
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.
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.
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 JobBRead-only
Get the status, results, and log of a specific import job
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Import job ID,required | |
| include_logs | No | Include job log lines (default true) |
TDQS
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.
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.
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.
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.
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.
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 StatusARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_link_check_resultsGet Link Check ResultsBRead-only
Get the status and results of a link check job. Status is "running", "done", or "failed".
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Link check job ID returned by start_link_check,required |
TDQS
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 useful behavioral context by enumerating the possible status values (running/done/failed), which hints at polling semantics, but it does not say whether calling while 'running' returns partial results or whether failed jobs include error detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no filler; the core action and the status domain are stated immediately. Slightly redundant in restating status after already saying 'get the status', but efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of explaining the return payload, yet it only says 'status and results' without describing what results contain (e.g., broken links, counts, errors). Adequate for selection but incomplete for interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one parameter and 100% schema description coverage, the schema fully documents job_id including its origin in start_link_check. The description adds no additional parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (link check job status and results), which clearly separates it from write-oriented siblings like start_link_check. It does not explicitly name the sibling it pairs with, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the schema's job_id description mentions it comes from start_link_check, so an agent can infer this is the follow-up/polling call. The description itself offers no explicit when-to-use guidance or note about when it is appropriate to call (e.g., while running vs after completion).
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 ReportARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 SettingsBRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 ConfigBRead-only
Get site configuration including title templates.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_snippetBRead-only
Get a snippet by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Snippet ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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 TemplateARead-only
Get a single template by ID or slug. Returns full template including fields and HTML layout.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Template ID (MongoDB ObjectID) | |
| slug | No | Template slug |
TDQS
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.
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.
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.
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.
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.
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 ThemeARead-only
Get current theme settings including colors, fonts, and custom HTML for header/footer.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 VersionBRead-only
Get a specific version of theme settings with full data.
| Name | Required | Description | Default |
|---|---|---|---|
| version | Yes | Version number,required |
TDQS
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.
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.
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.
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.
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.
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 VersionsARead-only
Get the version history for theme settings. Returns list of versions with timestamps.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| csv_data | Yes | Raw CSV text (first row must be headers),required | |
| folder_path | No | Folder path for imported pages (default /imports) | |
| slug_column | No | Header name of the column to use as the URL slug (defaults to slugified title) | |
| auto_publish | No | Automatically publish imported pages (default false) | |
| title_column | Yes | Header name of the column to use as the page title,required | |
| template_name | No | Template name for imported pages |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pages | Yes | Array of markdown pages to import,required | |
| auto_publish | No | Automatically publish imported pages (default false) | |
| default_folder | No | Default folder path when not specified in frontmatter (default /imports) | |
| default_template | No | Default template name when not specified in frontmatter |
TDQS
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.
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.
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.
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.
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.
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 RequestsARead-only
List pending approval requests. Use filter=mine to see only requests in your queue.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | mine (my queue) or all (default: all pending) |
TDQS
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.
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.
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.
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.
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.
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 WorkflowsARead-only
List all configured approval workflows. Requires approval.manage_workflows permission.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 FoldersARead-only
List all unique folder paths in the asset library.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 AssetsBRead-only
List all assets in the asset library. Assets are files like images, documents, CSS, JS, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | Filter by folder path (e.g., /images) |
TDQS
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.
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.
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.
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.
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.
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 LogsARead-only
List recent audit log entries. Admin only. Supports filtering by action and resource type.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of entries to return (default 50, max 200) | |
| action | No | Filter by action (e.g. content.create, login.success) | |
| resource | No | Filter by resource type (e.g. content, template, user) |
TDQS
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.
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.
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.
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.
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.
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 CollectionsARead-only
List all content collections. Collections group and display content by category.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 CommentsBRead-only
List all discussion comments on a content item.
| Name | Required | Description | Default |
|---|---|---|---|
| content_id | Yes | required,Content ID to list comments for |
TDQS
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.
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.
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.
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.
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.
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 ContentARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of items to return (1-500). When set, returns paginated response with {items, total, limit, offset, has_more} | |
| offset | No | Number of items to skip (for pagination). Requires limit to be set | |
| category | No | Filter by content category | |
| folder_id | No | Filter by folder ID (MongoDB ObjectID) | |
| include_data | No | If true, include all template field data in results (avoids per-item get_content calls) | |
| include_forks | No | Also list fork copies (working copies inside fork workspaces). Off by default; use get_fork to see one fork's pages | |
| include_fields | No | Include only these specific field names from the data object (more efficient than include_data for large content) | |
| include_deleted | No | Include soft-deleted content in results |
TDQS
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.
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.
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.
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.
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.
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 FoldersBRead-only
List all content folders. Folders organize content into URL path segments.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 ForksARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 JobsBRead-only
List recent import jobs with their status and results
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of jobs to return (default 20, max 100) |
TDQS
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.
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.
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.
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.
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.
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 SourcesBRead-only
List all configured RSS/Atom import sources
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 RedirectsARead-only
List all URL redirects configured for the site.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 ContentARead-only
List all unpublished content items that have a scheduled publish time set.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | Optional folder path filter (e.g. /blog) |
TDQS
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.
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.
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.
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.
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.
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_snippetsARead-only
List all snippets. Snippets are reusable Go-template HTML fragments used in lc:query index page directives.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 TemplatesBRead-only
List all available templates. Templates define content structure with fields and HTML layout.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 DeliveriesBRead-only
List recent delivery attempts for a webhook.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Webhook ID,required | |
| limit | No | Maximum number of deliveries to return (default 50) |
TDQS
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.
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.
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.
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.
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.
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 WebhooksARead-only
List all registered webhooks. Secrets are never returned.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 ForkADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fork_id | Yes | Fork workspace ID to merge into live,required | |
| publish_new | No | 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 |
TDQS
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.
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.
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.
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.
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.
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 VersionAIdempotent
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}
| Name | Required | Description | Default |
|---|---|---|---|
| version | Yes | Theme version number to pin/unpin,required |
TDQS
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.
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.
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.
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.
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.
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 ContentARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Content ID (MongoDB ObjectID),required | |
| data | No | Override field data for the preview (not saved). Merged on top of existing data. | |
| title | No | Override title for the preview (not saved) |
TDQS
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.
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.
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.
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.
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.
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 ContentADestructiveIdempotent
Publish a content item, making it visible on the public site. Generates the static HTML page.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Content ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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 MultipleADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | List of content IDs to publish. Mutually exclusive with publish_all_drafts. | |
| publish_all_drafts | No | If true, publish every unpublished (draft) content item in the site |
TDQS
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.
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.
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.
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.
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.
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 CopiesADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | If true, return the count and the list of {id, full_path} without deleting anything | |
| fork_id | Yes | ID of a merged or archived fork,required |
TDQS
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.
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.
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.
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.
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.
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 ContentAIdempotent
Regenerate all published static HTML pages. Use after major theme or template changes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 SecretADestructive
Generate a new HMAC-SHA256 signing secret for a webhook. The old secret stops working immediately. The new secret is returned ONCE — save it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Webhook ID,required |
TDQS
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.
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.
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.
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.
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.
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 EmbeddingsAIdempotent
Regenerate vector embeddings for all published content. Required after initial setup or if embeddings become stale.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 RequestADestructive
Reject an approval request. A comment explaining the rejection is required and will be posted to the content's discussion thread.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | required,Approval request ID | |
| comment | Yes | required,Rejection reason (required) |
TDQS
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.
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.
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.
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.
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.
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 LockAIdempotent
Release the advisory lock on a content item held by the current API user.
| Name | Required | Description | Default |
|---|---|---|---|
| content_id | Yes | Content item ID,required |
TDQS
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.
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.
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.
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.
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.
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 PageADestructiveIdempotent
Remove a page from a fork workspace (discards the fork copy, does not affect the live page).
| Name | Required | Description | Default |
|---|---|---|---|
| fork_id | Yes | Fork workspace ID,required | |
| page_id | Yes | ID of the fork page to remove (not the live content ID),required |
TDQS
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.
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.
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.
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.
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.
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 ContentAIdempotent
Restore a soft-deleted content item. Regenerates static page if content was published.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Content ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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 VersionADestructive
Revert theme to a previous version. Creates a new version with the old data.
| Name | Required | Description | Default |
|---|---|---|---|
| version | Yes | Version number to revert to,required | |
| version_comment | No | Optional comment for the revert (e.g., 'Reverted to v3') |
TDQS
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.
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.
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.
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.
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.
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 VersionADestructive
Revert content to a previous version. Creates a new version with the old data.
| Name | Required | Description | Default |
|---|---|---|---|
| version | Yes | Version number to revert to,required | |
| content_id | Yes | Content ID (MongoDB ObjectID),required | |
| version_comment | No | Optional comment for the revert (e.g., 'Reverted to v3') |
TDQS
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.
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.
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.
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.
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.
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 SessionADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | No | Agent session ID. Defaults to this MCP session's own ID. |
TDQS
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.
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.
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.
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.
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.
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 ScanAIdempotent
Run a site-health scan now and return the fresh report. Scans also run automatically once a day.
| Name | Required | Description | Default |
|---|---|---|---|
| link_check | No | Also start an async broken-link check job |
TDQS
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.
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.
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.
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.
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.
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 PublishAIdempotent
Set a future publish date/time for a content item. The scheduler automatically publishes it when the time arrives.
| Name | Required | Description | Default |
|---|---|---|---|
| content_id | Yes | Content item ID,required | |
| publish_at | Yes | ISO 8601 datetime when to publish (e.g. 2026-03-24T15:00:00Z),required |
TDQS
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.
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.
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.
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.
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.
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 ExecuteADestructive
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"}
| Name | Required | Description | Default |
|---|---|---|---|
| regex | No | If true, treat search as a Go regular expression. Use $1, $2 for capture group references in replace. | |
| search | Yes | Text to search for,required | |
| replace | Yes | Replacement text (empty string to delete) | |
| category | No | Limit to pages in this category | |
| content_ids | No | Limit to specific content IDs | |
| folder_path | No | Limit to pages whose URL starts with this path (e.g. /blog) | |
| template_name | No | Limit to pages using this template name (e.g. 'Concept Page') | |
| auto_republish | No | If true (execute only), re-publish all previously-published pages immediately after updating them (saves a separate publish_multiple call) | |
| version_comment | No | Version comment for updated pages |
TDQS
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.
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.
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.
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.
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.
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 PreviewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| regex | No | If true, treat search as a Go regular expression. Use $1, $2 for capture group references in replace. | |
| search | Yes | Text to search for,required | |
| replace | Yes | Replacement text (empty string to delete) | |
| category | No | Limit to pages in this category | |
| content_ids | No | Limit to specific content IDs | |
| folder_path | No | Limit to pages whose URL starts with this path (e.g. /blog) | |
| template_name | No | Limit to pages using this template name (e.g. 'Concept Page') | |
| auto_republish | No | If true (execute only), re-publish all previously-published pages immediately after updating them (saves a separate publish_multiple call) | |
| version_comment | No | Version comment for updated pages |
TDQS
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.
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.
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.
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.
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.
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 ContentBRead-only
Search across all content items by title or full text. Returns matching content with paths and match context.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query string,required | |
| search_type | No | Search type: 'name' (title only) or 'fulltext' (all fields). Defaults to 'fulltext' | |
| include_forks | No | Also search fork copies (working copies inside fork workspaces). Off by default | |
| include_deleted | No | Include soft-deleted content in results |
TDQS
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.
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.
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.
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.
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.
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 ExecuteADestructive
Execute a site-wide search-and-replace across all content. Modifies every matching page permanently.
MANDATORY workflow:
Run search_replace_preview and show the user which pages will be affected.
Get explicit user confirmation before executing.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pairs | No | Array of {search, replace, regex} pairs for bulk mode. Applies all replacements in a single pass per page. | |
| regex | No | If true, treat search as regex (single-pair mode) | |
| search | No | Text to search for (single-pair mode) | |
| replace | No | Text to replace with (single-pair mode) | |
| auto_republish | No | If true, re-publish updated pages immediately | |
| version_comment | No | Comment for version history |
TDQS
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.
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.
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.
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.
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.
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 PreviewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| pairs | No | 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. | |
| regex | No | If true, treat search as regex (single-pair mode) | |
| search | No | Text to search for (single-pair mode) | |
| replace | No | Text to replace with (single-pair mode) |
TDQS
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.
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.
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.
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.
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.
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 IndexNowAIdempotent
Turn automatic IndexNow submission on or off for this site (on by default).
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | Yes | true to submit changed pages to IndexNow automatically, false to stop |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Short name for the sandbox fork (e.g. 'refresh-pricing-pages'). Auto-generated when omitted. | |
| description | No | What this agent session intends to change — shown to the human reviewer. |
TDQS
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.
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.
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.
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.
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.
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.
start_link_checkStart Link CheckA
Start an asynchronous broken-link check across all published content.
Returns a job_id immediately. Poll get_link_check_results(job_id) until status is "done".
Example workflow: start_link_check() → {job_id: "abc123"} get_link_check_results("abc123") → if status=="running", wait and retry; if "done", review broken_links
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false; the description adds substantive behavioral context beyond that: the operation is asynchronous, returns a job_id immediately, and requires polling another tool until completion. It does not disclose whether concurrent checks are allowed, whether one can be cancelled, or the cost/scope of scanning all content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key facts (async, scope, immediate job_id, polling target) are packed into the first two sentences with nothing wasted. The code-block example adds concrete grounding, though it partly restates the workflow in prose, so it is slightly longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter async trigger with no output schema, the description covers exactly what an agent needs: what it does, that it returns a job_id, and which tool to call next to observe the result and how to interpret its status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly conveys that no inputs are needed and instead documents the returned job_id, which is the only value the caller must carry forward.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Start'), resource ('broken-link check'), scope ('across all published content'), and modality ('asynchronous'). It also names the companion sibling get_link_check_results, so an agent can distinguish this trigger from the tool that reads its output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear workflow: call this to start, then poll get_link_check_results(job_id) until status is 'done', with explicit retry behavior while 'running'. It does not state when NOT to use it (e.g., overlap with run_maintenance_scan or whether a check is already in flight), so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| content_id | Yes | required,Content ID to submit for approval |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Submit every published page (limited to once per hour) | |
| paths | No | Specific site paths to submit, e.g. ["/blog/post"] |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Import source ID,required |
TDQS
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.
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.
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.
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.
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.
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 VersionAIdempotent
Remove the lock from a previously pinned theme version.
Example: {"version": 5}
| Name | Required | Description | Default |
|---|---|---|---|
| version | Yes | Theme version number to pin/unpin,required |
TDQS
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.
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.
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.
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.
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.
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 ContentADestructiveIdempotent
Unpublish a content item, removing it from the public site. Removes the static HTML page.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Content ID (MongoDB ObjectID),required |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | required,Workflow ID to update | |
| mode | Yes | required,sequential or concurrent | |
| name | Yes | required,Workflow name | |
| trigger | Yes | required,Trigger type: all_contributor | folder_path | template_id | tag | |
| approvers | No | Ordered list of approvers | |
| description | No | Optional description | |
| trigger_value | No | Value for the trigger |
TDQS
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.
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.
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.
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.
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.
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 CollectionCDestructiveIdempotent
Update a collection's settings.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Collection ID (MongoDB ObjectID),required | |
| name | No | Collection name | |
| slug | No | Collection URL slug | |
| category | No | Content category to include | |
| sort_field | No | Field to sort by | |
| sort_order | No | Sort order: asc or desc | |
| description | No | Collection description | |
| item_template | No | HTML template for each item | |
| page_template | No | HTML template for collection page | |
| items_per_page | No | Items per page for pagination |
TDQS
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.
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.
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.
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.
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.
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 ContentADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Content ID (MongoDB ObjectID),required | |
| data | No | Template field values | |
| hold | No | true puts the page on hold so it cannot be published; false clears the hold. Holding a published page does not unpublish it | |
| slug | No | URL slug | |
| tags | No | Tags for lc:query index pages | |
| title | No | Content title | |
| dry_run | No | If true, validate the update without saving | |
| noindex | No | true hides the page from search engines and AI; false makes it visible again | |
| category | No | Content category | |
| og_image | No | Open Graph image URL | |
| raw_mode | No | Use raw HTML mode | |
| use_theme | No | Apply site theme/layout | |
| author_url | No | Author profile URL; empty string clears it | |
| use_footer | No | Include site footer | |
| use_header | No | Include site header | |
| author_name | No | Author name for structured data and feeds; empty string reverts to the site default | |
| folder_path | No | Folder path | |
| template_id | No | Template ID (MongoDB ObjectID) | |
| clear_fields | No | Field names to clear to empty string (removes ambiguity about how to delete field content) | |
| set_raw_mode | No | Set to true to explicitly update raw_mode (needed to set it to false) | |
| set_use_theme | No | Set to true to explicitly update use_theme (needed to set it to false) | |
| set_use_footer | No | Set to true to explicitly update use_footer (needed to set it to false) | |
| set_use_header | No | Set to true to explicitly update use_header (needed to set it to false) | |
| version_comment | No | Optional comment describing this version change | |
| meta_description | No | SEO meta description |
TDQS
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.
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.
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.
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.
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.
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 PathADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Field values to update | |
| hold | No | true puts the page on hold so it cannot be published; false clears the hold. Holding a published page does not unpublish it | |
| path | Yes | URL path of the content to update (e.g. /about or /blog/my-post),required | |
| tags | No | Tags for lc:query index pages | |
| title | No | New title | |
| noindex | No | true hides the page from search engines and AI; false makes it visible again | |
| category | No | Content category | |
| og_image | No | Open Graph image URL | |
| published | No | Publish state | |
| author_url | No | Author profile URL; empty string clears it | |
| author_name | No | Author name for structured data and feeds; empty string reverts to the site default | |
| version_comment | No | Version comment | |
| meta_description | No | SEO meta description |
TDQS
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.
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.
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.
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.
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.
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 SourceCDestructiveIdempotent
Update an RSS import source configuration
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Import source ID,required | |
| url | No | RSS/Atom feed URL | |
| name | No | Name of the import source | |
| active | No | Whether the source is active | |
| schedule | No | Import schedule: hourly, daily, or weekly | |
| folder_path | No | Folder path for imported content | |
| auto_publish | No | Automatically publish imported content | |
| template_name | No | Template name to use for imported content |
TDQS
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.
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.
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.
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.
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.
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 RedirectCDestructiveIdempotent
Update an existing redirect.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Redirect ID (MongoDB ObjectID),required | |
| to_path | No | Destination path or URL | |
| from_path | No | Source path | |
| description | No | Optional description | |
| status_code | No | 301 or 302 |
TDQS
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.
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.
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.
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.
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.
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 SettingsAIdempotent
Change search & AI settings. Only the fields you pass change. Blocking AI training crawlers does not affect Google/Bing search.
| Name | Required | Description | Default |
|---|---|---|---|
| author_url | No | Default author profile URL | |
| feed_limit | No | Items per feed (1-500) | |
| author_name | No | Default author name for structured data and feeds | |
| author_type | No | Default author type: Person or Organization | |
| robots_extra | No | Extra robots.txt lines appended verbatim | |
| feed_disabled | No | true turns off /feed.xml and /atom.xml | |
| author_same_as | No | Author profile URLs (schema.org sameAs) | |
| feed_all_pages | No | Include every page in the site feed | |
| feed_templates | No | Template names included in the site feed | |
| content_signals | No | Emit a Content-Signal line in robots.txt | |
| feed_categories | No | Categories included in the site feed | |
| training_policy | No | AI training crawlers (GPTBot, ClaudeBot, Google-Extended…): allow or disallow | |
| ai_search_policy | No | AI search crawlers (OAI-SearchBot, PerplexityBot…): allow or disallow | |
| crawler_overrides | No | Per-crawler overrides by robots token, e.g. {"GPTBot":"disallow"}; replaces the whole map | |
| markdown_disabled | No | true turns off Markdown copies at /<page>.md | |
| publisher_same_as | No | Site/organization profile URLs (schema.org sameAs) | |
| user_fetch_policy | No | User-initiated AI fetchers (ChatGPT-User, Claude-User…): allow or disallow |
TDQS
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.
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.
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.
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.
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.
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 ConfigCDestructiveIdempotent
Update site configuration. Title templates support {{title}} and {{site_name}} placeholders.
| Name | Required | Description | Default |
|---|---|---|---|
| title_template | No | Page title template with {{title}} and {{site_name}} placeholders | |
| title_template_no_title | No | Title template when page has no title |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Snippet ID (MongoDB ObjectID),required | |
| html | Yes | Go template HTML,required | |
| name | Yes | Snippet name,required |
TDQS
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.
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.
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.
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.
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.
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 TemplateADestructiveIdempotent
Update an existing template. Changing the HTML layout will regenerate all content using this template.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Template ID (MongoDB ObjectID),required | |
| name | No | Template name | |
| slug | No | Template slug | |
| fields | No | Template fields definition | |
| category | No | Template category | |
| description | No | Template description | |
| html_layout | No | HTML layout (changing this regenerates all content using this template) |
TDQS
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.
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.
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.
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.
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.
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 ThemeADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| logo_url | No | Logo image URL | |
| head_html | No | Custom HTML for <head> section | |
| site_name | No | Site name | |
| custom_css | No | Additional custom CSS | |
| text_color | No | Text color (hex) | |
| font_family | No | Body font family CSS value | |
| footer_html | No | Custom footer HTML (changing regenerates all content) | |
| header_html | No | Custom header HTML (changing regenerates all content) | |
| accent_color | No | Accent theme color (hex) | |
| heading_font | No | Heading font family CSS value | |
| site_tagline | No | Site tagline | |
| border_radius | No | Border radius CSS value | |
| primary_color | No | Primary theme color (hex) | |
| secondary_color | No | Secondary theme color (hex) | |
| background_color | No | Background color (hex) |
TDQS
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.
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.
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.
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.
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.
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 WebhookBDestructiveIdempotent
Update an existing webhook (name, URL, events, active). Partial update — only provided fields change.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Webhook ID,required | |
| url | No | New endpoint URL | |
| name | No | New name | |
| active | No | Enable or disable the webhook | |
| events | No | New event list |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | Original filename with extension,required | |
| file_path | No | Absolute local filesystem path to read the file from. Preferred over data_base64 for large files — avoids MCP transport size limits. | |
| serve_path | Yes | URL path where file will be served (e.g., /images/logo.png),required | |
| data_base64 | No | Base64-encoded file content. Use for small files (<100KB). For larger files, prefer file_path. | |
| description | No | Optional description of the asset |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public URL of the file to fetch (must be http or https),required | |
| serve_path | No | URL path where asset will be served (e.g. /assets/logo.png). Auto-derived from URL filename if omitted. | |
| description | No | Optional description |
TDQS
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.
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.
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.
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.
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.
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.
65 tool updates
v7.3.4- Added
acquire_content_lock - Added
approve_request - Added
backfill_published_dates - Added
bulk_create_content - Added
cancel_approval_request - Added
cancel_import_job - Added
cancel_scheduled_publish - Added
create_approval_workflow - Added
create_comment - Changed
create_content5 fields changed- added
Input schema / properties / author_nameAdded value: +{ + "description": "Author name for structured data and feeds (defaults to the site author)", + "type": "string" +} - added
Input schema / properties / author_urlAdded value: +{ + "description": "Author profile URL", + "type": "string" +} - added
Input schema / properties / holdAdded 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" +} - added
Input schema / properties / noindexAdded value: +{ + "description": "Hide this page from search engines and AI (noindex; excluded from sitemap, llms.txt, feeds, IndexNow)", + "type": "boolean" +} - added
Input schema / properties / upsertAdded value: +{ + "description": "If true, update existing content at the same path instead of returning a duplicate key error", + "type": "boolean" +}
- Added
create_import_source - Added
create_webhook - Added
delete_approval_workflow - Added
delete_comment - Added
delete_import_source - Added
delete_webhook - Added
end_agent_sandbox - Added
force_unlock_content - Added
get_agent_sandbox - Added
get_agent_session_changes - Added
get_ai_traffic - Added
get_approval_request - Added
get_approval_workflow - Added
get_content_lock - Added
get_fork_diff - Added
get_import_job - Added
get_indexnow_status - Added
get_link_check_results - Added
get_maintenance_report - Added
get_seo_settings - Added
import_csv - Added
import_markdown - Added
list_approval_requests - Added
list_approval_workflows - Added
list_audit_logs - Added
list_comments - Changed
list_content3 fields changed- added
Input schema / properties / include_forksAdded 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" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Maximum number of items to return (1-500). When set, returns paginated response with {items, total, limit, offset, has_more}", + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Number of items to skip (for pagination). Requires limit to be set", + "type": "integer" +}
- Added
list_import_jobs - Added
list_import_sources - Added
list_scheduled_content - Added
list_webhook_deliveries - Added
list_webhooks - Changed
merge_fork1 field changed- added
Input schema / properties / publish_newAdded 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" +}
- Added
purge_fork_copies - Added
regenerate_webhook_secret - Added
reject_request - Added
release_content_lock - Added
rollback_agent_session - Added
run_maintenance_scan - Added
schedule_content_publish - Changed
search_content1 field changed- added
Input schema / properties / include_forksAdded value: +{ + "description": "Also search fork copies (working copies inside fork workspaces). Off by default", + "type": "boolean" +}
- Changed
search_replace_execute7 fields changed- changed
Input schema / properties / auto_republish / descriptionPrevious 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" - added
Input schema / properties / pairsAdded 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" +} - changed
Input schema / properties / regex / descriptionPrevious 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)" - changed
Input schema / properties / replace / descriptionPrevious value: -"Text to replace with,required"New value: +"Text to replace with (single-pair mode)" - changed
Input schema / properties / search / descriptionPrevious value: -"Text to search for,required"New value: +"Text to search for (single-pair mode)" - changed
Input schema / properties / version_comment / descriptionPrevious value: -"Comment for version history (defaults to 'Bulk search and replace')"New value: +"Comment for version history" - removed
Input schema / requiredRemoved value: -[ - "search", - "replace" -]
- Changed
search_replace_preview5 fields changed- added
Input schema / properties / pairsAdded 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" +} - changed
Input schema / properties / regex / descriptionPrevious 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)" - changed
Input schema / properties / replace / descriptionPrevious value: -"Text to replace with,required"New value: +"Text to replace with (single-pair mode)" - changed
Input schema / properties / search / descriptionPrevious value: -"Text to search for,required"New value: +"Text to search for (single-pair mode)" - removed
Input schema / requiredRemoved value: -[ - "search", - "replace" -]
- Added
set_indexnow_enabled - Added
start_agent_sandbox - Added
start_link_check - Added
submit_for_approval - Added
submit_indexnow - Added
trigger_import_source - Added
update_approval_workflow - Changed
update_content4 fields changed- added
Input schema / properties / author_nameAdded value: +{ + "description": "Author name for structured data and feeds; empty string reverts to the site default", + "type": [ + "null", + "string" + ] +} - added
Input schema / properties / author_urlAdded value: +{ + "description": "Author profile URL; empty string clears it", + "type": [ + "null", + "string" + ] +} - added
Input schema / properties / holdAdded 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" + ] +} - added
Input schema / properties / noindexAdded value: +{ + "description": "true hides the page from search engines and AI; false makes it visible again", + "type": [ + "null", + "boolean" + ] +}
- Changed
update_content_by_path4 fields changed- added
Input schema / properties / author_nameAdded value: +{ + "description": "Author name for structured data and feeds; empty string reverts to the site default", + "type": [ + "null", + "string" + ] +} - added
Input schema / properties / author_urlAdded value: +{ + "description": "Author profile URL; empty string clears it", + "type": [ + "null", + "string" + ] +} - added
Input schema / properties / holdAdded 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" + ] +} - added
Input schema / properties / noindexAdded value: +{ + "description": "true hides the page from search engines and AI; false makes it visible again", + "type": [ + "null", + "boolean" + ] +}
- Added
update_import_source - Added
update_seo_settings - Added
update_webhook
72 tool updates
v4.2.0- First observed
archive_fork - First observed
bulk_field_operation - First observed
bulk_update_content - First observed
create_collection - First observed
create_content - First observed
create_folder - First observed
create_fork - First observed
create_redirect - First observed
create_snippet - First observed
create_template - First observed
delete_asset - First observed
delete_collection - First observed
delete_content - First observed
delete_folder - First observed
delete_fork - First observed
delete_redirect - First observed
delete_snippet - First observed
delete_template - First observed
end_user_search - First observed
export_content - First observed
fork_page - First observed
get_asset - First observed
get_backlinks - First observed
get_collection - First observed
get_content - First observed
get_content_version - First observed
get_content_versions - First observed
get_folder - First observed
get_fork - First observed
get_site_config - First observed
get_snippet - First observed
get_template - First observed
get_theme - First observed
get_theme_version - First observed
get_theme_versions - First observed
list_asset_folders - First observed
list_assets - First observed
list_collections - First observed
list_content - First observed
list_folders - First observed
list_forks - First observed
list_redirects - First observed
list_snippets - First observed
list_templates - First observed
merge_fork - First observed
pin_theme_version - First observed
preview_content - First observed
publish_content - First observed
publish_multiple - First observed
regenerate_all_content - First observed
reindex_embeddings - First observed
remove_fork_page - First observed
restore_content - First observed
revert_theme_to_version - First observed
revert_to_version - First observed
scoped_search_replace_execute - First observed
scoped_search_replace_preview - First observed
search_content - First observed
search_replace_execute - First observed
search_replace_preview - First observed
unpin_theme_version - First observed
unpublish_content - First observed
update_collection - First observed
update_content - First observed
update_content_by_path - First observed
update_redirect - First observed
update_site_config - First observed
update_snippet - First observed
update_template - First observed
update_theme - First observed
upload_asset - First observed
upload_asset_from_url
TDQS
Scored across 129 tools
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.
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.
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.
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
Related MCP Connectors
AI-operated knowledge-graph CMS for business websites: entities, pages, blocks, media, domains.
Build, edit, preview and publish hosted content websites from Claude, ChatGPT or Cursor.
1- ZeroCMSOAuthio.zerocms
AI-native Git-based CMS for Astro. Create and publish content in the browser, without learning git.
Build, edit and run real hosted websites from your AI - content, SEO, menus, store, rollback.
Related MCP Servers
- AlicenseAqualityAmaintenanceSimple and free publishing of content on the web for AI Agents28,511 npmMIT
- AlicenseNot gradedqualityFmaintenanceStatic site generator / website building toolkit for AI coding agents like Claude, Codex, Cursor, Gemini, OpenClaw, etc. No subscription, no lock-in — host your site anywhere.10 npm9Elastic 2.0
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to create and manage owned-audience websites with posts, products, subscribers, domains, and analytics.74 npmMIT

NextBlock CMSofficial
FlicenseNot gradedqualityAmaintenanceOpen-source Next.js + Supabase CMS with a per-site MCP server for building and editing sites from any agent18-