Skip to main content
Glama

LightCMS

CI codecov Go Report Card lightcms MCP server

LightCMS is a Go-powered content management system built for the AI era. It's simultaneously AI-native (semantic search, built-in Claude-powered chat widget, MCP server for agent control), agentically controllable (Claude Code and any MCP client can read, write, publish, and bulk-import content via 106 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 v6.0

Feature

Summary

Content Approvals

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

Contributor Role

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

Approval Workflows

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

Content Discussion

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

Tabbed Bottom Panel

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

Approvals Dashboard

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

Dashboard Sections

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

New Webhook Events

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

14 new MCP tools

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

Related MCP server: sitemd

What's New in v5.0

Feature

Summary

Import Pipeline

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

RSS/Atom Import

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

Markdown Import

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

CSV Import

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

Real-time Job Status

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

10 new MCP import tools

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

Agentic bulk content creation

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

Deduplication

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

What's New in v4.5

Feature

Summary

Webhooks

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

Scheduled Publishing

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

Content Locking

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

Incremental Static Regeneration (ISR)

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

Edge Caching Headers

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

Cloudflare Integration

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

Structured JSON Logging

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

Rate Limit Dashboard

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

MCP Prompt Resources

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

Why LightCMS?

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

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

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

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

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

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

Features

Content Management

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

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

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

  • Soft Delete: Recover deleted content with undelete functionality

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

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

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

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

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

  • Rich Text Editor: TinyMCE integration for visual content editing

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

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

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

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

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

Import Pipeline (v5.0+)

  • RSS/Atom Feed Sources: Configure recurring import sources with configurable schedule (hourly/daily/weekly), template mapping, folder targeting, and auto-publish. Manage sources and run history from /cm/imports.

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

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

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

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

Content Forks (v4.0+)

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

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

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

  • Merge with Conflict Detection: Admins merge forks into live content; if a live page was changed after the fork was created, the conflict is recorded (fork wins). New pages created in the fork are inserted into live on merge

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

Batch & Parallel Operations

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

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

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

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

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

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

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

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

AI Chat Widget (v4.2+)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Developer & Integration

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

  • MCP Server: 106 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

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

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

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

Site Customization

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

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

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

Prerequisites

  • Go 1.24 or later

  • MongoDB Atlas account (free tier works great)

Quick Start

  1. Clone the repository

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

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

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

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

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

MongoDB Atlas Setup

Step 1: Create an Atlas Account

  1. Go to MongoDB Atlas

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

Step 2: Create a Cluster

  1. Click "Build a Database"

  2. Select "M0 FREE" (Shared) tier

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

  4. Click "Create Deployment"

Step 3: Set Up Database Access

  1. Create a database user:

    • Username: lightcms (or your choice)

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

    • Click "Create User"

  2. Add your IP address:

    • Click "Add My Current IP Address"

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

    • Click "Finish and Close"

Step 4: Get Your Connection String

  1. Click "Connect" on your cluster

  2. Select "Drivers"

  3. Copy the connection string, it looks like:

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

Step 5: Create Your Config File

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

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

Edit config.dev.json:

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

For production, use config.prod.json:

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

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

Installation

# Clone or navigate to the project
cd lightcms

# Install dependencies
go mod tidy

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

Or use the run script:

./run.sh

Configuration

LightCMS uses JSON config files. Create either:

  • config.dev.json - for development

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

Field

Description

port

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

mongo_uri

MongoDB Atlas connection string

env

Environment: "development" or "production"

session_secret

Random string for session encryption

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

Usage

Accessing the Site

First Login

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

To reset a password from the command line:

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

Creating Content

  1. Log in to the admin panel at /cm

  2. Go to ContentNew Content

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

  4. Fill in the fields

  5. Check "Published" and save

Managing Users (Admin Only)

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

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

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

  4. Disable accounts or reset passwords from the edit page

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

Creating Custom Templates

  1. Go to TemplatesNew Template

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

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

  4. Save the template

Available placeholders:

  • {{.title}} - Content title

  • {{.slug}} - URL slug

  • {{.published_at}} - Publication date

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

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

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


Tags

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

Setting tags in the admin UI:

  1. Open any content item in the editor

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

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

  4. Save the content item

Setting tags via the API:

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

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


Snippets

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

Creating a snippet:

  1. Go to Settings → Snippets in the admin panel

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

  3. Write HTML using Go template variables:

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

Available variables inside a snippet:

Variable

Description

{{.Title}}

The content item's title

{{.FullPath}}

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

{{.Slug}}

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

{{.MetaDescription}}

Meta description field

{{.PublishedAt}}

Publication timestamp

Example snippets:

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

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

A card with description:

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

A simple list item:

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

lc:query Directives

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

Syntax:

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

Attributes:

Attribute

Required

Description

filter

Yes

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

sort

No

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

snippet

Yes

Name of the snippet to render each result through.

Example in a template layout:

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

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

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

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


Automatic Regeneration

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

  • A tagged content item is published or updated

  • The template layout is changed

  • The snippet is updated

  • Regenerate All is triggered manually from the admin panel

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


Complete Walkthrough: Building a Tagging-Powered Index

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

Step 1: Tag your concept pages

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

Step 2: Create a snippet

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

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

Step 3: Create a template with lc:query sections

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

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

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

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

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

  </div>
</article>

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

Step 4: Create and publish an index page

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

Step 5: Keep publishing

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


Template Variables

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

Variable

Description

{{.title}}

The content item's title

{{.slug}}

URL slug

{{.published_at}}

Publication timestamp

{{.your_field}}

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

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



Content Authoring: Pre-Processing & Markup Features

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


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

Syntax

Result

[[Page Title]]

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

[[Page Title|display text]]

Same, with custom link text

[[/full/path]]

Link to a page by its exact URL path

[[/full/path|display text]]

Path link with custom link text

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


Snippet Includes

Embed a named snippet inline inside any content field:

[[include:snippet-name]]

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


Table of Contents

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

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

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


Heading IDs

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

Example:

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

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

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


Markdown Field Type

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

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

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

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

Inline Tag Detection

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

Tag rules:

  • Must start with a letter

  • May contain letters, numbers, underscores, or hyphens

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

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


Creating Collections

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

  1. Go to CollectionsNew Collection

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

  3. Define item and page templates

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

Customizing the Theme

  1. Go to Theme in the admin panel

  2. Adjust colors, fonts, and border radius

  3. Add custom CSS if needed

  4. Save to apply changes site-wide

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

Search API

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

Parameter

Description

q

Search query (required)

mode

hybrid (default), fulltext, or semantic

limit

Max results 1–50 (default 10)

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

match_type is exact, semantic, or both.

Typeahead Suggest API

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

Returns two lists for building a live typeahead dropdown:

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

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

JavaScript Example

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

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

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

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

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

Ranking Configuration

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

Project Structure

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

Default Templates

Blog Post

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

Press Release

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

Explanatory Page

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

Concept Page

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

Standard Page, Blank Page, Homepage

General-purpose layouts for flexible content.

Multi-User Access Control

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

Roles

Role

Capabilities

admin

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

editor

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

viewer

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

Audit Log

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

API Key Permissions

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

First-Time Migration

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

API Keys

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

  1. Log in at /cm

  2. Go to SettingsAPI Keys

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

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

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

OAuth 2.1 Authorization

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

Endpoints

Endpoint

Purpose

POST /oauth/register

Dynamic client registration (RFC 7591)

GET /oauth/authorize

Authorization page (admin login + consent)

POST /oauth/token

Token exchange and refresh

POST /oauth/revoke

Token revocation (RFC 7009)

GET /oauth/jwks

JWKS endpoint (opaque tokens, returns empty)

Security

  • PKCE (S256) required for all authorization requests

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

  • Short-lived access tokens: 1-hour TTL

  • Refresh tokens: 30-day TTL, revocable

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

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

How Clients Connect

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

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

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

  4. Admin enters password and approves access

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

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

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

REST API

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

Authentication

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

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

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

Endpoints

Resource

Endpoints

Content

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

Templates

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

Snippets

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

Assets

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

Theme

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

Config

GET/PUT /config

Redirects

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

Folders

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

Collections

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

Search

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

API Keys

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

Utility

POST /regenerate

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

CLI Tool

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

Installation

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

# Or download a release binary from GitHub

Configuration

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

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

Commands

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

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

lightcms --json content list             # JSON output

Run lightcms --help for full usage.

MCP Server (AI-Powered Content Management)

lightcms MCP server

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

  • Stdio — for local tools like Claude Code

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

Option A: Local Setup (Claude Code via Stdio)

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

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

  2. Run the setup script:

export LIGHTCMS_API_KEY=lc_your_key_here
./setup-mcp.sh

Or register manually:

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

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

Restart Claude Code and run /mcp to verify.

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

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

How it works:

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

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

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

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

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

Discovery endpoints:

Endpoint

Purpose

/.well-known/oauth-authorization-server

OAuth server metadata (RFC 8414)

/.well-known/oauth-protected-resource

Protected resource metadata (RFC 9728)

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

MCP server card with tool schemas

Authentication

The MCP HTTP endpoint accepts both authentication methods:

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

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

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

Available Tools (106 total) + 3 Prompt Resources

  • Content (20): create, read, update, delete, publish, unpublish, restore, versioning, revert, preview, bulk update, bulk field operation, export, backlinks, update by path, publish multiple

  • 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 (8): list, create, get, fork page, remove page, merge, archive, delete

  • 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, get, update, delete webhooks; regenerate secret

  • 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+): get audit log, check links, list broken links

  • 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

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

For detailed API documentation, see MCP.md.

Environment Variables (Stdio Mode)

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

  • LIGHTCMS_API_KEY — API key (required for stdio mode)

MCP Examples

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

Example 1: Create and Publish a Blog Post

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

Tool calls:

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

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

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

Example 2: Update the Site Theme

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

Tool calls:

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

  2. update_theme — applies the new palette:

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

    All published pages are automatically regenerated with the new theme.

Example 3: Search and Replace Across the Entire Site

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

Tool calls:

  1. search_replace_preview — shows affected pages without making changes:

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

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

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

Example 4: Create a Custom Template

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

Tool calls:

  1. create_template — defines the structure and HTML layout:

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

    The template is immediately available for creating content.

Example 5: Upload an Image and Use It in Content

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

Tool calls:

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

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

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

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

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

Example 6: Set Up URL Redirects

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

Tool calls:

  1. create_redirect — creates a permanent redirect:

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

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

Example 7: Content Versioning and Rollback

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

Tool calls:

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

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

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

Example 8: Organize Content with Folders

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

Tool calls:

  1. create_folder — creates the URL path segment:

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

  3. update_content — moves it into the new folder:

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

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

Example 9: Build a Content Collection (Blog Index)

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

Tool calls:

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

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

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

Example 10: Build a Dynamic Tagged Index Page

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

Tool calls:

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

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

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

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

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

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

Example 11: Full-Text Search and Content Audit

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

Tool calls:

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

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

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

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

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

Example 12: Bulk Content Migration

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

Tool calls:

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

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

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

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

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

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

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

Example 13: Fork-Based Staged Redesign

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

Tool calls:

  1. create_fork — creates a named staging workspace:

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

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

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

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

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

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

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

    { "fork_id": "fork_abc123" }

    Returns a summary of merged pages and any conflicts detected.

Example 14: Site-Wide Notice with Auto-Republish

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

Tool calls:

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

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

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

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

Working with Snippets

# List all snippets
list_snippets

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

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

Content Tagging & Index Pages

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

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

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

Bulk Operations

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

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

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

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

Regex Search & Replace

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

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

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

Content Versioning

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

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

Development

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

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

# Run the server
./bin/lightcms-server

Security Notes

For production:

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

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

  3. Change the default admin password immediately after first login

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

  5. Restrict MongoDB Atlas IP whitelist to your server IPs

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

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

  8. Regularly backup your MongoDB database

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

Security features built in:

  • CSRF protection on all /cm routes

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

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

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

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

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

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

  • Passwords: bcrypt with cost=12

  • Audit logging on all mutations with 365-day retention

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

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

Privacy Policy

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

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

License

MIT

Available Tools

72 tools
archive_forkArchive ForkA
Idempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
fork_idYesFork workspace ID to archive,required

TDQS

A4.2/5.0
Behavior4/5

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

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

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

Conciseness5/5

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

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

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

Completeness4/5

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

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

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

Parameters3/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines4/5

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

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

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

bulk_field_operationBulk Field OperationA
Destructive

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

Operations:

  • clear: set field to empty string

  • set: replace field value with a fixed string

  • prepend: add text before existing field value

  • append: add text after existing field value

  • wrap: surround existing value with before/after strings

Use scope filters to limit which pages are affected (content_ids, folder_path, template_name, category). Set dry_run: true to preview which pages would be changed without saving.

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

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

TDQS

A4.4/5.0
Behavior4/5

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

Annotations indicate destructiveHint=true; the description complements this by detailing the five mutation operations (clear, set, prepend, append, wrap) and their exact behavior, plus explaining dry_run safety mechanics. Adds substantial behavioral context beyond the annotation flags.

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

Conciseness5/5

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

Excellent structure: one-line summary, bulleted operation definitions, scope filter guidance, dry_run note, and concrete example. Information is front-loaded and every sentence/section serves a distinct purpose with no redundancy.

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

Completeness4/5

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

Comprehensive coverage for an 11-parameter destructive tool: documents all operations, filtering strategies, and safety mechanisms. Missing return value description, but acceptable given no output schema per rubric guidelines.

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

Parameters4/5

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

Schema coverage is 100%, but description adds crucial semantic value by enumerating operation variants (clear vs set vs wrap) and mapping scope filter concepts to specific parameters. The JSON example demonstrates parameter relationships (operation + field + value + template_name).

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

Purpose5/5

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

Description clearly states the tool applies a 'single field operation' to 'all matching content pages' using specific verbs (apply, set, prepend, append). The 'field' specificity distinguishes it from sibling 'bulk_update_content' which likely handles full content updates.

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

Usage Guidelines4/5

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

Provides explicit guidance on using scope filters (content_ids, folder_path, etc.) to limit affected pages and emphasizes dry_run for previewing changes. While it doesn't explicitly name sibling alternatives, the 'single field' framing implies use for targeted field edits versus broader bulk updates.

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

bulk_update_contentBulk Update ContentA
Destructive

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

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

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

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

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

TDQS

A4.7/5.0
Behavior4/5

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

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

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

Conciseness5/5

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

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

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

Completeness5/5

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

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

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

Parameters4/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines5/5

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

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

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

create_collectionCreate CollectionB

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

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

TDQS

B3.3/5.0
Behavior3/5

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

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

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

Conciseness5/5

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

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

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

Completeness3/5

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

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

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

Parameters3/5

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

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

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

Purpose4/5

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

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

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

Usage Guidelines2/5

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

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

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

create_contentCreate ContentA

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

Workflow:

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

  2. Create the content with data matching those fields.

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

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

Content data fields support rich markup features:

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

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

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoContent category for collections
dataYesTemplate field values,required
folder_pathNoFolder path (e.g., /blog)
meta_descriptionNoSEO meta description
og_imageNoOpen Graph image URL
publishedNoPublish immediately
raw_modeNoUse raw HTML mode
slugYesURL slug for the content,required
tagsNoTags for lc:query index pages (e.g. ['AI & Machine Intelligence', 'Generative AI'])
template_idYesTemplate ID (MongoDB ObjectID),required
titleYesContent title,required
use_footerNoInclude site footer
use_headerNoInclude site header
use_themeNoApply site theme/layout
version_commentNoOptional comment describing this version

TDQS

A4.7/5.0
Behavior5/5

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

While annotations only indicate non-destructive behavior, the description extensively documents behavioral traits: wikilinks auto-update when paths change, Markdown converts to HTML at publish time, templates support {{.lc_toc}} injection, hashtags auto-tag pages, and version_comment affects history readability. This exceeds annotation coverage significantly.

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

Conciseness4/5

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

Well-structured with clear visual hierarchy: one-sentence summary, numbered workflow, specific parameter guidance, and rich markup documentation. While lengthy (appropriate for 15 parameters and complex templating behavior), every section serves distinct purposes without redundancy.

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

Completeness4/5

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

Given the complexity (15 parameters, nested data object, rich markup features), the description comprehensively covers input requirements, workflow dependencies, and content processing behaviors. No output schema exists per context signals; the description appropriately focuses on creation mechanics rather than return values.

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

Parameters4/5

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

With 100% schema coverage, baseline is 3. The description adds valuable context: template_id requires calling list_templates first, use_header/footer/theme control site layout wrapping, published=true combines creation with publishing, and version_comment is required for readable history. This elevates it above baseline.

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

Purpose5/5

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

The description opens with a clear, specific statement ('Create a new content item') and immediately distinguishes this from sibling tools by specifying required fields (template_id, title, slug, data) and contrasting with create_template, create_snippet, and create_collection.

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

Usage Guidelines5/5

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

Provides an explicit numbered workflow (1. Call list_templates, 2. Create content, 3. Call publish_content) that establishes prerequisites and sequence. It explicitly names sibling tool publish_content as an alternative to using the published parameter, clarifying when to use each approach.

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

create_folderCreate FolderB

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

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

TDQS

B3.3/5.0
Behavior3/5

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

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

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

Conciseness5/5

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

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

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

Completeness3/5

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

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

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

Parameters3/5

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

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

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

Purpose4/5

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

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

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

Usage Guidelines2/5

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

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

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

create_forkCreate ForkA

Create a new named fork workspace for staging content changes.

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

Typical workflow:

  1. create_fork — create the workspace

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

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

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

Returns the fork ID needed for subsequent fork operations.

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

TDQS

A4.5/5.0
Behavior4/5

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

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

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

Conciseness5/5

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

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

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

Completeness5/5

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

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

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

Parameters3/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines5/5

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

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

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

create_redirectCreate RedirectA

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

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

TDQS

A3.6/5.0
Behavior3/5

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

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

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

Conciseness5/5

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

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

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

Completeness4/5

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

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

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

Parameters3/5

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

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

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

Purpose4/5

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

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

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

Usage Guidelines3/5

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

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

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

create_snippetA

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

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

TDQS

A4.2/5.0
Behavior4/5

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

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

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

Conciseness5/5

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

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

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

Completeness4/5

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

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

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

Parameters3/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines4/5

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

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

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

create_templateCreate TemplateB

Create a new template. Define fields with name, label, type (text, textarea, richtext, date, image, select), and options.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoTemplate category for grouping
descriptionNoTemplate description
fieldsYesTemplate fields definition,required
html_layoutYesHTML layout with {{.FieldName}} placeholders,required
nameYesTemplate name,required
slugYesTemplate slug for URLs,required

TDQS

B3.3/5.0
Behavior3/5

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

Annotations declare destructiveHint=false (safe operation). Description adds context about field definition structure but fails to disclose validation behavior (e.g., conflict handling for duplicate slugs), return value structure, or relationship between fields and html_layout placeholders.

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

Conciseness4/5

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

Two efficient sentences with no redundancy. Second sentence is dense but information-rich. Could benefit from separating field type enumeration from field structure explanation for clarity.

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

Completeness3/5

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

With 100% schema coverage and 6 parameters including complex nested structures, the description adequately covers the fields parameter. Missing: explanation of how html_layout references fields via {{.FieldName}}, success indicators, and error conditions.

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

Parameters4/5

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

Schema has 100% coverage establishing baseline of 3. Description adds significant value by enumerating valid type values (text, textarea, richtext, date, image, select) not constrained in schema, and clarifies the fields array structure implicitly.

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

Purpose4/5

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

States specific verb 'Create' and resource 'template'. Lists specific field types (text, textarea, richtext, date, image, select) which helps distinguish from sibling creation tools like create_content or create_collection. However, lacks explicit differentiation from update_template.

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

Usage Guidelines2/5

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

Provides no guidance on when to use this versus update_template, no prerequisites mentioned (e.g., slug uniqueness requirements), and no workflow context. The agent must infer usage solely from the name.

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

delete_assetDelete AssetA
DestructiveIdempotent

Delete an asset from the library. Removes both the file and database record.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAsset ID (MongoDB ObjectID),required

TDQS

A3.7/5.0
Behavior4/5

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

While annotations declare destructiveHint=true, the description adds valuable scope context: 'Removes both the file and database record' clarifies this affects both filesystem and database layers. Does not mention idempotency behavior (covered by annotation) or error conditions (e.g., non-existent ID), but adds concrete destruction scope.

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

Conciseness5/5

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

Optimal two-sentence structure. First sentence delivers core action immediately. Second sentence adds necessary scope clarification without redundancy. Zero padding or generic filler. Front-loaded with critical information.

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

Completeness3/5

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

Adequate for a single-parameter delete operation: annotations cover safety profile (destructive, idempotent), description covers deletion scope. However, lacks mention of error behaviors (404 if ID missing?), return values, or prerequisites (permissions, asset state constraints).

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

Parameters3/5

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

Schema coverage is 100% with the ID parameter fully documented as 'Asset ID (MongoDB ObjectID)'. Description provides no additional parameter semantics, but with complete schema coverage, the baseline score of 3 is appropriate—no compensation needed.

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

Purpose5/5

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

Excellent specificity: verb 'Delete' + resource 'asset' + location 'library'. Second sentence clarifies scope (file + database record), distinguishing from logical deletes or metadata-only removals. Clear differentiation from siblings like delete_content, delete_folder, etc. by specifying 'asset'.

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

Usage Guidelines2/5

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

No explicit guidance on when to use versus alternatives (e.g., no mention of archive_asset if it existed, or bulk operations), no prerequisites stated (e.g., checking if asset is in use), and no 'when-not-to-use' guidance. Only implicit use case from the verb itself.

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

delete_collectionDelete CollectionA
DestructiveIdempotent

Delete a collection. This does not delete the content in the collection.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCollection ID (MongoDB ObjectID),required

TDQS

A3.8/5.0
Behavior4/5

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

Annotations declare destructiveHint=true, but the description adds crucial behavioral context: the deletion is container-only and preserves content. This prevents the safety assumption that 'destructive' applies to nested content. No contradictions with annotations.

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

Conciseness5/5

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

Two sentences with zero waste. First establishes the action, second clarifies scope/safety. Perfectly front-loaded and appropriate length for the tool complexity.

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

Completeness4/5

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

Sufficient for a single-parameter destructive operation. Critical safety information (content preservation) is covered. Could optionally clarify what happens to orphaned content, but adequate given annotations cover idempotency and destructiveness.

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

Parameters3/5

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

Schema has 100% description coverage ('Collection ID (MongoDB ObjectID),required'), so baseline applies. Description adds no parameter-specific semantics, but the schema handles this adequately.

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

Purpose4/5

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

Clear verb (Delete) and resource (collection). The second sentence ('This does not delete the content...') begins to distinguish from siblings by clarifying scope, though it could more explicitly differentiate from delete_content or delete_folder.

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

Usage Guidelines3/5

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

Provides implicit guidance through the negative constraint about content preservation, helping prevent misuse. However, lacks explicit 'when to use' guidance or comparison to alternatives like archive_fork or bulk operations.

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

delete_contentDelete ContentA
DestructiveIdempotent

Soft-delete a content item. The content can be restored later. Removes the static HTML page.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContent ID (MongoDB ObjectID),required

TDQS

A4/5.0
Behavior4/5

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

Adds significant value beyond annotations: clarifies 'soft-delete' semantics (recoverable destruction), states the specific side effect of 'Removes the static HTML page,' and confirms idempotency through the restoration capability. No contradictions with destructiveHint=true or idempotentHint=true.

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

Conciseness5/5

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

Three sentences, all essential: defines operation, states recoverability (critical for soft-delete), and specifies side effect. No redundant or wasted words. Information is front-loaded with the core action.

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

Completeness4/5

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

Comprehensive for a deletion tool: covers soft-delete semantics, recovery path, and specific side effects (HTML removal). Annotations provide safety hints (destructive, idempotent). No output schema present but unnecessary for this operation type given idempotency disclosure.

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

Parameters3/5

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

With 100% schema description coverage for the single 'id' parameter, the schema fully carries the parameter semantics load. Description adds no parameter-specific details, which is appropriate given the high schema coverage baseline.

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

Purpose5/5

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

States specific action 'Soft-delete' targeting a 'content item' and distinguishes from hard-delete siblings by noting it 'can be restored later.' Also differentiates from other delete_* tools (delete_asset, delete_folder, etc.) by specifying the content resource type.

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

Usage Guidelines3/5

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

Implies reversibility ('can be restored later') which hints at the restore_content sibling tool, but lacks explicit when-to-use guidance or comparisons against alternatives like archive_fork. Provides minimum viable context for agent selection.

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

delete_folderDelete FolderA
DestructiveIdempotent

Delete an empty folder. Cannot delete folders that contain content or subfolders.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFolder ID (MongoDB ObjectID),required

TDQS

A4/5.0
Behavior4/5

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

Annotations declare destructiveHint=true and idempotentHint=true. The description adds crucial behavioral context: the empty-folder constraint (precondition) and implied failure mode for non-empty targets, which annotations do not cover.

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

Conciseness5/5

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

Two sentences with zero waste: first states the operation, second states the critical constraint. Front-loaded and appropriately sized for the tool's complexity.

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

Completeness4/5

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

Adequate for a simple single-param destructive tool. Annotations cover safety/destructive traits; description covers the primary business logic constraint (empty-only). No output schema exists to document.

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

Parameters3/5

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

Input schema has 100% description coverage for the single 'id' parameter. The description does not reference parameters, but the schema is self-documenting, meeting the baseline score for high-coverage schemas.

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

Purpose4/5

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

Specific verb (Delete) + resource (folder) with clear scope constraint (empty only). The empty-folder restriction distinguishes it from broader delete operations like delete_content or delete_collection, though it doesn't explicitly name sibling alternatives.

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

Usage Guidelines4/5

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

Provides explicit 'when' (empty folder) and 'when-not' (contains content/subfolders) guidance. Missing specific alternative tool recommendations for handling non-empty folders, but the constraint is clearly actionable.

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

delete_forkDelete ForkA
Destructive

Permanently delete a fork and all its pages. Cannot delete a merged fork. Requires admin role.

ParametersJSON Schema
NameRequiredDescriptionDefault
fork_idYesFork workspace ID to permanently delete,required

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the destructiveHint annotation, description adds critical context: cascade scope ('all its pages'), business logic constraint ('Cannot delete a merged fork'), and authorization requirement ('Requires admin role'). These are substantial behavioral additions.

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

Conciseness5/5

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

Three sentences, zero waste. Front-loaded with the action ('Permanently delete'), followed by constraints and requirements. Each sentence conveys distinct essential information.

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

Completeness4/5

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

Comprehensive for a single-parameter destructive operation. Covers action, scope, constraints, and permissions. No output schema exists, so return value explanation isn't expected. Could optionally mention if operation is synchronous or idempotent.

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

Parameters3/5

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

Schema coverage is 100%, with the fork_id parameter fully documented in the schema. Description doesn't add syntax, format, or examples beyond the schema, which is acceptable given the high coverage baseline.

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

Purpose5/5

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

Specific verb 'delete' with resource 'fork' and scope 'all its pages'. Explicitly distinguishes from sibling archive_fork by emphasizing permanence, and from merge_fork via the 'merged fork' constraint. Absolutely clear what the tool does.

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

Usage Guidelines4/5

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

Provides clear exclusion criteria ('Cannot delete a merged fork') and prerequisite ('Requires admin role'). Tells the agent when NOT to use it, though could explicitly name archive_fork as the alternative for non-destructive removal.

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

delete_redirectDelete RedirectC
DestructiveIdempotent

Delete a redirect.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRedirect ID (MongoDB ObjectID),required

TDQS

C2.4/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, establishing this is a destructive, repeatable operation. The description adds no additional behavioral context such as whether deletion is permanent, if there are cascading effects on linked content, or recovery options. It does not contradict the annotations.

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

Conciseness3/5

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

While extremely brief and front-loaded, the three-word description is so minimal it constitutes under-specification rather than efficient conciseness. It wastes no words, but also provides no informational value beyond the tool name itself.

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

Completeness3/5

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

Given the simplicity (single ID parameter), strong annotations, and complete schema coverage, the description is minimally sufficient for an agent to identify the tool's scope. However, it fails to enrich the structured data with any additional context about redirects or deletion behavior.

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

Parameters3/5

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

With 100% schema description coverage, the parameter 'id' is already well-documented in the schema as 'Redirect ID (MongoDB ObjectID),required'. The description adds no parameter-specific guidance, syntax details, or examples, warranting the baseline score for complete schema coverage.

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

Purpose2/5

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

The description 'Delete a redirect' is a tautology that restates the tool name/title with only slight modification (adding an article). While it identifies the resource type (redirect), it fails to distinguish this tool from sibling deletion tools like delete_content or delete_asset beyond what is already implied by the tool name.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives such as update_redirect (for modifying vs. removing) or create_redirect. There are no prerequisites, conditions, or exclusion criteria mentioned.

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

delete_snippetC
Destructive

Delete a snippet by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSnippet ID (MongoDB ObjectID),required

TDQS

C2.9/5.0
Behavior2/5

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

While the destructiveHint annotation confirms this is destructive, the description adds no behavioral context about what happens to content referencing the deleted snippet, whether this is a hard delete or soft delete, or error conditions if the ID is not found.

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

Conciseness4/5

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

The four-word description is efficiently front-loaded with no redundant information. However, extreme brevity for a destructive operation leaves it under-specified for the risk level involved.

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

Completeness3/5

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

Given the simple single-parameter input and lack of output schema, the description minimally covers the operation but omits critical context for a destructive tool: cascading effects, restore possibilities, and return status expectations.

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

Parameters3/5

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

With 100% schema coverage describing the MongoDB ObjectID requirement, the description meets the baseline. It mentions 'by ID' which aligns with the schema but adds no additional semantic context about ID format constraints or validation beyond the schema definition.

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

Purpose4/5

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

The description clearly states the verb (Delete) and resource (snippet), distinguishing it from sibling delete operations on assets, collections, or folders. However, it lacks explicit scoping details that would elevate it to a 5, such as clarifying this is for permanent single-item removal versus archiving.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like bulk_field_operation, nor does it mention prerequisites (e.g., whether the snippet must be unreferenced first) or irreversibility warnings beyond the annotation.

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

delete_templateDelete TemplateA
DestructiveIdempotent

Delete a template. Cannot delete system templates or templates that have content using them.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTemplate ID (MongoDB ObjectID),required

TDQS

A4/5.0
Behavior4/5

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

Annotations cover destructiveness and idempotency. The description adds valuable behavioral context: validation rules preventing deletion of system templates and templates with dependencies. This explains failure modes not captured in annotations.

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

Conciseness5/5

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

Two sentences, zero waste. Front-loaded with the action ('Delete a template'), followed immediately by critical constraints. Every word earns its place.

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

Completeness4/5

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

Appropriate for a single-parameter deletion tool. Captures the essential constraint logic (system/dependency blocks). Lacks mention of return values, but destructiveness and idempotency hints reduce ambiguity for a delete operation without output schema.

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

Parameters3/5

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

Schema has 100% coverage with clear ID description ('Template ID (MongoDB ObjectID)'). The description references 'a template' implying identification is needed but does not augment the parameter documentation beyond the schema.

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

Purpose4/5

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

Clear verb ('Delete') and resource ('template'). The scope is implicit given the tool name and sibling tools (delete_content, delete_folder, etc.), though it could explicitly specify 'content template' to distinguish from potential email/code templates.

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

Usage Guidelines4/5

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

Strong explicit constraints: 'Cannot delete system templates or templates that have content using them.' This clearly identifies when the operation will fail. Lacks explicit alternatives (e.g., 'use archive instead'), but the constraints provide critical usage guardrails.

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

export_contentExport ContentA
Read-only

Export content items with their full field data as a structured JSON array.

Use for batch transformations: export → transform externally → re-import via bulk_update_content.

Scope filters (all optional):

  • template_name: most useful for bulk workflows, e.g. "Concept Page" or "Blog Post"

  • category, folder_path, content_ids: narrower scoping options

Use fields: ["field1", "field2"] to include only specific data fields instead of all fields.

Returns: total count and array of items with id, title, slug, full_path, template_name, published, and data.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoFilter by category
content_idsNoExport only these specific IDs
fieldsNoOnly include these field names (empty = all fields)
folder_pathNoFilter by folder path prefix
template_nameNoFilter by template name

TDQS

A4.7/5.0
Behavior4/5

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

Annotations confirm readOnlyHint=true (safe read operation). Description adds valuable behavioral context: details return structure ('total count and array of items with id, title...') since no output schema exists, and documents that all scope filters are optional. No contradictions with annotations.

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

Conciseness5/5

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

Perfectly structured with clear information hierarchy: purpose → workflow → filter semantics → field selection → returns. No filler text. Each sentence adds distinct value (workflow guidance, filter categorization, return documentation).

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

Completeness5/5

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

Fully compensates for missing output schema by documenting return fields (id, title, slug, etc.). Explains all 5 optional parameters with usage contexts. Complete guidance for batch operations without external documentation needed.

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

Parameters4/5

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

Schema has 100% coverage (baseline 3). Description adds significant semantic value beyond schema: explains template_name is 'most useful for bulk workflows' with concrete examples ('Concept Page', 'Blog Post'), classifies other filters as 'narrower scoping options', and clarifies fields parameter behavior ('empty = all fields').

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

Purpose5/5

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

Excellent specificity: states exact action ('Export'), resource ('content items'), format ('structured JSON array'), and distinguishes from siblings by referencing 'bulk_update_content' as the complementary re-import tool. Clear scope distinction from simple list operations.

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

Usage Guidelines5/5

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

Explicit workflow pattern documented: 'export → transform externally → re-import via bulk_update_content'. Names the specific sibling alternative (bulk_update_content) and explains filter selection logic ('template_name: most useful for bulk workflows' vs 'narrower scoping options').

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

fork_pageFork PageA
Idempotent

Copy a live page into a fork workspace so you can edit it without affecting the public site.

Provide either:

  • path: the URL path of the page (e.g. "/about", "/blog/my-post") — preferred when you know the URL

  • content_id: the MongoDB ObjectID of the content item

Returns the fork page ID. Use this ID with update_content to make edits:

  1. fork_page → get fork_page_id

  2. update_content with id=fork_page_id to edit

  3. get_content with id=fork_page_id to verify

  4. merge_fork when all edits are ready (admin only)

If the page is already in this fork, returns the existing fork copy.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_idNoID of the live content item to fork into this workspace
fork_idYesFork workspace ID,required
pathNoURL path of the live page to fork (e.g. /about). Use instead of content_id when you know the path.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations provide idempotentHint:true and destructiveHint:false. Description adds valuable behavioral context: confirms idempotency with 'If the page is already in this fork, returns the existing fork copy', mentions output 'Returns the fork page ID', and notes admin requirements for the merge step. Does not contradict annotations.

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

Conciseness5/5

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

Front-loaded with purpose in first sentence. Efficiently structured with bullet points for parameter options and numbered list for workflow. Every sentence earns its place: purpose, input options, output/workflow, and idempotency edge case. No waste.

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

Completeness5/5

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

No output schema exists, but description documents return value (fork page ID) and complete lifecycle workflow including verification step. Covers edge case (already forked) and authorization note. Adequate for a complex CMS fork operation with 3 input parameters.

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

Parameters4/5

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

Schema has 100% coverage (baseline 3). Description adds selection guidance distinguishing path ('preferred when you know the URL') from content_id, and documents their mutual exclusivity via 'Provide either'. Adds semantic value beyond raw schema descriptions.

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

Purpose5/5

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

Opens with specific action 'Copy a live page into a fork workspace' plus clear benefit 'edit without affecting the public site'. Distinguishes from siblings like create_content (creates new) vs. forking existing, and explicitly references the workflow endpoint merge_fork.

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

Usage Guidelines5/5

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

Provides explicit 4-step workflow (fork_page→update_content→get_content→merge_fork) with tool names. Explains parameter selection logic ('preferred when you know the URL'). Notes authorization constraint 'admin only' for merge step. Handles idempotency case.

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

get_assetGet AssetA
Read-only

Get asset metadata by ID or path. Does not return file content (use the serve path to access the file).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoAsset ID (MongoDB ObjectID)
pathNoAsset serve path (e.g., /images/logo.png)

TDQS

A4.3/5.0
Behavior4/5

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

While annotations declare readOnlyHint=true indicating a safe operation, the description adds essential behavioral context by clarifying that 'get' retrieves metadata only, not binary file content. This manages expectations about the return payload that annotations alone don't convey.

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

Conciseness5/5

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

Two sentences, optimally structured: first establishes purpose and parameters, second provides critical behavioral constraint. Zero redundancy; every word earns its place.

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

Completeness5/5

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

For a simple retrieval tool with fully documented parameters and read-only annotations, the description is complete. It compensates for missing output schema by clarifying what is returned (metadata) and what isn't (file content).

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

Parameters3/5

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

With 100% schema description coverage (id and path fully documented), the schema carries the primary load. The description adds value by confirming these are alternative identifiers ('ID or path'), implying mutually exclusive usage, but does not elaborate on parameter formats beyond the schema.

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

Purpose5/5

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

The description clearly states the specific action ('Get'), resource ('asset metadata'), and identifiers ('by ID or path'). It further distinguishes itself from assumed file retrieval by explicitly stating it 'Does not return file content', which differentiates it from potential file-serving siblings.

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

Usage Guidelines4/5

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

The description provides clear guidance on limitations ('Does not return file content') and points toward the correct alternative method ('use the serve path to access the file'). However, it lacks explicit guidance on when to use this vs list_assets or other sibling tools.

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

get_collectionGet CollectionB
Read-only

Get a collection by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCollection ID (MongoDB ObjectID),required

TDQS

B3.2/5.0
Behavior3/5

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

The annotations declare readOnlyHint=true and openWorldHint=false, which cover the safety profile. The description adds no additional behavioral context (e.g., error handling when ID not found, what fields a collection contains, or caching behavior), but it does not contradict the annotations either.

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

Conciseness4/5

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

The description is extremely brief and front-loaded with the action. While it avoids waste, it borders on under-specification. However, for a simple read operation with comprehensive schema documentation, this length is appropriate and every word serves a purpose.

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

Completeness3/5

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

Given the simple single-parameter input, high schema coverage, and presence of read-only annotations, the description meets minimum viability. However, with no output schema provided, the description could improve completeness by briefly characterizing what a 'collection' represents in this domain or what the return structure contains.

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

Parameters3/5

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

With 100% schema coverage, the input schema already fully documents the 'id' parameter as a MongoDB ObjectID. The description mentions 'by ID' which aligns with the parameter name, but adds no semantic information beyond what the schema already provides, warranting the baseline score.

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

Purpose4/5

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

The description uses a specific verb ('Get') and resource ('collection'), and specifies the lookup method ('by ID'). This implicitly distinguishes it from list_collections (which returns multiple), though it could explicitly clarify that this retrieves a single item versus the list alternative.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. Given the presence of list_collections, create_collection, and update_collection siblings, the description should explicitly state when to prefer this single-item retrieval over listing or creation workflows.

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

get_contentGet ContentA
Read-only

Get a single content item by ID or path. Returns full content including all field data (title, slug, full_path, data fields, published state).

Prefer path when you know the URL: {"path": "/about"} Use id when you have the MongoDB ObjectID: {"id": "abc123"}

Set include_rendered=true to also receive the fully rendered HTML output (template + theme header/footer applied). Useful for verifying what visitors see without publishing.

Tip: to preview unsaved edits before publishing, use preview_content instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoContent ID (MongoDB ObjectID)
include_renderedNoIf true, include the fully rendered HTML output in the response
pathNoContent path (e.g., /about or /blog/my-post)

TDQS

A4.8/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, so the description appropriately focuses on output behavior rather than safety. It adds valuable context about what 'rendered' means (template + theme header/footer) and clarifies the difference between published content and preview states, though it could mention caching or error behaviors.

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

Conciseness5/5

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

Four tightly structured sentences that front-load the core purpose, followed by specific parameter guidance, optional flag explanation, and cross-reference. Every clause earns its place without redundancy.

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

Completeness5/5

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

With no output schema provided, the description comprehensively compensates by detailing exactly what fields are returned (title, slug, data fields, published state) and the optional rendered HTML output. It addresses the key sibling relationship with preview_content, leaving no critical gaps for a read operation.

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

Parameters5/5

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

Despite 100% schema coverage, the description adds substantial value with concrete JSON syntax examples ({'path': '/about'}), semantic usage guidance distinguishing URL vs ObjectID scenarios, and detailed explanation of the rendered output behavior beyond the boolean flag description.

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

Purpose5/5

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

Description clearly states the specific action (get), resource (single content item), and identification methods (ID or path). It distinguishes from sibling tools by explicitly mentioning 'preview_content' as an alternative for unsaved edits and implies singularity versus 'list_content'.

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

Usage Guidelines5/5

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

Provides explicit guidance on when to use each identifier ('Prefer path when you know the URL', 'Use id when you have the MongoDB ObjectID'). It explicitly states when NOT to use this tool ('use preview_content instead' for unsaved edits), giving clear alternatives.

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

get_content_versionGet Content VersionB
Read-only

Get a specific version of a content item with full field data.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_idYesContent ID (MongoDB ObjectID),required
versionYesVersion number,required

TDQS

B3.3/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true, so the description doesn't need to state safety. It adds 'with full field data' which provides useful context about the response payload richness, but doesn't describe error behavior (e.g., invalid version numbers) or versioning semantics.

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

Conciseness5/5

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

Single sentence with zero waste. 'Get', 'specific version', 'content item', and 'full field data' each provide distinct semantic value. Front-loaded with the action verb.

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

Completeness3/5

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

For a simple 2-parameter read operation with complete annotations and full schema coverage, the description covers the essential function. However, it lacks versioning workflow context (how version numbers relate to 'get_content_versions') and error scenarios, which would help an agent use this effectively in a sequence.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents both parameters (MongoDB ObjectID and version number). The description implies these concepts but doesn't add syntax details, format constraints, or examples beyond the schema.

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

Purpose4/5

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

Clear verb 'Get' and resource 'specific version of a content item'. The phrase 'specific version' effectively distinguishes this from sibling 'get_content_versions' (plural). However, it doesn't clarify the difference versus 'get_content' (current version) or 'revert_to_version'.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus 'get_content' (current state) or 'get_content_versions' (list all versions). No mention that one might need to call 'get_content_versions' first to discover valid version numbers.

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

get_content_versionsGet Content VersionsB
Read-only

Get the version history for a content item. Returns list of versions with timestamps.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_idYesContent ID (MongoDB ObjectID),required

TDQS

B3.4/5.0
Behavior3/5

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

Annotations establish readOnlyHint=true, so safety is covered. The description adds value by disclosing the return structure ("list of versions with timestamps"), which compensates partially for the missing output schema. However, it omits behavioral details like ordering, pagination, or whether deleted versions are included.

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

Conciseness5/5

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

Extremely efficient at two sentences: first establishes purpose, second establishes return format. No redundant information or filler.

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

Completeness4/5

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

For a simple read-only tool with one well-documented parameter and safety annotations, the description is appropriately complete. The mention of return structure compensates for the lack of output schema, though ordering or pagination details would improve it further.

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

Parameters3/5

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

With 100% schema description coverage for the single content_id parameter, the schema carries the full burden. The description mentions no parameters, so it neither adds nor subtracts meaning, meeting the baseline of 3.

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

Purpose4/5

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

The description uses specific verbs ("Get") and resources ("version history") and implies bulk retrieval via "list of versions," distinguishing it from sibling get_content_version (singular). However, it does not explicitly clarify when to use this versus the singular version retrieval tool.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives like get_content (current state) or get_content_version (specific version). No mention of prerequisites or error conditions.

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

get_folderGet FolderC
Read-only

Get a folder by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFolder ID (MongoDB ObjectID),required

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true (safe read operation) and openWorldHint=false. The description adds no behavioral context beyond the basic operation, such as error behavior when the ID is not found, what fields are returned, or whether the operation is cached.

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

Conciseness4/5

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

Extremely efficient at four words. No wasted language. However, the brevity approaches under-specification given the lack of output schema and error behavior context, preventing a perfect score.

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

Completeness3/5

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

Acceptable for a simple retrieval tool with complete schema coverage and safety annotations. However, gaps remain regarding error handling (404 vs null responses) and differentiation from sibling list operations, keeping it at minimum viable rather than exemplary.

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

Parameters3/5

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

With 100% schema coverage, the schema adequately documents the single 'id' parameter as 'Folder ID (MongoDB ObjectID)'. The description references 'ID' but adds no additional semantic value regarding format expectations or validation beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose4/5

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

States specific verb (Get), resource (folder), and identification method (by ID). The 'by ID' phrasing implicitly distinguishes it from sibling list_folders which returns multiples. However, it does not explicitly clarify the single-resource vs collection distinction or mention the MongoDB ObjectID format mentioned in the schema.

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

Usage Guidelines2/5

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

Provides no explicit guidance on when to use this tool versus alternatives like list_folders or search_content. While 'by ID' implies use when the identifier is known, it does not state prerequisites (having the ID) or exclusion criteria (don't use for searching/browsing).

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

get_forkGet ForkA
Read-only

Get details of a fork workspace including its status and list of pages.

Returns: fork metadata + array of pages (id, title, full_path, updated_at). Use the page id with get_content or update_content to read/edit fork pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFork ID (returned by create_fork or list_forks),required

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, confirming this is a safe read operation. The description adds valuable return structure documentation: 'fork metadata + array of pages (id, title, full_path, updated_at)' that is not present in structured fields. This discloses exactly what data structure the agent will receive.

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

Conciseness5/5

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

Three well-structured sentences with zero waste: (1) core purpose, (2) return specification, (3) usage guidance. Front-loaded with the action, includes line breaks for readability, and every sentence earns its place by conveying distinct information not found in other fields.

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

Completeness4/5

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

Despite lacking a formal output schema, the description comprehensively documents the return format and fields. It contextualizes the tool within the broader workflow (referencing get_content/update_content). Minor gap: no mention of error cases (e.g., archived forks) or pagination behavior for forks with many pages.

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

Parameters3/5

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

Schema coverage is 100% with the 'id' parameter fully documented as 'Fork ID (returned by create_fork or list_forks),required'. Since the schema carries the full semantic load, the baseline score of 3 applies. The description text does not add additional parameter constraints, examples, or format details beyond the schema.

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

Purpose5/5

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

Description uses specific verb 'Get' with clear resource 'fork workspace' and scope 'including its status and list of pages'. The singular 'a fork' combined with the ID parameter clearly distinguishes this from list_forks (which returns multiple forks) and from sibling mutation tools like create_fork or merge_fork.

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

Usage Guidelines4/5

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

Provides explicit workflow guidance: 'Use the page id with get_content or update_content to read/edit fork pages.' This helps the agent understand how to use the output and references specific sibling tools. However, it lacks explicit guidance on when to use get_fork vs list_forks (e.g., 'use this when you have a specific Fork ID').

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

get_site_configGet Site ConfigB
Read-only

Get site configuration including title templates.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already indicate read-only/safe behavior via 'readOnlyHint: true'. The description adds content scope ('including title templates') but omits other behavioral details like error conditions, permission requirements, or cache behavior. With annotations covering safety, this is minimally acceptable.

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

Conciseness5/5

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

Single efficient sentence front-loaded with the action verb. 'Including title templates' adds specific value without verbosity. Zero waste.

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

Completeness3/5

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

Adequate for a simple parameter-less getter with annotations present, mentioning one key configuration aspect (title templates). However, lacks return value description or enumeration of other configuration fields available given no output schema exists.

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

Parameters4/5

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

Input schema has zero parameters. Per scoring rules, 0 params equals baseline 4.

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

Purpose4/5

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

Clear verb ('Get') and resource ('site configuration') with specific content detail ('title templates'). However, it does not explicitly distinguish from sibling 'update_site_config' (e.g., by stating this is read-only retrieval vs. modification).

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives, prerequisites, or conditions. The agent must infer usage solely from the action description.

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

get_snippetB
Read-only

Get a snippet by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSnippet ID (MongoDB ObjectID),required

TDQS

B3.2/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true, establishing it as a safe read operation. The description adds the lookup mechanics ('by ID') confirming the schema intent, but provides no additional context on error behaviors (e.g., 404), rate limits, or return structure.

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

Conciseness4/5

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

Extremely brief (4 words) but appropriately sized for a single-parameter getter. The sentence is front-loaded and contains no redundant information, though its terseness borders on tautology with the tool name.

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

Completeness3/5

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

Adequate for a simple read operation with complete schema coverage and safety annotations. However, lacking an output schema, the description omits what fields or structure are returned, which could improve agent debugging.

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

Parameters3/5

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

With 100% schema description coverage, the baseline is 3. The description mentions 'by ID', aligning with the parameter, but adds no syntax details, format examples, or semantic meaning beyond what the schema already provides.

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

Purpose4/5

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

States a specific verb ('Get'), resource ('snippet'), and lookup method ('by ID'). The 'by ID' phrasing implicitly distinguishes this from the sibling 'list_snippets' tool, though it does not explicitly name that alternative.

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

Usage Guidelines2/5

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

Provides no guidance on when to use this tool versus siblings like 'list_snippets' (for browsing) or 'search_content' (for querying). No prerequisites, error handling, or workflow context is mentioned.

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

get_templateGet TemplateA
Read-only

Get a single template by ID or slug. Returns full template including fields and HTML layout.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoTemplate ID (MongoDB ObjectID)
slugNoTemplate slug

TDQS

A4/5.0
Behavior4/5

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

Adds valuable return payload context ('full template including fields and HTML layout') beyond the readOnlyHint annotation. Confirms this retrieves complete object data, not just metadata. No contradictions with annotations.

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

Conciseness5/5

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

Two sentences, zero waste. First sentence defines operation and lookup keys; second sentence describes return payload. Front-loaded with essential information, no redundancy with title or schema.

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

Completeness4/5

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

Appropriate for a simple 2-parameter retrieval tool. Compensates for missing output schema by describing return structure ('fields and HTML layout'). With readOnlyHint annotation present, no need for safety warnings.

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

Parameters3/5

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

With 100% schema coverage, baseline is 3. Description mentions 'ID or slug' which implies alternative identifiers, but doesn't add syntax details, format constraints, or explicit mutual exclusivity guidance beyond what the schema property descriptions already provide.

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

Purpose5/5

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

Clear specific verb ('Get') + resource ('template') + scope ('single' vs sibling 'list_templates'). The ID/slug specification distinguishes from bulk operations and the 'fields and HTML layout' distinguishes from metadata-only retrieval tools.

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

Usage Guidelines3/5

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

Implies usage by mentioning 'by ID or slug' but lacks explicit guidance on when to use this vs 'list_templates' (browse/search vs direct lookup) and doesn't clarify that ID and slug are mutually exclusive lookup methods (both marked optional in schema).

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

get_themeGet ThemeA
Read-only

Get current theme settings including colors, fonts, and custom HTML for header/footer.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations establish readOnlyHint=true; description adds valuable behavioral context by disclosing exactly which theme components are returned (colors, fonts, header/footer HTML), which helps the agent understand the scope and shape of the data without contradicting safety annotations.

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

Conciseness5/5

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

Single efficient sentence front-loaded with the action verb. Every clause earns its place: the main clause establishes the operation, while the prepositional phrase specifies the thematic domains returned. No redundancy or filler.

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

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While lacking an output schema, the description compensates by enumerating the primary return value categories (colors, fonts, HTML). Adequate for a simple read operation, though explicit mention of whether this returns the active/live theme versus pinned version would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters (input schema is empty object), which per guidelines warrants a baseline score of 4. The description appropriately implies no filtering or input is required to retrieve the current theme settings.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Excellent specificity with verb 'Get', resource 'theme settings', and concrete examples of returned data (colors, fonts, custom HTML). The term 'current' implicitly distinguishes this from sibling version-management tools like get_theme_version and update_theme.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no explicit guidance on when to use this versus get_theme_version/get_theme_versions or whether this retrieves the active/pinned version. No prerequisites or exclusions mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_theme_versionGet Theme VersionB
Read-only

Get a specific version of theme settings with full data.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYesVersion number,required

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true. Description adds 'with full data' indicating complete theme configuration is returned, not just metadata. However, missing disclosure of error behavior (e.g., returns 404 if version not found) or whether archived/unpinned versions are accessible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with zero waste. 'specific version' and 'full data' each earn their place by defining scope and completeness. Front-loaded with action and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a simple read operation with one required parameter and readOnly annotations. 'Full data' hints at return value structure given no output schema is defined. However, lacks sibling differentiation and error condition documentation that would justify higher score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter 'version' documented as 'Version number,required'. Description neither adds semantic context (e.g., that version is an integer ID from get_theme_versions) nor repeats schema info. Baseline 3 appropriate when schema carries full descriptive burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses specific verb 'Get' with resource 'theme settings' and scope 'specific version' and 'full data'. Distinguishes from sibling get_theme_versions (list vs specific instance) and get_theme (current vs historical), though could be more explicit about the version-number lookup pattern.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance provided on when to use this versus get_theme (current settings) or get_theme_versions (list available versions first). No mention that the version number must be obtained from get_theme_versions or that invalid versions will error.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_theme_versionsGet Theme VersionsA
Read-only

Get the version history for theme settings. Returns list of versions with timestamps.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, confirming safe read operation. Description adds valuable output context not present in annotations: specifically that it returns a 'list of versions with timestamps', which helps the agent understand the data structure returned despite the lack of output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero waste. Front-loaded with the action verb, followed immediately by return value description. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Appropriately complete for a zero-parameter read-only tool. Compensates for missing output schema by describing the return structure (list with timestamps). Could mention that theme ID is inferred from context or required in environment, but sufficient as-is.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters present, meeting the baseline score of 4. No parameters require semantic explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific action (Get) and resource (version history for theme settings). Implies distinction from sibling 'get_theme_version' (singular) through use of 'history' and 'list', but does not explicitly clarify when to use the plural vs singular variant.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides implied usage through the term 'history' suggesting archival/audit use cases, but lacks explicit when-to-use guidance or prerequisites (e.g., no mention that this is for retrieving version IDs needed by 'revert_theme_to_version').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_asset_foldersList Asset FoldersA
Read-only

List all unique folder paths in the asset library.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare read-only safety (readOnlyHint=true) and closed-world scope (openWorldHint=false). Description adds 'unique' constraint (valuable behavioral detail) and 'asset library' scope, but omits output format, pagination behavior, or empty-result handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with zero waste. Front-loaded action verb, no filler words. Efficiently conveys scope, uniqueness constraint, and domain.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Appropriately complete for a zero-parameter read operation. Describes return concept (folder paths) sufficiently despite missing output schema. No prerequisites or complex behaviors to document.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters present; baseline score 4 applies per rubric. Schema is empty object with 100% coverage. No parameter compensation needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb (List), resource (folder paths), and scope (asset library, unique). Distinguishes from 'list_assets' by specifying 'folder paths' and from 'list_folders' by specifying 'asset library', though lacks explicit sibling differentiation guidance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use or when-not-to-use guidance provided. Does not clarify relationship to sibling 'list_folders' or 'list_assets', leaving ambiguity about which listing tool is appropriate for which use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_assetsList AssetsB
Read-only

List all assets in the asset library. Assets are files like images, documents, CSS, JS, etc.

ParametersJSON Schema
NameRequiredDescriptionDefault
folderNoFilter by folder path (e.g., /images)

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true. The description adds value by specifying the scope ('all assets') and defining asset types, but omits pagination behavior, default limits, or error handling when the folder parameter doesn't exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences with no redundancy. The first establishes the operation; the second clarifies the resource type. Could slightly improve by mentioning the optional folder filter in the main sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a simple read operation with one optional parameter and strong annotations. Missing description of return value structure or pagination behavior, which would be necessary for complete agent understanding given no output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema fully documents the optional folder filter. The description implies filtering is optional by stating 'List all assets,' but adds no semantic details about path formats or wildcard support beyond the schema's example.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and resource ('assets'), and defines what constitutes an asset ('files like images, documents, CSS, JS'), helping distinguish from sibling list_asset_folders. However, it lacks explicit contrast with get_asset (single vs. bulk retrieval).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance provided on when to use this versus get_asset for retrieving a single asset, or whether pagination applies. No mention of performance considerations for large asset libraries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_collectionsList CollectionsA
Read-only

List all content collections. Collections group and display content by category.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only safety (readOnlyHint=true). The description adds semantic context that collections organize content by 'category'. Does not disclose pagination behavior, empty state handling, or auth requirements, but meets the lower bar set by existing annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. Front-loaded with the action (List all content collections), followed by brief domain context. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a zero-parameter read operation with readOnly annotations, but gaps remain: no output schema exists, so description should ideally characterize the returned collection list structure or typical response shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters present per input schema. As per guidelines, 0 parameters earns baseline score of 4. No parameter documentation burden exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific action (List) and resource (all content collections) clearly. Distinguishes from 'get_collection' (singular) by using 'List all' versus 'get', though it could explicitly contrast with the singular fetch sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides domain context explaining what collections are ('group and display content by category'), which implies usage. However, lacks explicit when-to-use guidance versus alternatives like 'get_collection' or when pagination might be relevant.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_contentList ContentA
Read-only

List all content items with optional filters. Returns content metadata including title, path, publish status, and timestamps.

Add include_data: true to get full field data for all items in one call, or include_fields: ["field1", "field2"] to fetch only specific fields — both avoid per-item get_content calls for bulk workflows.

Up to 20 concurrent update_content calls are safe. For larger batches, prefer bulk_update_content (up to 100 items per call).

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoFilter by content category
folder_idNoFilter by folder ID (MongoDB ObjectID)
include_dataNoIf true, include all template field data in results (avoids per-item get_content calls)
include_deletedNoInclude soft-deleted content in results
include_fieldsNoInclude only these specific field names from the data object (more efficient than include_data for large content)

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true; description adds return structure ('metadata including title, path, publish status'), soft-deletion handling ('include_deleted'), and workflow concurrency guidance for subsequent operations. Could clarify pagination behavior but solid coverage otherwise.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three distinct units: purpose/returns (sentence 1), parameter optimization (sentence 2-3), workflow guidance (sentence 4). Zero redundancy; every sentence advances selection or invocation logic.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Compensates well for missing output schema by listing return fields. Covers soft-deletion filtering and bulk workflow integration. Given 5 parameters with full schema coverage, provides sufficient context for correct invocation and result handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage (baseline 3), description adds semantic value explaining the optimization strategy: include_data 'to get full field data... in one call' and include_fields as 'more efficient than include_data', clarifying *why* to use each parameter beyond the schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with specific verb 'List' + resource 'content items' + scope 'with optional filters'. Explicitly distinguishes from sibling get_content by noting it returns 'metadata' vs full field data, and contrasts 'per-item get_content calls' with bulk listing capabilities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names alternatives: 'avoid per-item get_content calls' (select this over get_content for bulk), references bulk_update_content for >20 items vs update_content. Provides clear when-to-use for include_data vs include_fields for 'bulk workflows'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_foldersList FoldersB
Read-only

List all content folders. Folders organize content into URL path segments.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only safety (readOnlyHint: true). Description adds domain context that folders map to URL path segments, which helps understand the data model. However, lacks behavioral details like pagination limits, performance characteristics, or cache behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with zero waste. First declares action, second provides domain context. Appropriately front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Simple tool with no input parameters and safety annotations provided. Description adequately covers the 'what' but lacks return value specification (no output schema exists). Does not mention if results are paginated or ordered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters present, which per scoring rules establishes a baseline of 4. No parameter documentation required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'List' and resource 'content folders'. Explicitly specifies 'content' which distinguishes from sibling tool 'list_asset_folders'. Second sentence explains domain purpose (URL path segments).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus 'get_folder' (which retrieves a specific folder) or versus 'list_asset_folders'. No mention of pagination, filtering, or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_forksList ForksA
Read-only

List all content fork workspaces. Forks let you stage changes to multiple pages as a batch before merging them live.

Each fork shows its status (active/merged/archived), page count, and who created it. Use get_fork to see the specific pages in a fork.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true. Description adds valuable context: explains the fork domain concept (batch staging) and documents return payload contents (status, page count, creator) despite lack of output schema. Does not mention pagination or side effects beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with zero waste: first states action + domain concept, second documents return values, third provides sibling guidance. Information is front-loaded and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, description fully compensates by detailing what fields are returned. With zero parameters and simple listing behavior, the description is complete covering purpose, usage guidance, and return value structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has zero parameters. Per guidelines, 0 params baseline is 4. Description correctly provides no parameter details since none exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb 'List' with resource 'content fork workspaces' and distinguishes scope from sibling get_fork by noting this lists 'all' workspaces while get_fork is for 'specific pages'. It also defines what forks are conceptually (staging changes before merging).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs users to sibling tool get_fork with 'Use get_fork to see the specific pages in a fork', clearly indicating when to use the alternative instead of this listing tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_redirectsList RedirectsA
Read-only

List all URL redirects configured for the site.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and openWorldHint=false. Description adds 'for the site' which reinforces the closed-world scope, but does not disclose pagination limits, default sorting, or the structure of returned redirect objects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single front-loaded sentence with zero redundancy. Every word conveys essential scope (all, configured, site) and action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Appropriately complete for a zero-parameter read-only tool. Description sufficiently covers the operation's intent, though it lacks details about the return structure (absent output schema) which would be necessary for optimal completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool accepts zero parameters. With no parameters to document, this meets the baseline expectation for the dimension.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb (List) and resource (URL redirects) with scope ('all', 'configured for the site'). Distinguishes from sibling create/delete_redirect operations by being a bulk listing operation, though it doesn't explicitly differentiate from other list_* tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use versus alternatives (e.g., when to list vs. create/update redirects) or prerequisites. Does not mention pagination behavior for sites with large numbers of redirects.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_snippetsA
Read-only

List all snippets. Snippets are reusable Go-template HTML fragments used in lc:query index page directives.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true (safe read), but description adds valuable domain context: snippets contain 'Go-template HTML' and are used in 'lc:query index page directives' - behavioral traits not inferable from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste: first states purpose, second defines domain concept. Appropriately front-loaded and sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a zero-parameter read operation given annotations cover safety profile. Could improve by noting pagination behavior or output structure (absent output schema), but adequately covers domain context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters per input schema, triggering baseline score of 4 as per rubric. No parameter documentation burden exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verb 'List' and resource 'snippets', with 'all' implicitly distinguishing from sibling get_snippet. Second sentence defines snippets as 'reusable Go-template HTML fragments', clearly differentiating from templates/assets siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'all' qualifier implies bulk retrieval versus single-item siblings like get_snippet, but lacks explicit when-to-use guidance or named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_templatesList TemplatesB
Read-only

List all available templates. Templates define content structure with fields and HTML layout.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, confirming the safe read nature. The description adds minimal behavioral context: 'all available' implies broad scope without filtering, and the definitional sentence clarifies what templates contain (fields/HTML). However, it lacks details on pagination, response format, or empty result handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences. The first sentence is front-loaded with the core action. The second sentence provides domain context about template structure, which earns its place by helping distinguish templates from similar resources like snippets or assets, though it shifts slightly from describing the tool to describing the resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (no parameters, read-only) and lack of output schema, the description is minimally adequate. However, it should ideally hint at the return value structure (e.g., 'returns array of template metadata') to compensate for the missing output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema contains zero parameters (empty object with additionalProperties:false). Per evaluation guidelines, zero parameters establishes a baseline score of 4, as there are no parameter semantics to elaborate upon.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List') and resource ('templates') in the first sentence. The scope 'all available' implicitly distinguishes from sibling 'get_template' (single item retrieval), though it does not explicitly name that alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no guidance on when to use this tool versus alternatives like 'get_template' (for single template details) or 'create_template'. The second sentence defines what templates are conceptually, not when to invoke the listing operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

merge_forkMerge ForkA
Destructive

Merge all pages in a fork workspace into live content. Requires admin role.

For each page in the fork:

  • If a matching live page exists (same URL): updates it with the fork content (fork wins). If the live page was edited after the fork was created, records a conflict but still merges.

  • If no live page exists at that URL: creates a new live page.

After merging, the fork status changes to "merged". Published live pages are regenerated immediately.

Returns: updated count, created count, any conflicts detected.

ALWAYS confirm with the user before merging, as this pushes changes to the live site.

ParametersJSON Schema
NameRequiredDescriptionDefault
fork_idYesFork workspace ID to merge into live,required

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far exceeds the destructiveHint=true annotation by detailing exact merge semantics (updates existing, creates new, conflict recording), side effects (fork status becomes 'merged', immediate regeneration), and return values (updated count, created count, conflicts). Discloses auth requirements ('admin role') not 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with bullet points clarifying merge logic per page state. The ALL-CAPS warning appropriately emphasizes safety for a destructive operation. Slightly verbose for a single-parameter tool, but warranted given operation complexity and destructive nature.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive for a complex mutation: covers prerequisites (admin), detailed behavior (update vs create logic, conflict handling), side effects (status change, regeneration), return structure (counts/conflicts), and safety warnings. No output schema exists, but description adequately documents returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for single parameter fork_id. Description references 'fork workspace' contextually but adds no syntax, format, or constraint details beyond the schema. Baseline 3 appropriate when schema carries full documentation load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with specific verb 'Merge' + resource 'pages in a fork workspace' + target 'live content'. Clearly distinguishes from siblings (create_fork, delete_fork, archive_fork, fork_page) by explaining the specific merge strategy (fork wins, conflict handling) rather than just restating the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States prerequisite 'Requires admin role' and includes explicit safety directive 'ALWAYS confirm with the user before merging'. However, lacks explicit contrast with alternatives like archive_fork or when NOT to use (e.g., 'use this instead of manually updating when...').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pin_theme_versionPin Theme VersionA
Idempotent

Lock a theme version so it is protected from automatic pruning or accidental overwrite. Pinned versions are marked with locked=true in get_theme_versions.

Use this to preserve milestone theme states (e.g., after a major redesign) before making further changes.

Example: {"version": 5}

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYesTheme version number to pin/unpin,required

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations establish idempotency and non-destructiveness; description adds crucial behavioral context about 'automatic pruning' protection (lifecycle management) and observability ('marked with locked=true in get_theme_versions'). Discloses protection scope beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three well-structured sentences: functional definition, usage context, and practical example. Every sentence earns its place with zero redundancy. Front-loaded with the core action and mechanism.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Appropriately complete for low-complexity tool (single parameter, no output schema). Covers protection mechanism, verification method, usage scenario, and input format without needing return value documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter already documented as 'Theme version number to pin/unpin'. Description provides syntax example ({'version': 5}) but does not significantly expand semantic meaning beyond the comprehensive schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific action (Lock/protect) on specific resource (theme version) with clear scope protection from 'automatic pruning or accidental overwrite'. Distinguishes from siblings by referencing get_theme_versions for observability of the locked state and implies relationship to unpinning operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance ('preserve milestone theme states...before making further changes') with contextual example (after major redesign). References get_theme_versions for verification. Does not explicitly name unpin_theme_version as the reversal mechanism, though sibling naming makes this inferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_contentPreview ContentA
Read-only

Render a content item's HTML without saving or publishing. Use this to verify what a page will look like before publishing.

Also accepts optional title/data overrides to preview unsaved edits: {"id": "abc123", "data": {"body": "New text"}}

Returns rendered_html and any warnings (missing required fields, unclosed tags, unresolved placeholders).

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoOverride field data for the preview (not saved). Merged on top of existing data.
idYesContent ID (MongoDB ObjectID),required
titleNoOverride title for the preview (not saved)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true in annotations, description confirms safety with 'without saving.' Critically, it compensates for missing output schema by disclosing return structure ('rendered_html and any warnings') and specific warning types (missing fields, unclosed tags, unresolved placeholders).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four efficient sentences: purpose, usage, parameter example with syntax, and return value disclosure. No repetition of schema details, appropriately front-loaded with core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Thoroughly complete for a preview tool: describes output to compensate for missing output schema, provides parameter usage examples for the nested data object, and clarifies behavioral boundaries (read-only) given the complexity of 3 parameters including nested overrides.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 100% schema coverage (baseline 3), description adds value via concrete JSON example showing override syntax, and reinforces 'not saved' semantics for the data/title overrides. The example provides concrete usage context beyond the schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb 'Render' with resource 'content item's HTML' and explicitly distinguishes from siblings by stating 'without saving or publishing,' clearly differentiating it from update_content and publish_content in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear when-to-use context ('verify what a page will look like before publishing'), implicitly establishing the workflow relationship with publish_content. Does not explicitly name the alternative tool, so stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publish_contentPublish ContentA
DestructiveIdempotent

Publish a content item, making it visible on the public site. Generates the static HTML page.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContent ID (MongoDB ObjectID),required

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety profile (destructive, idempotent). Description adds valuable implementation detail ('Generates the static HTML page') and user-facing effect ('visible on the public site') that help the agent understand the scope of the operation beyond the hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences with no waste. Front-loaded with action and primary effect, followed by technical implementation detail. Every word serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a single-parameter mutation tool with good annotations. Explains the observable effects (visibility, HTML generation) sufficiently despite lacking output schema. Could improve by mentioning idempotency behavior or error cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear parameter description ('Content ID (MongoDB ObjectID)'). The description mentions 'content item' but doesn't add parameter-specific semantics beyond the schema, which is appropriate given the high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb ('Publish') and resource ('content item') with specific effects ('making it visible on the public site'). Loses one point for not explicitly differentiating from sibling 'publish_multiple' (single vs batch) or 'unpublish_content'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Describes the outcome (visibility, HTML generation) but lacks explicit guidance on when to use vs alternatives like 'preview_content' or 'publish_multiple', and doesn't mention prerequisites (content must exist first).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publish_multiplePublish MultipleA
DestructiveIdempotent

Publish multiple content items in a single call. Use this instead of calling publish_content in a loop.

Examples:

  • Publish specific pages: {"ids": ["abc123", "def456"]}

  • Publish all drafts at once: {"publish_all_drafts": true}

Returns a list of published IDs and any failures.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoList of content IDs to publish. Mutually exclusive with publish_all_drafts.
publish_all_draftsNoIf true, publish every unpublished (draft) content item in the site

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover idempotent/destructive hints, so description adds valuable behavioral context by specifying return format ('list of published IDs') and crucially notes 'any failures' indicating partial success behavior. Could further clarify publish semantics (e.g., making content live/public).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Efficiently structured with purpose statement, usage guideline, bulleted examples, and return description. Zero redundant sentences; every clause adds selection or invocation guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Absence of output schema is compensated by describing return values and failure cases. 100% input schema coverage means parameters are well-documented. Minor gap: does not elaborate on side effects of 'publish' operation (visibility changes, permissions required).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, baseline is 3. Description earns additional point by providing concrete JSON examples showing ID format ['abc123', 'def456'] and boolean usage, adding semantic context beyond the schema's type definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verb 'Publish' with resource 'content items' and scope 'in a single call'. Explicitly distinguishes from sibling tool 'publish_content' by contrasting batch vs. loop usage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Contains explicit directive 'Use this instead of calling publish_content in a loop' identifying when to select this tool over its sibling. Examples further clarify both specific ID batching and bulk draft publishing patterns.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

regenerate_all_contentRegenerate All ContentA
Idempotent

Regenerate all published static HTML pages. Use after major theme or template changes.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety properties (idempotentHint, destructiveHint). The description adds valuable behavioral context by specifying the operation rebuilds 'static HTML pages' and implies it is triggered by structural changes (themes/templates). However, it omits operational details like whether this runs asynchronously, potential site performance impact during regeneration, or whether unpublished/draft content is affected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no redundancy. The first sentence states the action and scope; the second provides usage context. Every word earns its place with no filler or repetition of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and no output schema, the description adequately covers the tool's purpose and trigger conditions. It leverages the provided annotations for safety hints. A minor gap exists in not clarifying whether this affects the entire site or specific scopes, though 'all' suggests global scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters, the baseline score applies. The description requires no parameter clarification, and the schema is trivially complete at 100% coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description provides a specific verb ('regenerate'), a clear resource ('published static HTML pages'), and scope ('all'). The phrase 'static HTML pages' distinguishes this from dynamic content updates and siblings like update_content or publish_content that handle CMS records rather than cached HTML files.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool ('after major theme or template changes'), providing clear contextual guidance for the agent. However, it lacks explicit guidance on when not to use it (e.g., 'do not use for single page updates') or named alternatives from the sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reindex_embeddingsReindex EmbeddingsA
Idempotent

Regenerate vector embeddings for all published content. Required after initial setup or if embeddings become stale.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare idempotentHint=true and destructiveHint=false, establishing safety profile. Description adds operational context (triggers: initial setup, staleness) but omits details about execution duration, performance impact, or whether it blocks other operations. Appropriate given annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero redundancy: first defines operation, second specifies usage triggers. Front-loaded with concrete action verb and no filler text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Appropriately complete for a parameterless maintenance operation with good safety annotations. Describes scope (all published content) and timing, though could briefly mention relationship to search functionality or execution mode (async vs sync).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters present, meeting baseline for this score per evaluation rules. Schema requires no additional semantic elaboration.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'Regenerate' and specific resource 'vector embeddings' scoped to 'all published content'. Effectively distinguishes from sibling 'regenerate_all_content' by specifying the target resource (embeddings vs content), though explicit contrast with that sibling is absent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states trigger conditions ('after initial setup or if embeddings become stale'), providing clear when-to-use guidance. Lacks explicit when-not-to-use warnings or named alternatives, but the conditional requirement signals appropriate usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_fork_pageRemove Fork PageA
DestructiveIdempotent

Remove a page from a fork workspace (discards the fork copy, does not affect the live page).

ParametersJSON Schema
NameRequiredDescriptionDefault
fork_idYesFork workspace ID,required
page_idYesID of the fork page to remove (not the live content ID),required

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and idempotentHint=true. The description adds critical behavioral context beyond annotations: 'discards the fork copy' clarifies what gets destroyed, while 'does not affect the live page' provides essential safety information that prevents accidental misuse. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with parenthetical delivers complete information without waste. Every component earns its place: action verb, target resource, destruction clarification, and safety boundary. Front-loaded with the core operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite being a destructive operation (destructiveHint=true), the description adequately covers scope and safety. No output schema is present, but for a removal operation, describing what is/isn't affected suffices. Could slightly improve by mentioning irreversibility explicitly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% description coverage with 'Fork workspace ID' and 'ID of the fork page to remove (not the live content ID)'. The description does not add parameter-specific semantics, but with high schema coverage, the baseline 3 is appropriate per rubric rules.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verb 'Remove' with clear resource 'page from a fork workspace'. The parenthetical '(discards the fork copy, does not affect the live page)' effectively distinguishes this from sibling tools like 'delete_content' (live deletion) and 'delete_fork' (entire workspace deletion) by scoping the operation to fork copies only.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical clause 'does not affect the live page' provides explicit usage boundaries (when NOT to use), establishing that this tool is for fork workspace cleanup only. While it doesn't explicitly name alternatives like 'delete_content', the negative constraint clearly signals this is inappropriate for live content management.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restore_contentRestore ContentA
Idempotent

Restore a soft-deleted content item. Regenerates static page if content was published.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContent ID (MongoDB ObjectID),required

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds valuable side-effect disclosure ('Regenerates static page if content was published') beyond what annotations provide (idempotentHint, destructiveHint). However, misses error behavior (what if ID not found/not deleted) and authorization requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. Main action front-loaded in first sentence; second sentence adds distinct value by describing side effects. Structure is optimal for quick agent comprehension.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a single-parameter state-change operation. Combines clear annotations with description covering the restoration scope and side effects. Lacks error case documentation but acceptable given tool simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with complete parameter documentation ('Content ID (MongoDB ObjectID), required'). Description provides no additional parameter semantics, but baseline 3 is appropriate given schema already documents everything.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific action ('Restore') and resource ('soft-deleted content item'), distinguishing it from sibling create_content. The 'soft-deleted' qualifier clearly scopes the operation to recovery of trashed items versus creating new content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The term 'soft-deleted' implies prerequisite state, but lacks explicit guidance on when to use versus alternatives (e.g., create_content) or when not to use (e.g., hard-deleted items). No sibling comparisons or workflow guidance provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revert_theme_to_versionRevert Theme to VersionA
Destructive

Revert theme to a previous version. Creates a new version with the old data.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYesVersion number to revert to,required
version_commentNoOptional comment for the revert (e.g., 'Reverted to v3')

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true, but the description adds crucial behavioral context: 'Creates a new version with the old data.' This disclosure that reverting creates a new version entry (rather than destructive rollback) is valuable transparency beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. First sentence establishes operation and resource; second sentence provides essential behavioral information about version creation. Every word earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive 2-parameter tool with complete schema documentation, the description appropriately explains what the operation does and its non-destructive version creation behavior. No output schema exists, but the description sufficiently covers the operation's intent and side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the schema adequately documents both parameters (version number and optional comment). The description implies the version parameter but does not add semantic details, syntax constraints, or examples beyond what the schema provides. Baseline 3 is appropriate given comprehensive schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verb 'Revert' with resource 'theme' and scope 'to a previous version'. The second sentence 'Creates a new version with the old data' clarifies the semantic behavior. It distinguishes from sibling 'revert_to_version' by explicitly mentioning 'theme' in the description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through resource naming (theme vs content), but provides no explicit when-to-use guidance or comparison to siblings like 'revert_to_version' or 'restore_content'. The agent must infer applicability from the tool name and description alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revert_to_versionRevert to VersionA
Destructive

Revert content to a previous version. Creates a new version with the old data.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_idYesContent ID (MongoDB ObjectID),required
versionYesVersion number to revert to,required
version_commentNoOptional comment for the revert (e.g., 'Reverted to v3')

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Excellent clarification of behavioral nuance: despite 'destructiveHint' annotation signaling state mutation, description explains it 'creates a new version with the old data' rather than destructive overwrite. This preserves history and mitigates data loss fears, adding crucial context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise with two information-dense sentences. Front-loaded action ('Revert content...') with mechanism explanation following. Zero redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the essential 'copy-on-write' behavioral quirk adequately for a destructive operation, but lacks coverage of error cases, return value shape, or prerequisites given no output schema exists. Acceptable but gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, parameters are already well-documented. Description implies 'content' maps to content_id and 'previous version' to version, but adds no syntax details, format specifics, or examples beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verb (revert) and resource (content/version) clearly. Distinguishes from sibling 'revert_theme_to_version' by specifying 'content', but does not explicitly differentiate from 'restore_content' (restore from trash vs. version revert).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no guidance on when to use this tool versus alternatives (e.g., 'get_content_versions' to identify target version first) or prerequisites. No mention of error conditions (e.g., invalid version number).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scoped_search_replace_executeScoped Search Replace ExecuteA
Destructive

Execute a search-and-replace limited to a subset of pages. ALWAYS run scoped_search_replace_preview first and show results to the user before executing.

Scope options (all optional):

  • content_ids, folder_path, template_name, category

Set auto_republish: true to immediately re-publish all previously-published pages after updating them, collapsing the execute + publish_multiple flow into one call.

Example: {"search": "old text", "replace": "new text", "folder_path": "/blog", "auto_republish": true, "version_comment": "Updated old references"}

ParametersJSON Schema
NameRequiredDescriptionDefault
auto_republishNoIf true (execute only), re-publish all previously-published pages immediately after updating them (saves a separate publish_multiple call)
categoryNoLimit to pages in this category
content_idsNoLimit to specific content IDs
folder_pathNoLimit to pages whose URL starts with this path (e.g. /blog)
regexNoIf true, treat search as a Go regular expression. Use $1, $2 for capture group references in replace.
replaceYesReplacement text (empty string to delete)
searchYesText to search for,required
template_nameNoLimit to pages using this template name (e.g. 'Concept Page')
version_commentNoVersion comment for updated pages

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true; description complements this with safety protocol (preview requirement) and explains side effects of auto_republish ('immediately re-publish all previously-published pages'). Could further clarify irreversibility implications, but covers key workflow behaviors well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with critical workflow constraint ('ALWAYS...') front-loaded. Efficient bullet-style scope listing. Example JSON is long but functional. No redundant repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive for a complex 9-parameter destructive operation: covers preview requirement, scoping logic, auto-republish shortcut, and provides valid example. No output schema exists, but description adequately explains the operation's behavioral contract.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so baseline is 3. Description adds significant workflow context for 'auto_republish' (explaining it replaces a separate publish_multiple call) and provides a concrete JSON example showing parameter interaction. Scope options are listed but not semantically expanded beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verb ('Execute'), resource ('pages'), and scope ('limited to a subset'). Effectively distinguishes from sibling 'search_replace_execute' by emphasizing scoping, and from 'scoped_search_replace_preview' by identifying this as the execution step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit prerequisite: 'ALWAYS run scoped_search_replace_preview first'. Explains workflow alternative (auto_republish 'collapsing the execute + publish_multiple flow into one call'), clearly mapping when to use the flag vs separate calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scoped_search_replace_previewScoped Search Replace PreviewA
Read-only

Preview a search-and-replace limited to a subset of pages. Safer than site-wide replacement.

Scope options (all optional — leave blank to match all pages):

  • content_ids: specific page IDs

  • folder_path: pages under /blog, /docs, etc.

  • template_name: pages using "Concept Page", "Blog Post", etc.

  • category: pages with a matching category

Example: {"search": "old text", "replace": "new text", "folder_path": "/blog"}

Always run preview before execute.

ParametersJSON Schema
NameRequiredDescriptionDefault
auto_republishNoIf true (execute only), re-publish all previously-published pages immediately after updating them (saves a separate publish_multiple call)
categoryNoLimit to pages in this category
content_idsNoLimit to specific content IDs
folder_pathNoLimit to pages whose URL starts with this path (e.g. /blog)
regexNoIf true, treat search as a Go regular expression. Use $1, $2 for capture group references in replace.
replaceYesReplacement text (empty string to delete)
searchYesText to search for,required
template_nameNoLimit to pages using this template name (e.g. 'Concept Page')
version_commentNoVersion comment for updated pages

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Strong: Annotations declare readOnlyHint=true, and description adds valuable risk context ('Safer than site-wide replacement') and explains that scopes are optional ('leave blank to match all pages'). No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Excellent structure: Purpose front-loaded, scope options clearly bulleted, example provided, and workflow guidance included. Zero waste—every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Thorough for a 9-parameter tool: Covers all scope dimensions, required fields implied by example, and workflow explained. Minor gap: could briefly describe preview output format since no output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

High value despite 100% schema coverage: Groups scope parameters conceptually with clear semantic explanations (e.g., 'pages under /blog, /docs'), and provides concrete JSON example showing parameter interaction.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Excellent: States specific action ('Preview a search-and-replace'), target resource ('subset of pages'), and distinguishes from siblings ('Safer than site-wide replacement' contrasts with search_replace_preview).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Good: Explicitly recommends workflow ('Always run preview before execute') and contrasts with site-wide alternatives. Could be improved by explicitly naming sibling tools (scoped_search_replace_execute, search_replace_preview) to use instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_contentSearch ContentA
Read-only

Search across all content items by title or full text. Returns matching content with paths and match context.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_deletedNoInclude soft-deleted content in results
queryYesSearch query string,required
search_typeNoSearch type: 'name' (title only) or 'fulltext' (all fields). Defaults to 'fulltext'

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations establish read-only safety (readOnlyHint: true). The description adds valuable behavioral context by specifying return structure ('paths and match context'), compensating for the missing output schema. It does not mention the soft-deletion behavior (include_deleted), though that is covered in the parameter schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences. First establishes scope (what it searches), second establishes return value (what you get). No redundancy or filler. Front-loaded with core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 100% schema coverage and simple 3-parameter structure, the description is appropriately complete. It compensates well for the missing output schema by describing the return format (paths, match context). Could benefit from pagination or result limit notes, but not required given schema simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the schema fully documents parameters (query, search_type, include_deleted). The description echoes the 'title or full text' distinction but does not add query syntax details (e.g., wildcards) or semantic implications beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb ('Search') and resource ('content items') with specific scope ('title or full text'). However, it does not explicitly differentiate from siblings like 'end_user_search' or 'list_content'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives like 'end_user_search' (which may have different permission scopes) or 'list_content' (which retrieves unfiltered lists). No mention of prerequisites or when to avoid.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_replace_executeSearch Replace ExecuteA
Destructive

Execute a site-wide search-and-replace across all content. Modifies every matching page permanently.

MANDATORY workflow:

  1. Run search_replace_preview and show the user which pages will be affected.

  2. Get explicit user confirmation before executing.

  3. Run search_replace_execute with a clear version_comment.

Set auto_republish: true to immediately re-publish all previously-published pages after updating them, collapsing the execute + publish_multiple flow into one call.

For targeted replacements, use scoped_search_replace_execute instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
auto_republishNoIf true, re-publish all previously-published pages immediately after updating them (saves a separate publish_multiple call)
regexNoIf true, treat search as a Go regular expression. Use $1, $2 for capture group references in replace.
replaceYesText to replace with,required
searchYesText to search for,required
version_commentNoComment for version history (defaults to 'Bulk search and replace')

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true; the description adds critical behavioral context that the modification is 'permanent', specifies the mandatory 3-step workflow (preview, confirm, execute), and clarifies the side effects of auto_republish. Does not mention rollback capabilities or rate limits, but covers primary behavioral concerns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core function, followed by clearly demarcated 'MANDATORY workflow' steps, then specific parameter guidance. Every sentence conveys critical instruction or context; zero waste. Structure prioritizes safety-critical workflow information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the destructive nature (destructiveHint:true) and lack of output schema, the description is complete. It covers the essential safety workflow, distinguishes from all relevant siblings (preview and scoped variants), and explains the primary parameters' interaction (auto_republish). No additional description text is needed for an AI to invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage (baseline 3), the description adds significant value by explaining auto_republish's practical effect ('collapsing the execute + publish_multiple flow into one call') and specifying that version_comment should be 'clear' according to the workflow. Elevates beyond raw schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool executes a 'site-wide search-and-replace across all content' with the specific verb 'Execute' and resource 'all content'. It effectively distinguishes from siblings by contrasting with scoped_search_replace_execute ('For targeted replacements, use...instead') and implicitly from search_replace_preview by stating this 'Modifies...permanently' vs the preview's read-only nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when/when-not guidance: mandates running search_replace_preview first, getting explicit user confirmation, and suggests scoped_search_replace_execute for targeted replacements. Also explains when to use auto_republish (to collapse execute + publish_multiple into one call).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_replace_previewSearch Replace PreviewA
Read-only

Preview a site-wide search-and-replace without making any changes. ALWAYS run this before search_replace_execute.

Returns: affected page count, total match count, and per-page field breakdown. For targeted replacements (a folder, template, or category), use scoped_search_replace_preview instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
regexNoIf true, treat search as a Go regular expression. Use $1, $2 for capture group references in replace.
replaceYesText to replace with,required
searchYesText to search for,required

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true; the description reinforces this ('without making any changes') and adds necessary return value details ('affected page count, total match count, and per-page field breakdown') to compensate for the missing output schema. Could mention regex flavor or performance characteristics for a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with zero waste: sentence 1 establishes purpose and critical workflow rule, sentence 2 documents return values, sentence 3 provides scoping guidance. Perfectly front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Excellent completeness for a complex operation. Compensates for missing output schema by documenting return values, establishes the preview→execute safety pattern, and maps the sibling tool ecosystem (scoped vs site-wide, preview vs execute).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, clearly documenting all three parameters (search, replace, regex). The description does not add semantic details beyond the schema, meeting the baseline expectation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Preview a site-wide search-and-replace') and explicitly distinguishes from siblings by naming both 'search_replace_execute' (workflow predecessor) and 'scoped_search_replace_preview' (scope alternative).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Contains explicit workflow guidance ('ALWAYS run this before search_replace_execute') and clear alternative selection criteria ('For targeted replacements... use scoped_search_replace_preview instead').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unpin_theme_versionUnpin Theme VersionA
Idempotent

Remove the lock from a previously pinned theme version.

Example: {"version": 5}

ParametersJSON Schema
NameRequiredDescriptionDefault
versionYesTheme version number to pin/unpin,required

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explains that 'unpin' means removing a lock, which adds conceptual context beyond the annotations. However, it fails to disclose what state the theme enters after unpinning (does it track latest? stay fixed?) or mention the idempotent nature explicitly, though annotations cover safety profiles (destructiveHint=false, idempotentHint=true). No contradictions found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely efficient: one descriptive sentence followed by a concrete example. Every element earns its place, with the action front-loaded and zero redundant text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter state-change operation with good annotations covering safety/idempotency, the description adequately covers the core operation. It lacks explanation of the post-unpin behavior (which would help agents predict system state), but given the simplicity and lack of output schema, this is reasonable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the baseline is 3. The description adds an example JSON structure ('Example: {"version": 5}'), which helps clarify the expected format, but doesn't add semantic meaning beyond the schema's 'Theme version number to pin/unpin' description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Remove the lock') with a specific resource ('previously pinned theme version'), clearly distinguishing this from sibling tools like pin_theme_version (inverse operation) and revert_theme_to_version (which changes active version rather than just removing a lock).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'previously pinned' implies a precondition that the version must be locked, but there's no explicit guidance on when to use this vs. pin_theme_version, nor any mention of prerequisites like checking current pin status or what happens after unpinning (e.g., auto-updates resuming).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unpublish_contentUnpublish ContentA
DestructiveIdempotent

Unpublish a content item, removing it from the public site. Removes the static HTML page.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContent ID (MongoDB ObjectID),required

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Aligns with destructiveHint=true by describing removal actions. Adds valuable specific context beyond annotations by specifying 'Removes the static HTML page' as the mechanism, clarifying the scope of destruction without contradicting idempotentHint=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. Front-loaded with primary action and effect ('Unpublish... removing it from the public site'), followed by technical implementation detail ('Removes the static HTML page'). Optimal length for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Sufficient for a single-parameter destructive operation with good annotations. Describes the external effect (removal from public site) and mechanism (static HTML). Could be elevated by describing the resulting content state (draft/archived) or return confirmation, but adequate given schema simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with the 'id' parameter fully documented in the schema ('Content ID (MongoDB ObjectID)'). Description mentions no parameters, but baseline 3 is appropriate given complete schema coverage requiring no additional semantic explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific action 'Unpublish' on resource 'content item', clearly distinguishing from sibling 'delete_content' by specifying removal occurs only from 'the public site' while implying the item persists internally. Also adds technical specificity with 'static HTML page'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage context ('public site') but lacks explicit guidance on when to use versus 'delete_content' or other alternatives. No mention of prerequisites or state transitions (e.g., does it become a draft?).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_collectionUpdate CollectionC
DestructiveIdempotent

Update a collection's settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoContent category to include
descriptionNoCollection description
idYesCollection ID (MongoDB ObjectID),required
item_templateNoHTML template for each item
items_per_pageNoItems per page for pagination
nameNoCollection name
page_templateNoHTML template for collection page
slugNoCollection URL slug
sort_fieldNoField to sort by
sort_orderNoSort order: asc or desc

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate idempotent and destructive behavior, but the description fails to explain what is destroyed (e.g., are previous settings overwritten irreversibly?) or the scope of the update (partial vs full replacement).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely brief at four words, which prevents redundancy, but front-loads so little information that it borders on under-specification rather than efficient conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Inadequate for a destructive, idempotent operation with 10 parameters. Lacks explanation of side effects, return values, error conditions, or the relationship between parameters like templates and pagination settings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the schema adequately documents each parameter. The description adds minimal semantic value beyond grouping parameters as 'settings', meeting the baseline expectation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the action (update) and resource (collection settings), but is vague about what constitutes 'settings' and does not differentiate from sibling tools like update_content or update_template.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no guidance on when to use this tool versus alternatives (e.g., update_content for items within a collection), nor mentions prerequisites or constraints beyond the ID requirement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_contentUpdate ContentA
DestructiveIdempotent

Update an existing content item by ID. Creates a new version automatically. Only send fields you want to change.

For partial data updates, only the keys you include in "data" are changed — existing keys are preserved (merge semantics). Use clear_fields: ["field1", "field2"] to explicitly set fields to empty string. Set dry_run: true to validate the update without saving. To update by URL path instead of ID, use update_content_by_path. Always include version_comment so the version history is useful.

Up to 20 concurrent update_content calls are safe. For larger batches (>20 items), prefer bulk_update_content instead.

Example: {"id": "abc123", "data": {"body": "Updated text"}, "version_comment": "Revised intro paragraph"}

Content data fields support rich markup features:

  • [[Wikilinks]] and [[Page Title|display text]] — link to other pages by title or path; auto-update when paths change

  • [[include:snippet-name]] — embed a named snippet inline (reusable callouts, CTAs, disclaimers)

  • #hashtags — mention #tagname anywhere to automatically tag the page

  • Markdown fields (type "markdown") — GitHub Flavored Markdown converted to HTML at publish time Templates can use {{.lc_toc}} in their HTML layout to inject an auto-generated table of contents.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoContent category
clear_fieldsNoField names to clear to empty string (removes ambiguity about how to delete field content)
dataNoTemplate field values
dry_runNoIf true, validate the update without saving
folder_pathNoFolder path
idYesContent ID (MongoDB ObjectID),required
meta_descriptionNoSEO meta description
og_imageNoOpen Graph image URL
raw_modeNoUse raw HTML mode
set_raw_modeNoSet to true to explicitly update raw_mode (needed to set it to false)
set_use_footerNoSet to true to explicitly update use_footer (needed to set it to false)
set_use_headerNoSet to true to explicitly update use_header (needed to set it to false)
set_use_themeNoSet to true to explicitly update use_theme (needed to set it to false)
slugNoURL slug
tagsNoTags for lc:query index pages
template_idNoTemplate ID (MongoDB ObjectID)
titleNoContent title
use_footerNoInclude site footer
use_headerNoInclude site header
use_themeNoApply site theme/layout
version_commentNoOptional comment describing this version change

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover idempotency/destructiveness, but description adds crucial behavioral context: automatic versioning ('Creates a new version automatically'), merge semantics for partial data updates, clear_fields deletion mechanism, dry_run validation mode, and concurrency limits (20 calls). Also documents rich markup features (Wikilinks, includes, hashtags) and template capabilities.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Lengthy but well-structured and front-loaded. Core mechanics (ID-based update, versioning, partial updates) appear first. Specific parameter behaviors follow. Alternatives and limits come next. Advanced content features (markup, templates) appropriately placed at end. Every sentence provides distinct value despite length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive coverage for a complex 21-parameter destructive operation. Documents versioning behavior, update semantics (merge vs clear), validation mode, concurrency limits, and content format capabilities. No output schema exists, but description sufficiently covers invocation behavior and side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage (baseline 3). Description adds significant usage context: explains merge semantics for 'data' field, demonstrates 'clear_fields' array syntax, clarifies 'dry_run' validation purpose, and provides a concrete JSON example showing parameter interaction.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with specific verb 'Update' + resource 'content item' + identifier 'by ID'. Explicitly distinguishes from sibling 'update_content_by_path' ('To update by URL path instead of ID, use...') and 'bulk_update_content' ('For larger batches...prefer bulk_update_content').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when/when-not guidance: use sibling for path-based updates, use bulk tool for >20 items, use dry_run for validation, and always include version_comment. Clear guidance on partial vs full updates ('Only send fields you want to change').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_content_by_pathUpdate Content by PathA
DestructiveIdempotent

Update content identified by its URL path instead of its ID. Useful when you know the page URL but not the MongoDB ID.

Example: {"path": "/about", "title": "About Us", "data": {"body": "Updated content"}}

Only the fields you provide are changed. Always include a version_comment describing what changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoContent category
dataNoField values to update
meta_descriptionNoSEO meta description
og_imageNoOpen Graph image URL
pathYesURL path of the content to update (e.g. /about or /blog/my-post),required
publishedNoPublish state
tagsNoTags for lc:query index pages
titleNoNew title
version_commentNoVersion comment

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare idempotentHint=true and destructiveHint=true. The description adds valuable behavioral context: 'Only the fields you provide are changed' clarifies partial update semantics, and 'Always include a version_comment' establishes a usage requirement not captured in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three well-structured sentences: first establishes purpose and differentiation, second provides concrete example, third explains mutation semantics and versioning requirements. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter destructive operation with no output schema, the description covers the essential behavioral contracts (partial updates, versioning requirement) and distinguishes itself from siblings. Could optionally mention error behavior for non-existent paths, but adequately complete as-is.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% description coverage (baseline 3). The description adds a concrete JSON example showing how to structure the request object, particularly demonstrating the nested 'data' object usage, which adds practical value beyond the structured schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Update content') and resource (content by URL path), and explicitly distinguishes this from siblings by noting 'instead of its MongoDB ID'—directly contrasting with the likely update_content tool that uses ID.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool vs alternatives: 'Useful when you know the page URL but not the MongoDB ID.' This provides clear guidance on selecting this tool over the ID-based update_content sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_redirectUpdate RedirectC
DestructiveIdempotent

Update an existing redirect.

ParametersJSON Schema
NameRequiredDescriptionDefault
descriptionNoOptional description
from_pathNoSource path
idYesRedirect ID (MongoDB ObjectID),required
status_codeNo301 or 302
to_pathNoDestination path or URL

TDQS

C2.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=true, establishing the safety profile. The description adds no information about whether this performs partial updates (implied by schema but not confirmed) or full replacement, what gets returned, or side effects like cache invalidation. It merely states the obvious operation type.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely brief at four words, avoiding verbosity. However, the single sentence fails to earn its place by providing tautological information that matches the title. It is concise but insufficiently informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool with no output schema, the description should clarify update semantics (partial vs. full) and expected returns. With five parameters and only one required, the partial update capability is strongly implied but undocumented, leaving agents to infer behavior from schema structure alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are well-documented in structured fields. The description adds no additional parameter context (e.g., path format expectations, that empty strings might unset fields), but baseline 3 is appropriate given the schema's completeness.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Update an existing redirect' is a tautology that restates the tool name with minimal variation. While it adds the word 'existing' to imply the resource must pre-exist, it fails to distinguish from sibling tools like 'create_redirect' or explain what distinguishes an update from a creation operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives (e.g., when to update vs. delete and recreate), nor does it mention prerequisites beyond the implied existence of the redirect. There are no explicit exclusions or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_site_configUpdate Site ConfigC
DestructiveIdempotent

Update site configuration. Title templates support {{title}} and {{site_name}} placeholders.

ParametersJSON Schema
NameRequiredDescriptionDefault
title_templateNoPage title template with {{title}} and {{site_name}} placeholders
title_template_no_titleNoTitle template when page has no title

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations indicate destructive and idempotent behavior, the description fails to explain what 'destructive' means in this context (e.g., whether it replaces all existing title templates) or clarify that partial updates are supported since both parameters are optional. It mentions placeholder syntax but omits behavioral implications of the operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences total. The first sentence ('Update site configuration') is redundant with the tool title and name. The second sentence contains the specific placeholder information. Reasonably brief but front-loaded with less valuable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of annotations (destructive/idempotent hints) and complete schema coverage, the description barely suffices for a two-parameter tool. However, it fails to explain the partial update behavior (optional parameters), the specific scope limitation (title templates only), or elaborate on the destructive implications hinted in annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already fully documents both parameters including the placeholder syntax. The description generically states that title templates support placeholders, which adds minimal value beyond the schema but does not contradict it. Baseline score appropriate for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the tool updates 'site configuration' which is somewhat tautological with the tool name, but adds specificity by mentioning title templates and their placeholders. However, it misleadingly implies broad configuration updates when the schema only contains title template parameters, failing to precisely scope the tool's limited functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no guidance on when to use this tool versus alternatives like get_site_config, nor does it mention prerequisites such as understanding current configuration before updating. No explicit warnings about the destructive nature despite the annotation hint.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_snippetA

Update an existing snippet's name and/or HTML template.

ParametersJSON Schema
NameRequiredDescriptionDefault
htmlYesGo template HTML,required
idYesSnippet ID (MongoDB ObjectID),required
nameYesSnippet name,required

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate non-destructive mutation (destructiveHint:false) and stable IDs (openWorldHint:false). The description adds context that this operates on 'existing' resources and identifies which fields are mutable, but doesn't disclose behavioral specifics like error handling for missing IDs or whether unchanged fields must be resubmitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

高效单句结构(9个词),动作前置。'and/or'略显冗余且与schema中所有字段均为required存在轻微冲突,但整体上零废话。

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

对于带有完整schema描述的简单三参数更新工具而言基本够用,但缺少关于部分更新行为的重要细节(鉴于schema要求所有字段,而描述暗示可选更新),且未说明返回值或错误场景。

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% description coverage, establishing baseline 3. The description reinforces semantic relationships by grouping 'name' and 'html' as the updatable fields versus 'id' as the identifier, but doesn't resolve the tension between 'and/or' phrasing and the schema's required field constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('Update'), specific resource ('snippet'), and clear field scope ('name and/or HTML template'). The phrase 'existing snippet' clearly distinguishes this from sibling create_snippet.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'existing snippet' implicitly signals this is for modifications, not creation. However, it lacks explicit when-to-use guidance (e.g., 'use create_snippet for new snippets') and doesn't clarify that all fields must be provided even for partial updates despite the 'and/or' phrasing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_templateUpdate TemplateA
DestructiveIdempotent

Update an existing template. Changing the HTML layout will regenerate all content using this template.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoTemplate category
descriptionNoTemplate description
fieldsNoTemplate fields definition
html_layoutNoHTML layout (changing this regenerates all content using this template)
idYesTemplate ID (MongoDB ObjectID),required
nameNoTemplate name
slugNoTemplate slug

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true but don't specify what is destroyed. The description adds crucial context that changing HTML layout regenerates all content using the template, explaining the scope and trigger of the destructive operation beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste: first states purpose immediately, second delivers critical side-effect warning. Every word earns its place; appropriately front-loaded with no redundant or verbose language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no output schema, the description adequately covers the core operation and major side effect (regeneration). Given annotations cover safety hints and schema covers all parameters, this is complete enough, though could mention ID retrieval pattern.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description mentions HTML layout changes causing regeneration, but this information is already present in the html_layout parameter's description within the schema. No additional semantic details provided for other parameters like id, name, or fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states specific verb (Update) and resource (template), distinguishing from siblings like create_template or delete_template. The second sentence adds critical scope detail about regeneration behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an important side-effect warning (HTML layout changes regenerate content) which implies when to be careful, but lacks explicit when-to-use guidance versus alternatives like create_template or prerequisites such as needing the template ID.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_themeUpdate ThemeA
DestructiveIdempotent

Update theme settings. Only the fields you provide are changed — all other settings are preserved (partial update, safe to call without get_theme first).

Changing header_html or footer_html triggers background regeneration of all published pages. Changing colors, fonts, or custom_css does NOT require content regeneration.

Use pin_theme_version to protect important milestones before making major changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
accent_colorNoAccent theme color (hex)
background_colorNoBackground color (hex)
border_radiusNoBorder radius CSS value
custom_cssNoAdditional custom CSS
font_familyNoBody font family CSS value
footer_htmlNoCustom footer HTML (changing regenerates all content)
head_htmlNoCustom HTML for <head> section
header_htmlNoCustom header HTML (changing regenerates all content)
heading_fontNoHeading font family CSS value
logo_urlNoLogo image URL
primary_colorNoPrimary theme color (hex)
secondary_colorNoSecondary theme color (hex)
site_nameNoSite name
site_taglineNoSite tagline
text_colorNoText color (hex)

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds critical side-effect details beyond annotations: header_html/footer_html trigger background regeneration of all published pages while colors/fonts/custom_css do not, and clarifies partial update semantics. Annotations declare idempotent/destructive hints; description adds regeneration timing and scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly structured paragraphs: partial update semantics upfront, regeneration behavior specifics in middle, workflow recommendation at end. No redundancy with schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive for a 15-parameter mutation tool: covers mutation type (partial), side effects (regeneration), sibling interactions (get_theme, pin_theme_version), and safety profile. With 100% schema coverage and annotations present, no output schema needed in description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage establishing baseline 3. Description adds semantic value by grouping specific parameters (header_html/footer_html vs colors/fonts/custom_css) by their regeneration behavior, explaining operational significance of modifying each group.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb 'Update' with resource 'theme settings', clearly distinguishes from sibling get_theme by noting 'safe to call without get_theme first', and differentiates from pin_theme_version by explaining this performs the update while that protects milestones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit prerequisites ('safe to call without get_theme first'), clear workflow guidance ('Use pin_theme_version to protect important milestones before making major changes'), and behavioral conditions for regeneration provide clear when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_assetUpload AssetA

Upload or replace an asset in the asset library. Re-uploading to the same serve_path replaces the existing file in place — no need to delete first.

Provide file content via one of:

  • file_path: Absolute local path to the file (preferred for files >100KB — avoids MCP transport size limits)

  • data_base64: Base64-encoded file content (fine for small files)

Validates file type and MIME type for security.

ParametersJSON Schema
NameRequiredDescriptionDefault
data_base64NoBase64-encoded file content. Use for small files (<100KB). For larger files, prefer file_path.
descriptionNoOptional description of the asset
file_pathNoAbsolute local filesystem path to read the file from. Preferred over data_base64 for large files — avoids MCP transport size limits.
filenameYesOriginal filename with extension,required
serve_pathYesURL path where file will be served (e.g., /images/logo.png),required

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds security validation behavior ('Validates file type and MIME type') and infrastructure constraints ('MCP transport size limits') not present in annotations. Clarifies upsert/replacement semantics. Annotations declare non-destructive operation, and description frames replacement as a convenience feature rather than data destruction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly focused paragraphs: action/replacement behavior, content provision options with clear bullet structure, and validation notice. No redundant text; every sentence conveys distinct operational information. Well front-loaded with primary action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive coverage of upload semantics, security constraints, and transport limitations for a 5-parameter file operation. Absence of output schema is noted but description sufficiently covers input concerns and behavioral expectations for successful invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage (baseline 3), description adds crucial semantic guidance: specifies mutual exclusivity ('via one of'), size thresholds (>100KB) for choosing between file_path and data_base64, and explains the replacement semantics of serve_path parameter beyond the schema's basic definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific action ('Upload or replace') and resource ('asset in the asset library'). Explicitly distinguishes from sibling delete_asset by noting replacement happens 'in place — no need to delete first', and implicitly distinguishes from upload_asset_from_url by specifying local file content provision methods.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear operational guidance: explains replacement behavior (re-uploading to same serve_path replaces existing file) and selection criteria for content sources (file_path preferred for >100KB to avoid transport limits vs data_base64 for small files). Stops short of explicitly naming upload_asset_from_url as the alternative for remote URLs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_asset_from_urlUpload Asset from URLA

Fetch a public URL and store it as a LightCMS asset. Useful for importing images or files from the web without downloading them locally first.

Example: {"url": "https://example.com/logo.png", "serve_path": "/assets/logo.png", "description": "Site logo"}

If serve_path is omitted, the filename is derived from the URL. Returns id, serve_path, mime_type, and size.

ParametersJSON Schema
NameRequiredDescriptionDefault
descriptionNoOptional description
serve_pathNoURL path where asset will be served (e.g. /assets/logo.png). Auto-derived from URL filename if omitted.
urlYesPublic URL of the file to fetch (must be http or https),required

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide destructiveHint=false and openWorldHint=true. The description adds valuable behavioral details not in annotations: the automatic filename derivation logic ('If serve_path is omitted...') and the complete return value structure ('Returns id, serve_path, mime_type, and size') which compensates for the missing output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured with purpose first, use case second, concrete example third, and behavioral details last. Every sentence adds distinct value (purpose, differentiation, example, default logic, return values) with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 100% schema coverage and annotations covering safety (destructiveHint), the description provides appropriate completeness by documenting the return payload (compensating for no output schema) and providing a concrete usage example. It adequately covers the tool's contract for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the baseline is 3. The description adds an inline JSON example demonstrating realistic values for all three parameters, and explicitly explains the default behavior for serve_path derivation, adding semantic meaning beyond the schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Fetch a public URL and store it as a LightCMS asset') with clear resource and verb. It distinguishes itself from the sibling 'upload_asset' by emphasizing 'from the web without downloading them locally first,' clearly scoping the tool to URL-based ingestion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context ('Useful for importing images or files from the web') and implies the benefit over alternatives ('without downloading them locally first'). However, it does not explicitly name 'upload_asset' as the alternative for local files or state explicit when-not-to-use conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 72 tool updatesv4.2.0
    • First observedarchive_fork
    • First observedbulk_field_operation
    • First observedbulk_update_content
    • First observedcreate_collection
    • First observedcreate_content
    • First observedcreate_folder
    • First observedcreate_fork
    • First observedcreate_redirect
    • First observedcreate_snippet
    • First observedcreate_template
    • First observeddelete_asset
    • First observeddelete_collection
    • First observeddelete_content
    • First observeddelete_folder
    • First observeddelete_fork
    • First observeddelete_redirect
    • First observeddelete_snippet
    • First observeddelete_template
    • First observedend_user_search
    • First observedexport_content
    • First observedfork_page
    • First observedget_asset
    • First observedget_backlinks
    • First observedget_collection
    • First observedget_content
    • First observedget_content_version
    • First observedget_content_versions
    • First observedget_folder
    • First observedget_fork
    • First observedget_site_config
    • First observedget_snippet
    • First observedget_template
    • First observedget_theme
    • First observedget_theme_version
    • First observedget_theme_versions
    • First observedlist_asset_folders
    • First observedlist_assets
    • First observedlist_collections
    • First observedlist_content
    • First observedlist_folders
    • First observedlist_forks
    • First observedlist_redirects
    • First observedlist_snippets
    • First observedlist_templates
    • First observedmerge_fork
    • First observedpin_theme_version
    • First observedpreview_content
    • First observedpublish_content
    • First observedpublish_multiple
    • First observedregenerate_all_content
    • First observedreindex_embeddings
    • First observedremove_fork_page
    • First observedrestore_content
    • First observedrevert_theme_to_version
    • First observedrevert_to_version
    • First observedscoped_search_replace_execute
    • First observedscoped_search_replace_preview
    • First observedsearch_content
    • First observedsearch_replace_execute
    • First observedsearch_replace_preview
    • First observedunpin_theme_version
    • First observedunpublish_content
    • First observedupdate_collection
    • First observedupdate_content
    • First observedupdate_content_by_path
    • First observedupdate_redirect
    • First observedupdate_site_config
    • First observedupdate_snippet
    • First observedupdate_template
    • First observedupdate_theme
    • First observedupload_asset
    • First observedupload_asset_from_url

TDQS

B3.4/5.0
Disambiguation3/5

The tool set covers many distinct operations, but there is notable overlap in search-and-replace tools (search_replace_preview/execute vs. scoped_search_replace_preview/execute) and update tools (update_content vs. update_content_by_path vs. bulk_update_content). While descriptions help differentiate, an agent could misselect due to similar purposes.

Naming Consistency5/5

Tool names follow a consistent snake_case pattern with clear verb_noun conventions (e.g., create_content, list_assets, delete_folder). There are no deviations in style, making the naming highly predictable and readable.

Tool Count2/5

With 72 tools, the count is excessive for a CMS server, making it overwhelming and difficult to navigate. This many tools suggests over-fragmentation of operations, which could hinder agent usability and efficiency.

Completeness5/5

The tool set provides comprehensive coverage for content management, including CRUD operations for all entities (content, templates, assets, forks), bulk operations, versioning, search, and publishing workflows. No obvious gaps are present; it supports full lifecycle management.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jonradoff/lightcms'

If you have feedback or need assistance with the MCP directory API, please join our Discord server