Skip to main content
Glama

CI Paperboy CMS MCP server – quality and maintenance score on Glama

A self-hosted, open-source headless CMS in TypeScript on PostgreSQL. React admin with visual on-page editing, a typed Delivery API, and an MCP server so AI agents edit under the same rules as humans.

Paperboy ONE — Open, No Extras. · DPX — Don't Pay eXtra. A proper headless CMS without the "experience platform" invoice.

One container (API + admin), one Postgres. The website you build on is a separate repo, the Astro starter. Admin, REST and MCP go through the same validation, permissions and audit trail; the MCP↔API parity is test-enforced.

Where to start

You want to…

Go to

Try it in five minutes

Quickstart · Windows, no experience needed

Build a website on it

Astro starter, then @paperboycms/client and @paperboycms/preview

Let an AI client edit content

MCP

Run it for real

Production · Backups

Work on the CMS itself

Developing · CONTRIBUTING.md · CLAUDE.md

See it

Click any text on your page and edit it right there. The preview is your real frontend, not a mock-up, and it updates as you type.

Your site stays yours. This is the Astro starter's demo site, every page of it built through the Management API. One command runs it with the CMS: docker compose -f docker-compose.demo.yml up -d --build.

Related MCP server: agent-cms

Highlights

Content

  • Content types are data — pages, blocks and globals are defined in the admin, not in code. Content areas hold inline or shared blocks; a built-in template library covers the essentials.

  • Multisite — several sites in one instance, each with its own delivery keys, media, preview URL and start page. Types, languages and users are shared.

  • Multi-language with a fallback chain, hierarchical URLs from the page tree, version history, trash. Translation gaps show in the tree and on the dashboard.

  • Forms with submissions in your database — a form is content. Delivery ships it as a schema, submissions are validated server-side against the published form, and errors come back per field. Spam checks on by default, retention runs, erase-by-email is one audited action.

Delivery

  • One read path, no leaks — public keys see published content, preview keys see drafts, private fields never serialize. Lists filter, sort, paginate and search; every item carries fieldTypes so frontends switch on schema.

  • SEO and structured data computed by the CMS — meta, canonical, OpenGraph, Twitter and JSON-LD (Organization, breadcrumbs, FAQ Question/Answer, dateModified) on every page. Preview is always noindex.

  • Public files generated from content — robots.txt, sitemap.xml, llms.txt and security.txt.

  • Redirects that keep link equity — a rename or move records a 301 on publish. The frontend matches one manifest with matchRedirect; a 404 log shows what visitors miss.

  • Image transforms — ?w=800&format=webp&q=75 on any media URL, generated once and cached.

  • Webhooks — HMAC-signed content.published, form.submitted and delivery.changed for every move, sort or settings change, so a cache can purge on webhooks alone.

Editing

  • Visual on-page editing — click an element in the preview to edit its field, drag blocks onto the page, cross-origin included. The bridge is @paperboycms/preview.

  • Admin — React 19, light/dark, ⌘K palette, keyboard-operable drag-drop, axe-clean. The dashboard deep-links gaps, missing alt text and unused blocks.

  • AI writing assistant (optional; Anthropic or any OpenAI-compatible endpoint) — improve, rewrite, translate, alt text from the image, schema.org suggestions. With no key it refuses instead of faking output.

Agents and security

  • MCP server — site-scoped tokens or OAuth 2.1 sign-in. Acts as a user with that user's permissions; every version records whether a human or an agent wrote it, with an opt-in review gate.

  • Secure by default — Argon2id, server-side sessions, CSRF, TOTP 2FA, deny-by-default RBAC with object-level scopes, append-only audit log.

  • Typed client SDK — @paperboycms/client, typed from the same Zod schemas the server serializes with. No codegen.

How it compares

What ships in the box as of 2026-10-17. core = built in · plugin · paid · no. Every cell is sourced in docs/comparison-sources.md; corrections welcome.

Paperboy

Strapi

Payload

Directus

Sanity

License

MIT

MIT + paid tiers

MIT

source-available

closed backend

Self-host

one image

Node app

your Next.js app

one image

no

Forms, validated server-side

core

plugin

plugin, partial

no

no

SEO meta + JSON-LD from the CMS

core

plugin, no JSON-LD

plugin, no JSON-LD

plugin, no JSON-LD

no

Auto 301 on rename

core

plugin

plugin, manual

no

DIY

MCP server acting as a user

core

core

plugin (beta)

core

core

Multisite

core

no

plugin

pattern

datasets

Click-to-edit on the live page

core

paid

soon

core

core

GraphQL

no

plugin

core

core

core

Hosted option

no

paid

paused

paid

yes

Ecosystem

none yet

large

growing

growing

large

Quickstart

1. Run the CMS (Docker):

./scripts/setup.sh       # writes .env with unique secrets and your admin password — required
docker compose up -d     # db → init (migrate + seed) → api, which also serves the admin
# Admin  http://localhost:8090    API  http://localhost:8091  (OpenAPI UI at /api/docs)

setup.sh is safe to re-run and never overwrites .env. Paperboy refuses to boot on the placeholder secrets in this repo and refuses to seed production with the published demo login.

2. Run the website. The Astro starter renders every built-in content type and is where your site lives:

git clone https://github.com/hybriden/paperboy-astro-starter my-site
cd my-site && npm install && npm run setup && npm run dev   # http://localhost:4321

The admin's side-by-side preview points at http://localhost:4321 by default. apps/web in this repo is a Next.js contract reference, not a site to build on; it is opt-in (docker compose --profile web up -d web, :8092).

🪟 Windows, no experience needed

  1. Install Docker Desktop, restart if asked, open it and wait for Engine running.

  2. Download Paperboy: GitHub → green Code button → Download ZIP → right-click → Extract All….

  3. Open a terminal there: open the extracted folder in File Explorer, type powershell in the address bar, press Enter.

  4. Create your login (required; it gives your copy its own private keys):

    powershell -ExecutionPolicy Bypass -File .\scripts\setup.ps1

    It prints an email and password. Save them now, they cannot be shown again.

  5. Start it: docker compose up -d (the first run downloads for a few minutes).

  6. Open http://localhost:8090 and log in.

Everyday: docker compose stop / docker compose start / docker compose ps.

⚠️ Never run docker compose down -v once you have content: -v deletes the database. If a page won't load, check that Docker Desktop says Engine running.

Production

The generated .env targets localhost. Before exposing a real host set COOKIE_SECURE=true, drop ALLOW_INSECURE_COOKIES, and point CORS_ORIGIN at the admin's HTTPS origin. Redeploy one service with docker compose up -d --no-deps --force-recreate <svc>; the seed refuses to wipe a database that holds content unless FORCE_SEED=1. The deploy-safety rules are in CLAUDE.md.

Without a VM. One container, no proxy: it fits any "run a container" platform (App Service, Container Apps, Cloud Run, Fly, Render, Railway) plus a managed Postgres.

Setting

Value

Image

ghcr.io/hybriden/paperboy-app:latest

Port

the platform's PORT (or API_PORT)

DATABASE_URL

postgresql://…@host:5432/paperboy?sslmode=require

Secrets

SESSION_SECRET, CSRF_SECRET, MFA_SECRET via openssl rand -hex 32

CORS_ORIGIN

the admin's HTTPS origin, with COOKIE_SECURE=true

TRUST_PROXY

the load-balancer range, so rate limits see real IPs

Storage

a persistent volume at /app/uploads

Remote MCP

MCP_EMBEDDED=true serves the MCP inside the same container at {PUBLIC_URL}/mcp

Run one replica: rate limits and the publish/retention timers are in-process. Migrations run on boot. Create the first admin by running the image once with pnpm --filter @paperboy/db seed and real SEED_ADMIN_EMAIL, SEED_ADMIN_PASSWORD, PAPERBOY_PUBLIC_KEY, PAPERBOY_PREVIEW_KEY.

Accounts. Your admin login is what setup.sh printed. The demo logins (editor@, author@, viewer@, passwords <Role>!Passw0rd) are development fixtures: a production seed creates only the admin unless ALLOW_DEMO_CREDENTIALS=true.

Backups

Nothing backs itself up. ops/backup.sh is a working reference: nightly pg_dump plus a tar of the uploads volume, 14-day rotation, alert on failure. It refuses to succeed with an empty media archive and writes mode-600 files, because a backup is a full credential dump and, once you have forms, visitor personal data. Cron lines and the restore procedure are in ops/README.md. Known gap: backups land on the same disk as the data; add one rclone copy line once you have a bucket.

MCP

# Mint a token in Settings → MCP, then run locally over stdio:
MCP_TOKEN=mcp_… DATABASE_URL=postgresql://… pnpm --filter @paperboy/mcp start
# …or over Streamable HTTP for remote clients:
docker compose --profile mcp up -d --no-deps mcp      # → https://<your-domain>/mcp

The MCP acts as a Paperboy user and inherits its permissions. Tokens are minted per site (or for every site); PAPERBOY_SITE pins a server to one site, and every tool also takes a per-call site.

OAuth for remote clients. Add https://<your-domain>/mcp as a connector in Claude or Cursor. The client registers itself, sends you through Paperboy's own login (with 2FA), and a consent screen asks which site the connection may work in. Revoke it in Settings → Connected apps. One domain is enough: the API forwards /mcp and serves /.well-known/oauth-*. For other layouts set PUBLIC_URL (the issuer, default CORS_ORIGIN) and MCP_PUBLIC_URL (default {PUBLIC_URL}/mcp) on both api and mcp.

Files from the agent's machine. create_upload_link mints a 15-minute link the agent curls files to (POST /api/v1/uploads, 20 files of 5 MB per request). upload_asset takes a public URL or base64.

Agent-ready by design. Every rule came out of a real agent run that broke:

  • No silent damage — input is coerced only when meaning is preserved, otherwise rejected with an error that names the field, the shape and a copyable example.

  • Serialization-proof writes — set_field(documentId, field, value) sends one flat string, because long strings inside record args get mangled by some clients.

  • Safe defaults — update_content merges by default, pages auto-slug from their name.

  • A diagnosable trail — tool errors are logged with their arguments, every write lands in the audit log as ip=mcp.

  • Discoverable contract — list_content_types annotates every field with valueFormat and valueExample.

The full rules are in CLAUDE.md.

The npm packages

Frontends integrate against these two packages, not the CMS codebase. Both are versioned independently.

@paperboycms/client — dependency-free, typed end to end:

import { createClient, mediaUrl } from "@paperboycms/client";

const cms = createClient({ baseUrl: "https://cms.example.com", key: process.env.PAPERBOY_PUBLIC_KEY! });
const post = await cms.getBySlug<BlogPost>("hello-world", { locale: "en" });
const { items } = await cms.list<BlogPost>("BlogPost", { sort: "-data.publishDate", limit: 10 });
const src = mediaUrl(post!.data.image, { w: 640, format: "webp" });

Also getByPath, startPage, global, search, render helpers that follow fieldTypes, matchRedirect, preview-token verification and an optional ETag cache. 404s return null, other errors throw PaperboyError. Full README.

@paperboycms/preview — zero-dependency bridge that makes any frontend editable inside the admin's preview. Call initPreviewBridge() in preview mode and mark the DOM with data-pb-field, data-pb-area and data-pb-block-index (or let the client's pbAreaAttrs emit them). Full README.

Developing

apps/api         Fastify v5 — Management API (auth/RBAC) + Delivery API (read-only, key-scoped); serves the admin
apps/admin       React 19 + Vite — the editor
apps/web         Next.js 15 — reference frontend, pins the delivery contract (opt-in)
apps/mcp         MCP server (stdio or Streamable HTTP)
packages/shared  Zod schemas + types (single source of truth) + the AI provider
packages/db      Drizzle schema, migrations, query layer (object-level authz), seed
packages/client  @paperboycms/client — typed Delivery API SDK (npm)
packages/preview @paperboycms/preview — on-page-editing bridge (npm)
pnpm install
docker compose up -d db
export DATABASE_URL=postgresql://paperboy:paperboy@localhost:5433/paperboy
pnpm db:seed
pnpm dev                                    # api :8091, admin :8090, web :8092

pnpm --filter @paperboy/api test            # integration tests against a real Postgres
pnpm --filter @paperboy/admin test:e2e      # Playwright e2e + axe

CI also runs the MCP usability eval (evals/) on every push with a deterministic mock driver and weekly with a real model. Rules of the road: CONTRIBUTING.md. Everything about deploy safety, auth, the content model and the incidents behind each rule: CLAUDE.md. Stack choices: STACK.md. Research behind the bigger features: docs/plans/. Vulnerabilities: SECURITY.md.

License

MIT — Don't Pay eXtra. 📰

Available Tools

74 tools
ai_assistA
Read-only

Run the CMS's writing assistant on a piece of text and return the result — it does NOT save anything; write the output yourself with set_field/update_content. Uses the model configured in Settings → AI (Anthropic or OpenAI-compatible). Without a configured model only meta_title, meta_description and summarize work (a basic truncation); the other tasks return an error saying so. Image alt text is not available here (it needs the image itself): write it and save with update_asset_alt.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
taskYesmeta_title / meta_description = SEO text from the input; summarize; improve = polish grammar and flow; rewrite; variants = 3 alternatives as a JSON array; translate (needs targetLocale); write = 2-4 paragraphs about the topic in input; schema_fields = suggested fields for the schema.org @type named in input; alt_text is refused (see above).
inputYesThe text to work on (or, for write, the topic/brief).
targetLocaleNoLocale code of the output language, e.g. 'nb'. Required for translate; for improve/rewrite/variants it overrides 'same language as the input'.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and openWorldHint=true, and the description reinforces this with 'does NOT save anything' (no contradiction). It goes well beyond annotations by disclosing the dependency on the Settings → AI model config, the degraded basic-truncation fallback for only three tasks, that other tasks return an error, and that alt_text is unavailable. Rich behavioral disclosure.

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

Conciseness4/5

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

Front-loads the most important fact (no saving, write it yourself) ahead of secondary detail. Sentences are dense with em-dashes but every clause carries actionable information; minor run-on structure keeps it from a 5.

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

Completeness5/5

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

For a read-only generation tool with no output schema and no sibling overlap, the description covers the critical gaps: non-persistence, model config dependency, degraded-mode task coverage, and the alt_text exclusion with a routing alternative. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3 and the schema already documents task/input/site/targetLocale. The description adds value beyond the schema by specifying which task values remain functional without a configured model (meta_title, meta_description, summarize), a constraint that directly affects task selection.

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

Purpose5/5

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

States a specific verb+resource ('Run the CMS's writing assistant on a piece of text') and immediately delimits scope by declaring it saves nothing. An agent can distinguish it from sibling write tools like update_content or set_field without opening any schema.

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

Usage Guidelines5/5

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

Explicitly routes the agent: 'write the output yourself with set_field/update_content' and 'write it and save with update_asset_alt' for alt text. It also names when NOT to expect this tool to work (alt_text is refused) and names the alternative, which is exactly the when/when-not/alternative pattern.

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

copy_variantA
Idempotent

Copy a document's working version (name, slug and EVERY field) from one locale to another, server-side and atomically. USE THIS to move content that landed in the wrong language branch — never re-type the data field by field (a real agent moved 4 of 9 fields by hand and published an article without its body). The target locale gets a draft; publish it separately.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
toLocaleYesLocale to copy TO
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.
fromLocaleYesLocale to copy FROM

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (which already declare idempotent, non-destructive, non-read-only), the description adds that the copy is server-side and atomic, copies EVERY field, and that the destination receives a draft requiring a separate publish. This is exactly the kind of downstream-state disclosure annotations cannot convey.

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?

Purpose is front-loaded, followed by the routing guidance and a motivating anecdote. It is slightly long, but the parenthetical story earns its place by warning against the manual re-typing anti-pattern rather than padding.

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

Completeness4/5

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

With no output schema, the description still conveys the key outcome (a draft in the target locale, published separately) and the atomicity guarantee. It omits what identifiers are returned, but for a copy tool this is close to complete.

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

Parameters3/5

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

Schema description coverage is 100%, so documentId, fromLocale, toLocale and site are already well documented in the schema. The description's 'name, slug and EVERY field' clarifies copy scope rather than adding parameter-level syntax, so the baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb (copy), resource (a document's working version), and scope (name, slug and EVERY field) plus the directional transform (locale to locale). This clearly distinguishes it from siblings like duplicate_content, move_content, and update_content without opening their schemas.

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

Usage Guidelines4/5

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

Gives explicit when-to-use (content that landed in the wrong language branch) and a strong when-not (never re-type field by field), reinforced by a concrete failure anecdote. It stops short of naming an alternative sibling tool by name, so it falls just short of the top mark.

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

create_contentA

Create a new content item (page/block/global) as a draft. Pass the field content in data (field name → value, same shapes as update_content) to fill the page in ONE call — strongly preferred for a one-shot create. If you omit data it creates an EMPTY shell (name + auto slug only) that you MUST then fill with update_content/set_field, or the page stays blank. Either way: get_content_type first to learn the field names/shapes for this type. IMPORTANT: pages almost always belong UNDER an existing parent — a page's position decides its URL and which template the frontend renders it with (a blog post created at root gets a generic layout and looks empty when published). Call tree first and pass the right parentId (e.g. blog posts/articles go under their blog/list page). Omit parentId ONLY for genuinely top-level pages like the site's main sections. Under a LIST PAGE, the type must match what that page lists (its listedType): OMIT type to inherit it, or a mismatch is refused (the content would publish but never appear on the list).

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoInitial field values (field name → value), same shapes as update_content. Provide this to create a FILLED draft in one call. Call get_content_type first for the field names/shapes.
nameYesDisplay name of the item (also the source of a page's auto slug), e.g. 'Summer sale 2026'.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
slugNoURL slug for a page. Omit to auto-derive from the name.
typeNoContent type name. Under a list-page parent, OMIT to inherit the type that page lists; a mismatch is refused unless allowTypeMismatch.
localeNoThe LANGUAGE BRANCH for this content — MATCH the language you are writing (Norwegian content → 'nb', English → 'en'). Call list_locales to see the site's branches. Defaults to the site default locale, which is usually English.
parentIdNodocumentId of the parent page. Required in practice for pages — find it with `tree`. Omit only for top-level pages.
allowTypeMismatchNoSet true ONLY for a deliberate sub-page whose type differs from the parent list page's listedType
allowLanguageMismatchNoSet true ONLY to deliberately create text whose language differs from the locale branch (the guard otherwise refuses, so e.g. Norwegian text can't silently land on the 'en' branch)

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare the safety profile (mutation, non-destructive, non-idempotent). The description adds real behavioral consequences beyond them: omitting data leaves a blank page, a root-level blog post renders with a generic/empty layout, and type/language mismatches are refused ('a mismatch is refused'). These are refusal and side-effect disclosures that annotations do not carry.

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

Conciseness4/5

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

Front-loaded with the core action and the one-shot `data` guidance before the caveats. It is dense and long for a single paragraph with heavy ALL-CAPS emphasis, but the length is largely justified by the number of non-obvious constraints. Loses a point for the wall-of-text presentation.

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 9-parameter mutation tool with no output schema, the description covers prerequisites (get_content_type, tree), guard behavior, the empty-vs-filled create fork, and top-level vs nested placement. Nothing an agent needs to call it correctly is missing; output values are not needed here.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents each parameter; baseline 3. The description nonetheless adds meaning beyond the schema by explaining cross-parameter relationships (parentId determines URL and frontend template; type inheritance under a list page; allowTypeMismatch as a deliberate override), which the per-parameter schema text does not connect.

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

Purpose5/5

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

States a specific verb+resource+scope: 'Create a new content item (page/block/global) as a draft.' It explicitly positions itself against siblings (update_content, set_field, get_content_type, tree) so an agent can tell it apart without opening schemas.

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

Usage Guidelines5/5

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

Gives explicit when/when-not: pass `data` for a one-shot filled create (strongly preferred), omit it to get an empty shell that must be filled later; call get_content_type first; call tree first and set parentId; omit parentId only for genuinely top-level pages. Alternatives and preconditions are spelled out.

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

create_content_typeA

Create a new content type (the schema editors fill in) from a full ContentTypeDef. Content types are instance-wide, shared by every site, so this needs a token not limited to one site. Faster for common shapes: list_type_templates + instantiate_type_template. The definition is validated and a bad one is refused with the offending path.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
definitionYesA ContentTypeDef: {name: 'PascalCase', kind: 'page'|'block'|'global', fields: [{name, type, …}], …}. Copy the shape of an existing one from get_content_type.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), and the description adds real context beyond them: the instance-wide scope, the auth requirement of a non-site-limited token, and validation behavior ('a bad one is refused with the offending path'). This is unusual depth for a create tool.

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

Conciseness5/5

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

Four sentences, front-loaded with the core create action, then scope/auth, then the alternative, then failure behavior. No filler; each sentence carries distinct information.

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

Completeness5/5

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

For a mutation tool with no output schema, the description covers what an agent needs: what it creates, the token scope, an alternative for common cases, and error behavior on invalid input. Nothing material is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents the site slug and the ContentTypeDef shape with examples. The description reinforces 'full ContentTypeDef' and adds the validation-on-bad-input behavior, but adds little parameter syntax beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Create a new content type') and clarifies what a content type is ('the schema editors fill in') from a full ContentTypeDef. It routes the agent away from siblings by naming list_type_templates + instantiate_type_template as the faster path for common shapes.

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

Usage Guidelines5/5

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

Explicitly names the alternative workflow ('Faster for common shapes: list_type_templates + instantiate_type_template') and states the token prerequisite (instance-wide, not limited to one site). Both when-to-use and the alternative are spelled out.

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

create_delivery_keyA

Mint a Delivery API key for this site (Admin only). A public key reads published content only — safe for a website build; a preview key also reads drafts, so keep it server-side. The secret is returned ONCE in this response; store it now.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesLabel for where it is used, e.g. 'Astro site production'.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
typeYespublic = published only; preview = drafts too.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare the mutation profile (readOnly=false, idempotent=false, destructive=false). The description adds genuinely non-obvious behavior: the secret is returned exactly once and must be stored immediately, the admin-only restriction, and the security consequence of preview keys reading drafts.

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, front-loaded with the action and permission, then the type trade-off, then the one-time-secret warning. No filler and the most failure-prone detail (store the secret now) is last and emphatic.

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

Completeness5/5

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

No output schema exists, and the description compensates by explaining the return (the secret, shown once). For a 3-parameter mutation tool it covers permission, parameter choice, and the irreversible consequence.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description still adds meaning for the type parameter beyond the enum text by framing public as safe for a public build and preview as server-side-only, and it contextualizes the site parameter's multisite fallback behavior.

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

Purpose5/5

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

Specific verb (Mint) plus resource (Delivery API key) plus scope (this site) and permission gate (Admin only). It is trivially distinguishable from its siblings list_delivery_keys, revoke_delivery_key and rename_delivery_key.

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

Usage Guidelines4/5

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

Gives the decision rule for the two key types — public for a website build, preview when drafts are needed — plus the admin-only prerequisite and the security caveat for preview keys. It stops short of explicitly naming when not to use it or pointing at sibling tools like revoke_delivery_key.

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

create_redirectA

Create a redirect rule. source: a path ("/old-page"), a prefix ("/blog/*" — the rest of the path is carried over) or a full URL on the old site (reduced to its path). Target: EITHER targetDocumentId (+ optional targetLocale) to follow a page wherever it moves, OR target = a path or https:// URL — a path that names a published page is stored as that page. status: 301 (default, permanent — passes link equity), 302/307 temporary, 308 permanent, 410 gone (no target). A target that is itself redirected is collapsed to the final destination; loops are refused. Publishing a new slug or moving a page creates 301s automatically — check list_redirects before adding one by hand.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoFree-text note for editors, e.g. 'old WordPress URL'.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
sourceYesOld path ('/old-page'), prefix ('/blog/*') or full URL on the old site.
statusNo301 permanent (default), 302/307 temporary, 308 permanent, 410 gone (no target).
targetNoDestination path or https:// URL. Use this OR targetDocumentId.
keepQueryNoCarry the request's query string over to the target.
targetLocaleNoLocale of targetDocumentId to send visitors to. Omit for the site default.
targetDocumentIdNodocumentId of the destination page; the rule follows it if it moves. Use this OR target.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly=false, destructive=false, idempotent=false), and the description adds genuinely non-obvious behavior: chained redirects are collapsed to the final destination, loops are refused, and auto-generated 301s may already exist. It stops short of stating whether the rule takes effect immediately or whether it requires a publish step.

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

Conciseness4/5

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

Front-loaded with the action, then the two argument families, then status semantics, then the routing tip to list_redirects. Dense and mostly waste-free, though the long em-dashed clauses make it slightly harder to scan than ideal.

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

Completeness4/5

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

For an 8-parameter mutation tool with no output schema, the description covers source/target semantics, status codes, and redirect-resolution behavior well. The remaining gap is the return value and whether creation is immediate or requires publishing, which the agent would otherwise need from elsewhere.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema: it explains that a full old-site URL is reduced to its path, that a target path naming a published page is stored as that page, and that 301 'passes link equity' while 410 requires no target. These are semantics the schema does not convey.

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 a specific verb+resource ('Create a redirect rule') and then defines the two core concepts (source forms, target forms) precisely enough to distinguish it from siblings like update_redirect and delete_redirects. It also explicitly contrasts itself with list_redirects ('check list_redirects before adding one by hand'), which the agent would otherwise have to infer.

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

Usage Guidelines4/5

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

Gives real when-not guidance: publishing a new slug or moving a page already creates 301s automatically, so check list_redirects first. It does not, however, mention when to prefer update_redirect or delete_redirects over creating a new rule, leaving one sibling gap.

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

create_type_templateA

Save a content type definition as a reusable template (a starter/backup recipe). The template's name is the content type name instantiate materialises by default — use a name no existing template takes (built-in template names are reserved).

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
definitionYesFull ContentTypeDef, same shape as create_content_type

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare the mutation profile (not read-only, not destructive, not idempotent), so the bar is lower. The description adds the reserved-name constraint and the link to instantiate, but omits what happens on a name collision (error vs overwrite) and any permission requirements — relevant for a non-idempotent write.

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 sentences, front-loaded with the core action, and no filler. The parenthetical 'starter/backup recipe' is slightly decorative but clarifies intent cheaply.

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

Completeness4/5

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

For a 2-parameter tool with full schema coverage and no output schema, the description covers purpose, naming, and the downstream instantiate relationship. The main missing piece is collision/overwrite behavior on a non-idempotent save.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds genuine meaning by explaining that the template name becomes the content type name that instantiate materialises by default, which is semantics the schema does not convey.

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

Purpose4/5

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

The description states a specific verb and resource — 'Save a content type definition as a reusable template' — and clarifies the recipe/starter purpose. It implies separation from create_content_type by framing the artifact as a template rather than live content, though it never names a sibling directly.

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

Usage Guidelines3/5

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

It gives a naming rule ('use a name no existing template takes; built-in names are reserved') and hints at the instantiate relationship, but never states when to choose this over create_content_type, update_type_template, or import_type_templates. Usage is implied rather than specified.

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

create_userA

Create a CMS user account that signs in to the admin with this email and password (instance-wide, all sites). Admin only; needs a token not limited to one site. Returns {id}. Share the password with the person out of band; they can change it and enable 2FA themselves.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name, e.g. 'Kari Nordmann'.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
emailYesSign-in email address; must be unique.
rolesYesAdmin = everything; Editor = all content + publish + form submissions; Author = write content within its sections; Viewer = read-only.
passwordYesInitial password, at least 10 characters.
sectionsNodocumentIds of top-level pages this user is limited to (its subtree). Omit or [] for the whole site.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=false), and the description meaningfully extends it with auth requirements (admin-only, instance-wide token), the return shape ('Returns {id}'), and operational guidance on password transfer and self-service 2FA. This is real context beyond the structured fields, though rate limits or error behavior are unaddressed.

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

Conciseness4/5

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

Front-loaded with the core purpose, then credential, return, and password-handling details in tight succession. Every sentence contributes, and there is no redundant restatement. Slightly dense but well structured.

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 6-parameter, 4-required mutation with no output schema and no annotations beyond hints, the description covers purpose, authorization prerequisites, return value, and post-creation password handling. It is close to self-sufficient, with only edge-case behavior (validation failures, duplicate email) left implicit.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters are already documented in the schema (roles, sections, site, etc.). The description repeats the email/password concept and clarifies the instance-wide site scope but adds no new parameter semantics. Baseline 3 applies when the schema carries the load.

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

Purpose4/5

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

States a specific verb+resource ('Create a CMS user account') and adds scope ('instance-wide, all sites'), which cleanly separates it from content CRUD siblings like create_content. It does not explicitly name the adjacent user-management siblings (update_user, list_users), so it stops short of full differentiation.

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

Usage Guidelines4/5

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

Provides clear preconditions for use: 'Admin only; needs a token not limited to one site.' This tells the agent when it is permitted and what credential scope is required, effectively acting as an exclusion. It doesn't name an alternative tool or fallback, but the context is unambiguous.

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

create_webhookA

Subscribe a URL to this site's events (Admin only): Paperboy POSTs a JSON payload signed with HMAC-SHA256 on each event, e.g. to trigger a static-site rebuild. Private-network URLs are refused. The signing secret is returned ONCE; store it to verify deliveries.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPublic https:// endpoint to POST to.
nameYesLabel, e.g. 'Netlify rebuild'.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
eventsNoEvents to send: content.published, content.unpublished, form.submitted. Omit or [] for all.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only say this is a non-readOnly, non-idempotent write; the description adds substantive behavior: HMAC-SHA256 signed payloads, refusal of private-network URLs, admin-only access, and that the signing secret is returned exactly once. Those are operational facts an agent cannot get from the 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?

Roughly 50 words in tightly packed sentences with the action first, the security caveat second, and the one-time-secret warning last. No filler clauses; every sentence carries a distinct fact.

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

Completeness5/5

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

No output schema exists, and the description covers the one return detail that matters (the secret is returned ONCE and must be stored), plus security constraints and permissions. Nothing needed to invoke this webhook-creation tool correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so url/name/site/events are already documented in the schema; the description reinforces the public-endpoint and secret semantics but adds no parameter-level detail beyond it. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Subscribe a URL to this site's events') along with the mechanism (Paperboy POSTs a signed JSON payload), which clearly separates it from list_webhooks and delete_webhook 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?

Gives a concrete usage context ('to trigger a static-site rebuild') and a prerequisite ('Admin only'), so an agent knows the scenario and the permission bar. It stops short of naming alternatives such as list_webhooks or delete_webhook or stating when-not to use it.

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

delete_assetA
Destructive

Permanently delete a media asset: the database row and the stored file. Irreversible. Content that still points at it is not blocked: delivery resolves those fields to null, so the image silently disappears from those pages — clear or replace them first. Returns {ok:true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
documentIdYesThe asset's documentId from list_assets.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations confirm destructive and non-idempotent behavior, but the description adds substantial context beyond them: both the database row and the stored binary file are removed, references are not blocked, and pages silently lose the image via null resolution. It also discloses the return shape ({ok:true}). This is genuinely useful behavioral disclosure.

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

Conciseness5/5

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

Four tight sentences, front-loaded with the irreversible action, then the consequence, then the mitigation, then the return value. No filler.

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

Completeness5/5

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

Though there is no output schema, the description supplies the return value, the destructive scope, and the side effects on dependent content. Nothing an agent needs to call this safely is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so documentId and site are already fully documented in the schema, including the pointer to list_sites and list_assets. The description adds no parameter-level detail, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource — 'Permanently delete a media asset' — and immediately clarifies scope: 'the database row and the stored file.' The word 'permanently' distinguishes it from the softer sibling trash_content, so an agent can tell the two apart without opening either schema.

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

Usage Guidelines4/5

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

Provides a clear prerequisite: content pointing at the asset must be cleared or replaced first, because delivery resolves dangling references to null. It gives the condition for safe use but never names the obvious alternative (trash_content) for non-permanent removal, so it stops short of explicit alternatives.

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

delete_form_submissionA
Destructive

Permanently delete ONE form submission (irreversible; audit-logged; requires submission.manage). Returns {ok:false} when no such submission exists. To erase everything one person sent, use erase_form_submissions.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
submissionIdYesThe submission's id from list_form_submissions.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and non-idempotent behavior. The description adds important operational context beyond annotations: irreversibility, audit logging, required permission, and return behavior when the submission does not exist.

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 tightly structured and front-loaded with the core action and its destructive nature. Every sentence adds useful information without 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 destructive mutation, full schema coverage, and existing annotations, the description covers the critical gaps: irreversibility, audit logging, permission requirement, missing-submission behavior, and the sibling alternative. No output schema exists, so return values need not be explained 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?

Schema coverage is 100%, so both parameters are fully documented in the input schema. The description reinforces that only one submission is affected via submissionId but does not add syntax or format meaning beyond the schema.

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

Purpose5/5

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

The description states a specific verb and resource: 'Permanently delete ONE form submission'. It also scopes the operation to one submission and explicitly distinguishes it from erase_form_submissions, so an agent can tell it apart from siblings.

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?

It names the alternative erase_form_submissions and the condition that selects it: erasing everything one person sent. It also states the required permission (submission.manage), which is essential for correct invocation.

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

delete_redirectsA
Destructive

Permanently delete redirect rules by id. The old URLs then answer 404 (or reach a page now published there) — check list_not_found afterwards. Returns {deleted: }.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesRule ids from list_redirects.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and non-idempotent, so the safety profile is covered; the description adds real value on top by disclosing the post-deletion behavior (old URLs answer 404 or resolve to a newly published page) and the response payload {deleted: <count>}, effectively serving as a lightweight 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?

Three short sentences, front-loaded with the action and its irreversible nature, then the consequence, then the return shape. Every clause earns its place with no filler.

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

Completeness4/5

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

For a no-output-schema, destructive, two-parameter tool, the description supplies the consequence of deletion and the return shape, which is enough for correct invocation. It could still note any permission requirements or bulk-deletion limits, but nothing essential is missing.

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

Parameters3/5

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

Schema coverage is 100% and both parameters (ids, site) are fully documented there, including the multisite fallback and the list_sites hint. The description only restates 'by id' and the return count, adding nothing beyond the structured fields, so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb+resource ('delete redirect rules by id') with the permanence qualifier, which cleanly separates it from the sibling update_redirect/create_redirect/list_redirects family. An agent can identify the operation without opening the schema.

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

Usage Guidelines3/5

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

It implies the usage context (removing redirects so old URLs 404) and tells you to verify with list_not_found afterwards, but never states when this is preferable to updating a redirect or that the ids come from list_redirects (that detail is only in the schema). No explicit exclusions or alternatives.

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

delete_type_templateA
Destructive

Permanently delete a stored type template from the library (built-ins can't be deleted). Content types instantiated from it, and their content, are NOT affected. Returns {ok:true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe stored template's name.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.1/5.0
Behavior4/5

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

Goes beyond the annotations (which already flag destructiveHint=true and idempotentHint=false) by disclosing the key cascade behavior: content types instantiated from the template and their content are NOT affected, and built-ins are protected. This answers the most important 'what does destroying this touch' question. It stops short of noting behavior on already-deleted names, which is relevant given idempotentHint=false.

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

Conciseness5/5

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

Three tight sentences, no filler, front-loaded with the destructive action. Each sentence earns its place: action, built-in exclusion, non-cascade reassurance, and return value.

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

Completeness5/5

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

For a destructive delete with no output schema, the description supplies the return value ({ok:true}), the protection rule, and the non-cascade consequence. Combined with annotations that carry the safety profile, an agent has everything needed to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents the 'name' and 'site' parameters, including multisite guidance. The description adds no parameter-level detail beyond what the schema provides, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Permanently delete a stored type template from the library') and scopes it against built-ins. This clearly separates it from sibling write tools like delete_asset, delete_user, and delete_redirects, and there is no ambiguity about what gets removed.

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 implicit when-not ('built-ins can't be deleted') and reassures the caller about scope, but never names an alternative (e.g. update_type_template for modification) or states prerequisites. Usage is implied rather than explicitly routed.

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

delete_userA
Destructive

Permanently delete a user account (Admin only): they can no longer sign in and their browser sessions end. Content they wrote stays. You cannot delete yourself or the last Admin. Irreversible. Returns {ok:true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe user's id from list_users.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveness and non-idempotency, but the description adds important behavioral context: the effect on sign-in, browser session termination, content retention, irreversibility, admin constraints, and the return shape. 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.

Conciseness5/5

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

The description is compact and front-loaded: identity of the operation, access restriction, effects, constraints, irreversibility, and return value are all stated without filler. Every sentence carries operational meaning.

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 painless destructive admin tool with complete schema coverage and annotations, the description supplies all missing decision-critical context: irreversibility, session termination, content retention, self/last-admin exclusions, and return format. No output schema exists, so the return note is useful.

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 input schema already documents both the 'id' and optional 'site' parameters. The description does not add further parameter-level syntax or meaning beyond what the schema provides, so the baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific destructive verb and resource (permanently delete a user account), names the admin-only restriction, and clearly differentiates the operation from sibling tools like create_user, update_user, and list_users. An agent can identify the exact action and scope without opening the schema.

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

Usage Guidelines5/5

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

It gives explicit usage conditions and exclusions: 'Admin only', 'you cannot delete yourself or the last Admin', and 'Irreversible'. These tell the agent when the tool is valid and when it must not be called.

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

delete_webhookA
Destructive

Permanently delete a webhook (Admin only); no further events are sent to its URL. Returns {ok:true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe webhook's id from list_webhooks.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered. The description adds real value beyond them: irreversibility ('Permanently'), the side effect on event delivery, an auth requirement ('Admin only'), and a return shape ('{ok:true}'). It does not address failure modes or the notably non-idempotent behavior, keeping it from a 5.

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

Conciseness5/5

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

A single front-loaded sentence carrying purpose, privilege, effect, and return value with no filler. Every clause earns its place.

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

Completeness4/5

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

For a two-parameter destructive delete, the description covers what gets destroyed, the auth bar, the side effect, and the return value, while annotations and the schema cover the rest. Only the absence of failure-mode/idempotency context leaves a small gap.

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

Parameters3/5

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

Schema description coverage is 100%, including a helpful note that 'id' comes from list_webhooks and a multisite note for 'site'. The description adds nothing about either parameter, so the baseline of 3 applies when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb and resource ('Permanently delete a webhook') plus the observable consequence ('no further events are sent to its URL'). It is clearly distinguishable from create_webhook/list_webhooks by the verb alone, but it never names a sibling explicitly, so it stops short of the 5 benchmark.

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

Usage Guidelines3/5

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

Usage is implied by the destructive framing and the '(Admin only)' prerequisite, but there is no explicit when-to-use statement, no when-not-to-use, and no pointer to alternatives such as list_webhooks or create_webhook. The agent must infer that this is the removal path.

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

delivery_get_by_idA
Read-only

Read one content item by documentId exactly as the website receives it. Returns the item as the public Delivery API serves it — published only (unless preview), private fields removed, plus computed urlPath, fieldTypes and SEO metadata on pages — or null when nothing matches. Use get_content to read a draft for editing.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
previewNotrue = read the latest drafts as the preview pane shows them (needs site-wide read access). Default false: published content only, exactly what visitors get.
populateNoHow many levels of references and shared blocks to resolve inline, 0-4 (default 0: references stay as ids).
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds real behavioral context: published-only unless preview, private fields removed, computed urlPath/fieldTypes/SEO metadata, and null on no match. That is well beyond what the 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 tight sentences: identity and semantics first, return shape second, sibling routing last. No filler, and the most decision-relevant clause is 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?

With no output schema, the description carries the return-value burden and does it: it enumerates the computed fields and the null-on-miss case. Combined with annotations and full param coverage, an agent has everything needed to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so preview, site, locale, populate and documentId are all documented at the source; baseline 3 applies. The description retouches preview ('unless preview') but adds no syntax or format detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ('Read one content item by documentId') and pins down the exact semantics ('exactly as the website receives it', 'as the public Delivery API serves it'). This distinguishes it from get_content and the other delivery_* readers without requiring the agent to open a schema.

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

Usage Guidelines4/5

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

Explicitly names an alternative and the condition that selects it: 'Use get_content to read a draft for editing.' That is clear routing guidance. It does not differentiate from the closely-named siblings delivery_get_by_slug / delivery_get_by_path, leaving a small gap for a sibling set this crowded.

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

delivery_get_by_pathA
Read-only

Read the page a visitor gets at a URL path — the way to check what a live URL shows. Returns the item as the public Delivery API serves it — published only (unless preview), private fields removed, plus computed urlPath, fieldTypes and SEO metadata on pages — or null when nothing matches. Use get_content to read a draft for editing.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesThe page's URL path without the locale prefix, e.g. '/blog/my-post'.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
previewNotrue = read the latest drafts as the preview pane shows them (needs site-wide read access). Default false: published content only, exactly what visitors get.
populateNoHow many levels of references and shared blocks to resolve inline, 0-4 (default 0: references stay as ids).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: published-only unless preview, private fields stripped, and a null return when nothing matches. It could say more about preview access requirements (the schema carries that) but this is well above the annotation baseline.

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 front-loaded sentences: the purpose first, then return semantics, then the routing alternative. No filler, and the most decision-relevant fact (what the live URL returns) leads.

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, so the description carries the return burden and does so: it explains the item shape (public fields, computed urlPath/fieldTypes/SEO metadata) and the null case. Nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, so all five parameters are already documented in the schema, including preview and populate semantics. The description only echoes 'unless preview' and adds no syntax or defaults beyond what the schema provides, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (read) and resource (the page a visitor gets at a URL path) and frames the exact use case ('check what a live URL shows'). It clearly differentiates itself from get_content (drafts) and, by implication, the other delivery_* readers.

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?

Names the alternative explicitly ('Use get_content to read a draft for editing') and states the condition that selects this tool ('the way to check what a live URL shows'). The published-vs-draft boundary is the deciding factor and it is spelled out.

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

delivery_get_by_slugA
Read-only

Read one content item by its slug (the last URL segment). Slugs are unique only among siblings, so prefer delivery_get_by_path for a page's full URL. Returns the item as the public Delivery API serves it — published only (unless preview), private fields removed, plus computed urlPath, fieldTypes and SEO metadata on pages — or null when nothing matches. Use get_content to read a draft for editing.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
slugYesThe slug, without slashes, e.g. 'about-us'.
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
previewNotrue = read the latest drafts as the preview pane shows them (needs site-wide read access). Default false: published content only, exactly what visitors get.
populateNoHow many levels of references and shared blocks to resolve inline, 0-4 (default 0: references stay as ids).

TDQS

A4.9/5.0
Behavior5/5

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

With readOnlyHint already covering safety, the description adds substantial context beyond annotations: published-only unless preview, private fields removed, the computed urlPath/fieldTypes/SEO fields on pages, and the null return when nothing matches. This is exactly the return-shape and filtering disclosure that a read operation needs.

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 dense sentences, zero filler. The core 'read by slug' scope is front-loaded, followed by disambiguation, then return behavior. Every clause carries information.

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

Completeness5/5

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

No output schema exists, but the description fully covers the return contract (published-only filtering, computed fields, null on miss) and prerequisites (preview needs site-wide read). Nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all five parameters and the baseline is 3. The description adds real semantic value on top: slug uniqueness only among siblings, and preview semantics tying to the draft/live distinction, which informs how the parameter should be set.

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

Purpose5/5

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

States a specific verb and resource ('Read one content item by its slug') with a precise scope clause (slug = last URL segment). It proactively distinguishes itself from siblings delivery_get_by_path and get_content, so an agent can select it without opening other schemas.

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

Usage Guidelines5/5

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

Explicit routing advice: 'prefer delivery_get_by_path for a page's full URL' and 'Use get_content to read a draft for editing.' Both the preferred alternative and the when-not condition are named, leaving nothing to inference.

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

delivery_globalA
Read-only

Read a global singleton (header, footer, site settings…) by its type, as the website receives it. Find the types with list_globals. Returns the item as the public Delivery API serves it — published only (unless preview), private fields removed, plus computed urlPath, fieldTypes and SEO metadata on pages — or null when nothing matches. Use get_content to read a draft for editing.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
typeYesThe global's content type name, e.g. 'SiteHeader'.
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
previewNotrue = read the latest drafts as the preview pane shows them (needs site-wide read access). Default false: published content only, exactly what visitors get.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description goes well beyond them: published-only unless preview, private fields removed, null when nothing matches, preview requires site-wide read access, and computed urlPath/fieldTypes/SEO fields are returned. That is rich behavioral context for a read tool.

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

Conciseness4/5

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

Core action is front-loaded in the first sentence, followed by discovery, return semantics, and the alternative. The middle sentence is dense with stacked parentheticals (computed fields, preview caveat), costing a little readability, but every clause carries information.

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

Completeness5/5

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

With no output schema, the description still explains the return shape (published content, private fields stripped, computed fields, null on no match), and annotations cover the safety profile. Nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so each of the four parameters is already documented in the schema; baseline 3 applies. The description restates preview semantics ('published only (unless preview)') but adds no syntax or format detail beyond what the schema provides.

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

Purpose5/5

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

States a specific verb and resource ('Read a global singleton ... by its type') and names the scope ('as the website receives it'), which cleanly distinguishes it from get_content and the delivery_* readers. An agent can identify what it does without opening the schema.

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

Usage Guidelines5/5

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

Names two concrete alternatives with their selecting conditions: 'Find the types with list_globals' and 'Use get_content to read a draft for editing.' It also implies when-not by contrasting public delivery reads against draft editing.

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

delivery_listA
Read-only

List the published content of one type as the website receives it (e.g. every BlogPost for a listing). Supports pagination (limit/offset), sorting and equality filters on data fields; without sort it follows the parent's declared child order. Private fields are removed. Returns { items, total }.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
sortNoname | createdAt | data.<field>; prefix - for descending
typeYesContent type name, e.g. 'BlogPost'.
limitNoPage size, 1-500.
filterNoEquality filters on data fields, e.g. {"author": "Jane"}
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
offsetNoItems to skip, for paging.
previewNotrue = read the latest drafts as the preview pane shows them (needs site-wide read access). Default false: published content only, exactly what visitors get.
populateNoHow many levels of references and shared blocks to resolve inline, 0-4 (default 0: references stay as ids).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true and openWorldHint=false; the description goes further by disclosing that private fields are stripped, that omitting sort falls back to the parent's declared child order, and that the response is { items, total }. It stops short of covering the preview/permission nuance (that lives in the schema) or any rate-limit/paging caveats.

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 sentences, purpose front-loaded, and the final clause carries the return shape rather than padding. Dense but every clause carries information; only the parenthetical example borders on redundant.

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

Completeness4/5

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

With nine parameters, no output schema, and nested filter objects, the description supplies the return shape, private-field removal, and default sort behavior an agent needs. It is thin on how populate/locale/preview interact, but those are reasonably covered in the schema itself.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema does not: the default ordering when sort is absent, and the fact that filters apply to data fields specifically. This meaningfully supplements the parameter docs.

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

Purpose5/5

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

States a specific verb and resource ('List the published content of one type') plus the delivery-side framing ('as the website receives it'), which cleanly separates it from the management-content siblings and from delivery_search/delivery_get_by_id. The BlogPost example makes the unit of return unambiguous.

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

Usage Guidelines3/5

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

The description implies when this tool applies (enumerating all items of one type for a listing) but never names an alternative such as delivery_search or get_content, nor states when-not to use it. Usage is inferable but not guided.

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

delivery_startA
Read-only

Read this site's start page — the page served at / (set with set_start_page) — as the website receives it. Null when no start page is set. Returns the item as the public Delivery API serves it — published only (unless preview), private fields removed, plus computed urlPath, fieldTypes and SEO metadata on pages — or null when nothing matches. Use get_content to read a draft for editing.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
previewNotrue = read the latest drafts as the preview pane shows them (needs site-wide read access). Default false: published content only, exactly what visitors get.
populateNoHow many levels of references and shared blocks to resolve inline, 0-4 (default 0: references stay as ids).

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds substantial behavioral context beyond that: it returns published content only unless preview is set, strips private fields, adds computed urlPath, fieldTypes and SEO metadata on pages, and returns null when no start page is set or nothing matches.

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 front-loaded with purpose and return behavior, and each sentence mostly earns its place. The null condition is stated twice in slightly different forms, which is a minor redundancy, but overall it remains efficient and well structured.

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

Completeness5/5

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

There is no output schema, but the description explains the returned item structure and the null cases clearly. Combined with the fully documented input schema and read-only annotations, an agent has everything needed to invoke and interpret this tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the four parameters are already fully documented in the input schema. The description mentions preview and general delivery behavior but does not add syntax or format details beyond what the schema provides, making the baseline 3 appropriate.

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

Purpose5/5

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

The description states a specific verb and resource: read this site's start page served at /. It distinguishes clearly from sibling get_content by naming it as the tool for reading drafts. An agent can identify the exact operation without opening the schema.

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

Usage Guidelines5/5

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

It gives explicit usage context: use this to read the public Delivery API view of the start page, and use get_content instead when reading a draft for editing. The published-only / preview distinction further clarifies when this tool is appropriate.

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

discard_draftA
Destructive

Throw away the unpublished draft changes of one locale, so the working version falls back to the published one. The live site is unchanged; the discarded draft cannot be recovered. Refused for content that was never published (there is nothing to fall back to) — use trash_content to remove that instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds real context beyond them: the live site is unchanged, the discarded draft is unrecoverable, the document falls back to the published version, and the operation is refused for never-published content. The only minor gap is it doesn't describe the failure/response shape, but the behavioral profile is well disclosed.

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 written sentences, front-loaded with the core action, then the side-effect/irreversibility, then the refusal condition and alternative. 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?

For a destructive mutation with no output schema, the description supplies the fallback semantics, irreversibility, scope (one locale), and the negative case routing, all on top of annotations that cover the safety profile. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and each parameter (site, locale, documentId) is fully documented in the schema itself. The description only alludes to the locale parameter scope; it adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (throw away), a precise resource (unpublished draft changes of one locale), and the resulting state (working version falls back to published). It also names the sibling it is not for, so an agent can distinguish it from trash_content without opening a schema.

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

Usage Guidelines5/5

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

Explicitly covers when to use it (discard draft changes for a locale), the exclusion condition (refused for content that was never published), and the alternative to use instead (trash_content). Nothing about selection is left to inference.

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

duplicate_contentA

Copy a content item into a NEW unpublished document beside the original (same parent), named " (copy)", with every field of each locale's working version. A copied page gets a fresh slug, so it never collides with the original's URL. Children are not copied. Returns the new item; edit it, then publish.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare the generic non-read-only/non-destructive/non-idempotent profile; the description adds substantive traits: the copy lands in a new unpublished document with a fresh slug so it cannot collide with the original URL, children are NOT copied, and all locale working-version fields are carried over. These are exactly the behavioral details an agent needs and none are recoverable from the annotations.

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

Conciseness5/5

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

Three tightly packed sentences, front-loaded with the core action and followed by the collision/children caveats and the follow-up workflow. No filler.

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

Completeness5/5

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

For a 3-parameter, no-output-schema duplication tool, the description covers what is created, where it lands, naming, slug safety, child behavior, and the return value plus next action. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the parameter baseline is 3; the description adds meaning by referring to per-locale working versions, clarifying what the locale parameter selects. It does not add syntax detail beyond the schema, but the locale clarification is a genuine increment.

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

Purpose5/5

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

States a specific verb (copy/duplicate) plus the exact resource and result shape: a NEW unpublished document beside the original, same parent, named "<name> (copy)", with working-version fields. It also implicitly separates itself from copy_variant by scoping to a whole content item rather than a locale variant, and from create_content by copying existing content.

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

Usage Guidelines4/5

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

Gives clear workflow context ("Returns the new item; edit it, then publish") and states the copy is unpublished, so an agent knows the next steps. It does not explicitly name alternatives (e.g. copy_variant for a single locale version) or the when-not to use this rather than create_content.

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

erase_form_submissionsA
Destructive

Data-subject erasure: delete EVERY submission in the active site whose answers contain this email address, in any field. Irreversible; requires submission.manage. Returns {deleted: }; the audit log records that an erasure happened, never the address. Copies in database backups survive until the backups rotate.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
emailYesThe address to erase, matched case-insensitively across all answers.

TDQS

A4.5/5.0
Behavior5/5

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

Despite annotations already flagging destructiveHint=true, the description adds substantial context: irreversibility, the required submission.manage permission, the return shape {deleted: <count>}, the audit-log behavior (records the erasure, never the address), and the caveat that backup copies persist until rotation. This is rich behavioral disclosure an agent can act on.

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 dense sentences, front-loaded with the core action and then the safety-critical facts (irreversibility, permission, return shape, retention). No filler; each clause carries operational weight.

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

Completeness5/5

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

With no output schema, the description supplies the return shape, plus permission requirements and backup-retention caveats that matter for a destructive bulk operation. An agent has everything needed to invoke this correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented, and the description largely restates the email matching rule ('case-insensitively across all answers'). It adds no new syntax or format detail and does not address the site parameter, so the baseline 3 applies.

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

Purpose5/5

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

Uses a specific verb (erase/delete) on a specific resource (form submissions) and defines scope precisely: EVERY submission in the active site whose answers contain the email, in any field. This clearly distinguishes it from the sibling delete_form_submission, which targets a single submission.

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 framing 'Data-subject erasure' makes the intended scenario clear, and the email-match semantics imply when this bulk tool is appropriate versus a single-deletion sibling. It stops short of explicitly naming delete_form_submission as the alternative for single-record cases, so no true when-not guidance is given.

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

export_form_submissionsA
Read-only

Export form submissions as CSV text (one row per submission, one column per field) and return it with the row count. This is a copy of visitor personal data: the export is audit-logged and requires submission.read.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
formIdNoExport only this form (formId from list_forms). Omit to export every form in the site.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: the export is audit-logged, requires the submission.read scope, and constitutes a copy of sensitive visitor personal data — all things an agent should weigh before calling.

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

Conciseness5/5

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

Two sentences with no filler: the output contract leads and the sensitive-data/permission caveat follows. Every clause carries information an agent needs.

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

Completeness4/5

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

There is no output schema, so the description correctly compensates by stating the CSV structure and the returned row count. It also covers the auth requirement, leaving little an agent would need to know before invoking it.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (site, formId) are fully documented there, including the list_sites/list_forms pointers. The description adds no parameter syntax or scoping detail, so the baseline 3 applies.

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

Purpose4/5

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

The description gives a specific verb and resource ('Export form submissions') and even specifies the output shape ('as CSV text, one row per submission, one column per field'). It never names a sibling tool, so it stops short of the explicit differentiation a 5 requires.

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

Usage Guidelines3/5

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

Usage is only implied — an agent can infer this is for bulk CSV extraction rather than the JSON-returning list_form_submissions/get_form_submission, but the description says nothing explicit about when to prefer it or when not to use it.

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

export_type_templatesA
Read-only

Export type templates as a portable JSON document ({format, version, exportedAt, templates}) that import_type_templates on another Paperboy instance accepts. Omit names to export everything (built-ins included).

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
namesNoTemplate names to export (default: all)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond them: the exact returned document structure ({format, version, exportedAt, templates}) and cross-instance portability, which tells the agent the payload is a migration artifact, not just data. It does not discuss permissions or size limits, keeping it short of a 5.

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

Conciseness5/5

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

Two sentences, zero filler, and the most decision-relevant facts (what the export is and who consumes it) are front-loaded before the scoping note about omitting names.

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

Completeness4/5

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

There is no output schema, so the description correctly compensates by describing the returned document shape and its intended consumer. Combined with a fully documented input schema and read-only annotations, an agent has enough to call it correctly; only error/edge behavior (e.g., unknown template names) is unaddressed.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: omitting names exports everything and explicitly includes built-ins, clarifying the scope of the schema's '(default: all)'. It adds no further guidance on the site parameter, which the schema handles well.

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

Purpose5/5

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

Names a specific verb (export) and resource (type templates), and states the exact output artifact: a portable JSON document with a defined shape. It also names the sibling consumer (import_type_templates) so the agent can immediately distinguish it from list_type_templates or get_type_template.

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?

Clear on the key usage decision: omitting names exports everything, including built-ins, and the output is meant to be consumed by import_type_templates on another instance. It stops short of stating when NOT to use it (e.g., use list_type_templates for inspection rather than migration), so it is clear context rather than full routing.

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

get_contentA
Read-only

Read one content item for editing: its working version (the draft if one exists, else the published version) in one locale, with name, slug, status, revision and the full data field map. Read this before update_content so you merge into current values, and pass its revision when replacing with merge:false. To see what visitors get instead (published only, private fields removed), use delivery_get_by_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description goes further by disclosing the version-resolution rule (draft if one exists, else published) and enumerating what is returned (name, slug, status, revision, full data map), which is real behavioral context the annotations do not carry.

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

Conciseness5/5

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

Three well-formed sentences, each earning its place: the return shape is front-loaded, then the merge workflow, then the alternative tool. Zero filler.

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

Completeness5/5

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

For a single-item read with no output schema, the description names the returned fields and the resolution behavior, and covers the mutation workflow it feeds into. An agent has everything required to call it correctly and use its result.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds actionable meaning by tying the returned `revision` value to the subsequent update_content call with merge:false, which is not expressed in the schema and clarifies how the returned fields are meant to be consumed.

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

Purpose5/5

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

States a specific verb (Read) and resource (content item for editing) with precise scope: the working version, resolving draft-vs-published, in one locale. It explicitly distinguishes itself from the sibling delivery_get_by_id, so an agent can separate the editing view from the delivery view without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use guidance ('read this before update_content so you merge into current values') and an exclusion routing the agent to the alternative ('To see what visitors get instead... use delivery_get_by_id'). Nothing about tool selection is left to inference.

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

get_content_typeA
Read-only

Get one content type's definition: name, kind, displayName, schemaType and its fields (name, type, required, options, allowed blocks of a content area…). Each field includes valueFormat + valueExample — the exact JSON shape create_content/update_content expect. Call this before writing content of a type. Returns null for an unknown name.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesContent type name, PascalCase, e.g. 'BlogPost' (as in a content item's `type`).
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond that: it returns null for an unknown name and that each field carries valueFormat/valueExample showing the exact JSON create_content/update_content expect.

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

Conciseness4/5

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

Front-loads the resource and its contents, then adds the workflow directive and the null behavior. Dense but each clause earns its place; the parenthetical field list and trailing ellipsis make it slightly unpacked.

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

Completeness4/5

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

No output schema exists, so the description must describe the return value itself — and it does, including the field shape, value format, and null case. Coverage is strong, though the ellipsis leaves the full field enumeration open.

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

Parameters3/5

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

Schema description coverage is 100%, so both 'name' and 'site' are fully documented in the schema (including the multisite gotcha). The description adds nothing about parameter meaning, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb ('Get one') and resource ('content type's definition') and then enumerates the exact return surface (name, kind, displayName, schemaType, fields). The singular framing cleanly distinguishes it from the sibling list_content_types.

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

Usage Guidelines4/5

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

Gives a concrete trigger — 'Call this before writing content of a type' — tying it to create_content/update_content. It does not explicitly contrast with list_content_types or get_content, so the alternative-selection guidance is implicit rather than spelled out.

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

get_form_submissionA
Read-only

Get one form submission in full: its answers with the field-label snapshot, the form it belongs to, when it was received and when retention deletes it. Requires submission.read.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
submissionIdYesThe submission's id from list_form_submissions.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context beyond that: it requires submission.read and describes that the returned submission includes answers with field-label snapshots, the parent form, receipt time, and retention deletion time.

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 waste. The core retrieval behavior and returned content are front-loaded, followed by the concise permission requirement.

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 read-by-ID tool with full schema coverage and annotations, the description is complete. It covers the return payload despite the absence of an output schema, and adds the necessary authorization requirement.

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

Parameters3/5

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

Schema description coverage is 100%, and both parameters are fully documented in the input schema. The description adds only 'one form submission' and the permission requirement, not additional parameter syntax or format details, so baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb ('Get'), resource ('one form submission'), and scope ('in full'), with the singular framing distinguishing it from sibling list_form_submissions and export_form_submissions. An agent can immediately tell this is the single-record read operation.

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 clearly frames this as retrieving one submission by ID and adds an authorization prerequisite ('Requires submission.read'). It does not explicitly name alternatives such as list_form_submissions for finding IDs, but the single-record context and schema reference to list_form_submissions make usage clear.

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

get_site_configB
Read-only

Get this site's configuration: startPageId (the page served at /, or null) and previewBaseUrl (the frontend origin the admin's preview frames). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so 'Read-only' in the description is largely redundant. It does add useful meaning about the returned values (startPageId may be null, previewBaseUrl is the admin preview origin), but says nothing about permissions, error states, or default-site fallback when site is omitted.

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

Conciseness5/5

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

A single front-loaded sentence that defines both returned fields and closes with the safety trait. No filler or redundancy; every clause carries information.

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

Completeness4/5

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

With no output schema, the description usefully explains the two config fields an agent will receive, and the schema handles the sole parameter. It is nearly complete for a simple read tool, though it omits any note on behavior when the site is unknown or lacks a configured start page.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'site' parameter is fully documented in the schema, including the multisite fallback and the list_sites hint. The description adds no parameter-level detail, so the 3 baseline for high coverage applies.

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

Purpose4/5

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

The description gives a specific verb+resource (get this site's configuration) and enumerates the exact fields returned (startPageId, previewBaseUrl), so an agent knows precisely what it fetches. It does not explicitly differentiate itself from adjacent siblings like set_start_page or list_sites, which keeps it short of a 5.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no stated prerequisites, and no named alternatives. The agent is left to infer that this is the read counterpart to set_start_page. Only the implicit context of 'configuration' hints at usage.

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

get_type_templateA
Read-only

Get one type template's full ContentTypeDef by name (stored or built-in), each field annotated with valueFormat + valueExample. Use it to inspect a template before instantiate_type_template, or as a starting definition for create_content_type.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTemplate name as listed by list_type_templates, e.g. 'FaqPage'.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.3/5.0
Behavior4/5

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

With readOnlyHint=true and openWorldHint=false already covering the safety profile, the description adds useful return-shape context: full ContentTypeDef fields annotated with valueFormat + valueExample, and that templates may be stored or built-in. It does not add permission, rate-limit, or error behavior details.

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 two tight sentences with no wasted words. It front-loads what the tool returns, then immediately gives the intended usage context.

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 no output schema, the description adequately explains what an agent receives: a full ContentTypeDef with per-field valueFormat and valueExample annotations. The input schema already covers parameter details, so the definition is complete for calling this read-only lookup tool.

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

Parameters3/5

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

Schema description coverage is 100%, so the name and site parameters are already documented in the schema. The description only restates that lookup is by name and does not add additional parameter semantics 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 states a specific verb and resource: get one type template's full ContentTypeDef by name, including stored or built-in templates. It distinguishes this one-template read from siblings like list_type_templates and make_type_template by emphasizing the full definition and field annotations.

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

Usage Guidelines4/5

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

It clearly names two use cases: inspecting a template before instantiate_type_template and using it as a starting definition for create_content_type. However, it does not explicitly state when not to use it or contrast it directly with list_type_templates.

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

import_stock_imageA

Import a stock photo (by the id from search_stock_images) into the media library. Downloads the image, stores it as a regular asset with alt text + attribution, and returns the asset — set its documentId on an image field with set_field.

ParametersJSON Schema
NameRequiredDescriptionDefault
altNoAlt text override (defaults to the provider's description)
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
providerIdYesPhoto id from search_stock_images

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare the mutation/external-network profile (readOnlyHint=false, openWorldHint=true), and the description adds genuinely useful behavior beyond that: it downloads the image, stores it as a regular asset, and attaches alt text + attribution. It does not spell out that repeat calls create duplicate assets (non-idempotent), so it stops short of a 5.

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

Conciseness5/5

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

Two dense sentences that front-load the operation, then the mechanics, then the downstream instruction. No filler and nothing repeated from structured 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?

For a 3-param mutation with no output schema, the description covers purpose, side effects, and the follow-up step well enough to invoke correctly. The one gap, that importing the same providerId twice yields duplicate assets, is partially mitigated by the idempotentHint=false annotation.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all three parameters (alt override, site, providerId). The description's phrase 'by the id from search_stock_images' adds provenance for providerId, but the rest adds no meaning beyond the schema, so baseline 3 holds.

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

Purpose5/5

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

States a specific verb (import), resource (stock photo), and destination (the media library), and ties the input source directly to the sibling search_stock_images. It is clearly distinguishable from upload_asset and search_stock_images without opening any schema.

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

Usage Guidelines4/5

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

It establishes the workflow context (get the id from search_stock_images, then set the returned documentId with set_field), which tells the agent where this sits in the chain. It stops short of any when-not guidance or explicit exclusions versus alternatives like upload_asset.

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

import_type_templatesA

Import type templates from an export document. Per-template outcome: new names are created; existing stored templates are skipped unless overwrite: true; built-in names are always skipped (they ship with every instance). Returns {created, updated, skipped:[{name, reason}]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
overwriteNoUpdate existing stored templates from the import (default false)
templatesYesThe export document's templates array (full ContentTypeDef objects)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only supply the generic write profile (readOnly=false, destructive=false, idempotent=false). The description adds real behavior beyond that: per-template create/skip outcomes, the built-in-name skip policy, and the overwrite gate. It does not mention permissions or the 200-item cap, so not a 5.

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

Conciseness5/5

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

Three tight sentences with the core action front-loaded, followed by outcome semantics and return shape; every clause carries information and none is padding.

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

Completeness4/5

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

With no output schema, the description usefully discloses the return shape {created, updated, skipped:[{name, reason}]} and the built-in skip rule, which are the facts an agent needs before calling. It omits error/limit behavior (e.g., the 200-template max), keeping it just short of complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description hints at overwrite's effect ('existing stored templates are skipped unless overwrite: true'), which mildly enriches the schema's own wording, but it adds nothing for site or templates. Baseline holds.

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

Purpose5/5

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

States a specific verb ('Import') and resource ('type templates') plus the source ('from an export document'), which cleanly separates it from create_type_template and its natural counterpart export_type_templates. An agent can identify the operation without opening the schema.

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

Usage Guidelines4/5

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

It establishes the context of use (bulk restore from an export document) and the conditional rule for overwrite:true, but never names export_type_templates as the producing sibling or states when to prefer per-template creation instead. Context is clear; alternatives are left implicit.

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

instantiate_type_templateA

Materialise a type template into a real content type. Default: creates the type under the template's own name. If that type already exists the call is REFUSED (409) — pass updateExisting: true to re-apply the template onto the existing type (kind must match; existing content is not migrated), or asName: "OtherName" to create a type with a DIFFERENT name (must match ^[A-Z][a-zA-Z0-9]*$, e.g. "CaseStudy"). Pass withBlocks: true to ALSO create the block types the template's content areas reference (recursively; existing types are left untouched) — recommended for built-ins like FaqPage so the set works out of the box.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTemplate name
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
asNameNoCreate the type under this name instead of the template's
withBlocksNoAlso create the block types this template's content areas allow-list (default false)
updateExistingNoOverwrite the existing type of the same name from the template (default false)

TDQS

A4.5/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: the default action, the 409 refusal on name collision, the kind-match prerequisite for updateExisting, the explicit note that existing content is not migrated, and the recursive, non-overwriting semantics of withBlocks. The annotations only declare it is a non-read-only, non-idempotent, non-destructive write; the description supplies the failure modes and side effects an agent needs.

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

Conciseness4/5

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

Front-loads the default behavior before the exception branches, and each clause covers a distinct decision the caller must make. It is dense and uses heavy capitalization for emphasis, but the length is justified by the number of distinct branches; nothing reads as 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?

Covers creation, collision handling, naming, and block dependencies for a 5-parameter write tool, which is nearly everything needed. The one gap is that with no output schema present, the description never says what is returned (e.g., the new type's id/kind), so the caller cannot tell how to reference the created type afterwards.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: the asName regex ^[A-Z][a-zA-Z0-9]*$ with a worked example, and the clarification that withBlocks recurses and leaves existing types untouched. The 'kind must match' constraint on updateExisting is likewise not in the 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 a specific verb and resource: 'Materialise a type template into a real content type.' This clearly distinguishes it from the sibling template-authoring tools (create_type_template, update_type_template) and from create_content_type, which makes a type from scratch rather than from a template.

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

Usage Guidelines4/5

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

Gives explicit when-to-use conditions for each mode: default creation, updateExisting: true when the type already exists, asName when a different name is wanted, and withBlocks for built-in templates like FaqPage. It does not name sibling tools as alternatives, but the branching guidance is concrete enough that an agent knows which parameters to set in which situation.

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

list_assetsA
Read-only

List this site's media library (images and PDFs): each asset's documentId, filename, mime, size, public url, alt text, attribution for stock imports, and folder. An image field stores the asset's documentId — set it with set_field. To add files use upload_asset, create_upload_link or import_stock_image.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish the safety profile (readOnlyHint=true, openWorldHint=false), so the description's added value is the returned-field inventory, the documentId/set_field relationship, and the write-path alternatives. It doesn't mention pagination or result limits, which is the remaining gap for a listing tool.

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

Conciseness4/5

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

Front-loaded with the core action and scope, then dense but useful detail. The field enumeration is long but earns its place since there is no output schema; no filler sentences.

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

Completeness4/5

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

For a read-only list tool with one fully documented parameter and no output schema, the description usefully substitutes for a return-schema by naming the asset fields. Only pagination/ordering behavior is left unspecified.

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

Parameters3/5

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

Schema coverage is 100% and the single 'site' parameter is fully documented in the schema, including the list_sites pointer and the empty-tree troubleshooting hint. The description adds nothing about the parameter, so the baseline 3 is correct.

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

Purpose5/5

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

States a specific verb ('List') and resource ('this site's media library (images and PDFs)'), then enumerates exactly which fields are returned. An agent can distinguish this read/list tool from the write-path siblings without opening any schema.

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

Usage Guidelines4/5

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

Explicitly routes the agent away from this tool for writes by naming three alternatives (upload_asset, create_upload_link, import_stock_image), and clarifies the cross-tool relationship with set_field. It doesn't spell out when to prefer this over any other listing, but no close sibling list tool exists, so the guidance is effectively complete.

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

list_auditA
Read-only

Read the append-only audit log, newest first: who did what (create, publish, delete, login, export…), when, to which document, from which surface (ip 'mcp' = agent). Use it to find out who changed something. Requires audit.read and a token not limited to one site.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLatest time, ISO 8601.
fromNoEarliest time, ISO 8601, e.g. '2026-10-01T00:00:00Z'.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
limitNoRows to return, 1-500 (default 100).
actionNoAction prefix, e.g. 'content.' (a whole category) or 'content.publish'.
beforeNoPaging cursor: the id of the oldest row you already have.
documentIdNoOnly actions on this document.
actorUserIdNoOnly actions by this user id (from list_users).

TDQS

A4.4/5.0
Behavior5/5

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

Beyond readOnlyHint/openWorldHint it discloses the log is append-only, that results are ordered newest-first, that the actor's surface is recorded (ip 'mcp' = agent), and a non-obvious auth constraint — a token scoped to a single site cannot use it. That auth detail is exactly the kind of failure mode an agent would otherwise hit blind.

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 compact sentences, front-loaded with what it returns before the use case and the auth requirement. Dense with signal and free of 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 an 8-parameter read tool with no output schema, the description covers return content (actor, action, time, document, surface), ordering, and auth. Paging mechanics and default row limits are not addressed, but the schema documents those 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%, so the baseline is 3. The description adds only indirect value: the action examples ('create, publish, delete, login, export…') hint at the vocabulary the 'action' prefix parameter expects, and 'newest first' motivates the 'before' cursor, but the cursor and limit behavior are left entirely to the schema.

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

Purpose5/5

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

States a specific verb and resource ('Read the append-only audit log') plus the ordering ('newest first') and the record shape ('who did what... when, to which document, from which surface'). No sibling tool does audit-log reading, so an agent can select it unambiguously.

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

Usage Guidelines4/5

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

'Use it to find out who changed something' gives a concrete triggering scenario, and the prerequisite ('Requires audit.read and a token not limited to one site') is stated explicitly. It stops short of naming an alternative or a when-not-to-use case, but no sibling offers overlapping capability.

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

list_blocksA
Read-only

List this site's SHARED blocks — reusable block documents (banners, forms, CTAs…) that pages place by reference in a content area, so one edit updates every page using them. Each has documentId, type, name, per-locale status and folderId. Edit one with get_content/update_content on its documentId. Inline blocks live inside a page's data and are not listed here.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.3/5.0
Behavior4/5

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

The readOnlyHint annotation already establishes this is a safe read, but the description goes further by explaining the shared-reference semantics (one edit updates every page using them) and enumerating the returned fields (documentId, type, name, per-locale status, folderId). That return-shape disclosure is genuinely valuable given there is no output schema.

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

Conciseness5/5

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

Three sentences, front-loaded with the core purpose, then the return shape, then the edit path, then the exclusion. Every sentence carries distinct information with no repetition of the name or structured fields.

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

Completeness5/5

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

For a single-parameter, read-only list tool with no output schema, the description covers purpose, the crucial shared-vs-inline distinction, the returned fields, and the follow-up editing path. Nothing essential for correct invocation is missing.

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

Parameters3/5

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

There is only one parameter (site) and schema description coverage is 100%, so the schema already documents it fully, including the multisite default behavior and the list_sites pointer. The description adds only the implicit 'this site's' scoping; baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb (list) and resource (shared/reusable blocks), and immediately disambiguates from inline blocks — a real distinction an agent would otherwise miss. It also names the representative subtypes (banners, forms, CTAs), making it distinguishable from siblings like list_pages and list_globals.

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 a clear exclusion (inline blocks are not listed here) and routes the agent to the correct follow-up tools for modification (get_content/update_content on documentId). It does not explicitly contrast against other list tools such as list_globals or list_pages, so it stops short of full when/when-not guidance.

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

list_content_typesA
Read-only

List every content type in the instance (shared by all sites): its name, kind (page | block | global) and fields, each field annotated with valueFormat + valueExample — the JSON shape update_content expects. Large; when you already know the type, get_content_type returns just that one.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), but the description adds real behavioral context the annotations do not: the call is expensive ('Large') and its results are instance-wide ('shared by all sites'), which warns the agent against expecting a small, site-scoped payload. It stops short of stating pagination or size limits, so not a 5.

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

Conciseness4/5

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

Front-loaded with the purpose and return shape, then the routing hint; no filler sentences. The heavy em-dash chain in the first sentence makes it dense but every clause carries information (scope, fields, field annotation keys).

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

Completeness5/5

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

There is no output schema, so the description correctly carries the burden of describing return values, and it does: type name, kind enum, and per-field valueFormat/valueExample described as 'the JSON shape update_content expects,' which also connects it to the downstream mutation tool. Nothing needed to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% for the single `site` parameter, so baseline is 3. The description earns an extra point by clarifying that content types are shared across all sites, which explains why `site` has limited filtering effect here — a nuance the schema text does not convey.

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

Purpose5/5

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

States a specific verb and resource ('List every content type in the instance') and goes further by enumerating the returned shape: name, kind (page | block | global), and fields with valueFormat + valueExample. It also distinguishes itself from the sibling get_content_type, so an agent can choose between them without opening a schema.

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

Usage Guidelines5/5

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

Explicitly gives the alternative and the condition that selects it: 'Large; when you already know the type, get_content_type returns just that one.' That is a when-to-use and when-not-to-use rule in a single clause.

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

list_delivery_keysA
Read-only

List this site's Delivery API keys — the credentials a website uses to read content: id, name, type (public | preview) and timestamps. Secrets are never shown again after creation. Admin only.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: it states that the operation is 'Admin only' and warns that 'Secrets are never shown again after creation,' which is important for an agent to understand the scope and security limitations of this read operation.

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 compact and front-loaded: it starts with the core action and resource, then appends the returned fields and important caveats. Every phrase earns its place, and there is no redundant or filler language.

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, read-only, single-optional-parameter tool with no output schema, the description is complete enough. It lists the fields returned (id, name, type, timestamps), notes the admin-only requirement, and explains that secrets are not retrievable, covering what an agent needs to invoke and interpret the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, and the single 'site' parameter already has a detailed schema description covering multisite behavior, defaults, and a pointer to list_sites. The description adds no additional syntax or semantics for the parameter, so the baseline of 3 is appropriate when the schema does the heavy lifting.

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

Purpose5/5

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

The description uses a specific verb ('List') and resource ('this site's Delivery API keys'), then explains what those keys are: 'the credentials a website uses to read content.' It also enumerates the returned fields (id, name, type, timestamps), making the tool's purpose unambiguous and easy to distinguish from sibling delivery-key tools like create_delivery_key or revoke_delivery_key.

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 provides one clear usage constraint ('Admin only') and hints that secrets are not retrievable after creation, which implies this tool is for reviewing existing keys rather than creating them. However, it does not explicitly state when to use this tool versus alternatives such as create_delivery_key, rename_delivery_key, or revoke_delivery_key, leaving sibling routing to inference.

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

list_formsA
Read-only

List the forms (Form blocks) in this site with formId, name, submission count and time of the last submission. Start here before list_form_submissions or export_form_submissions. Submissions are visitor personal data: requires the submission.read permission (Admin/Editor).

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful non-annotation context: that returned data includes submission counts/last-submission timestamps, and that the data touches visitor personal data behind an Admin/Editor permission. It doesn't discuss pagination or limits, but it goes well beyond restating 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?

Three sentences, front-loaded with the resource and return fields, followed by the routing rule and then the permission/sensitivity note. Every sentence carries distinct, actionable information with no filler.

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

Completeness5/5

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

With no output schema, the description compensates by enumerating the returned fields. It also covers permission requirements, data sensitivity, and relative ordering versus sibling form tools, while the schema handles the site-default behavior. An agent has everything needed to call this correctly.

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

Parameters3/5

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

Schema coverage is 100% and the single 'site' parameter is documented in the schema with multisite/default-site guidance and a pointer to list_sites. The description adds nothing about the 'site' parameter, so the schema carries the full burden and baseline 3 applies.

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

Purpose5/5

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

Specific verb+resource ('List the forms (Form blocks) in this site') and it enumerates the fields returned (formId, name, submission count, last submission time). It clearly distinguishes itself from sibling tools like list_form_submissions and export_form_submissions by positioning itself as the enumeration 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?

It explicitly says to use this 'before list_form_submissions or export_form_submissions', giving the agent a clear entry-point rule, and it names the required permission (submission.read, Admin/Editor) with the reason (visitor personal data). Both the when-to-use condition and the prerequisites are stated.

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

list_form_submissionsA
Read-only

List form submissions in this site, newest first, one page at a time. Answers come with a snapshot of the field labels as they were when submitted, so a later edit to the form does not rewrite history. Visitor personal data: requires submission.read. For a full copy as a file use export_form_submissions.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
limitNoPage size, 1-200 (default 50).
formIdNoLimit to one form's submissions (its formId from list_forms). Omit for all forms.
offsetNoRows to skip, for paging (default 0).

TDQS

A4.5/5.0
Behavior5/5

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

Annotations give readOnlyHint, but the description adds genuinely new behavioral context: newest-first ordering, pagination, a permission requirement ('requires submission.read' for visitor personal data), and the important snapshot semantics where labels reflect submission time and resist later form edits.

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 dense sentences, front-loaded with the core list scope, then behavior, then the alternative. Every sentence adds distinct value with no filler.

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

Completeness5/5

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

No output schema exists, yet the description covers what comes back (submissions with historical field-label snapshots), ordering, and paging. Combined with full schema coverage and readOnly annotations, an agent has everything needed to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters (site, limit, formId, offset) are already documented in the schema. The description adds nothing per-parameter, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('List form submissions') plus scope ('in this site') and ordering ('newest first'). It also implicitly distinguishes itself from export_form_submissions and get_form_submission by describing itself as a paged list rather than a file or a single record.

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

Usage Guidelines4/5

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

Explicitly routes the agent to export_form_submissions when a file copy is wanted, and states the paging model ('one page at a time'). It does not mention get_form_submission for single-record retrieval, so guidance is clear but not exhaustive.

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

list_globalsA
Read-only

List this site's global singletons (header, footer, site settings…). Globals are NOT in the page tree and are not blocks, so this is the only way to enumerate them; edit one with get_content/update_content/set_field on its documentId, like any other document.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds meaningful context that globals live outside the page tree, are not blocks, and behave like ordinary documents for editing. It does not cover return shape or ordering, but as a list tool with annotations the bar is low.

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

Conciseness5/5

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

Two tight sentences, zero filler: the identity/scope comes first, then the crucial structural fact, then the editing route. Every clause earns its place.

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

Completeness4/5

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

For a read-only enumeration tool with annotations covering safety and a fully documented parameter, the description supplies the key structural insight (globals are not in the tree/blocks) plus editing guidance. The only mild gap is the absence of any return-shape note, though the examples imply the item type.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'site' parameter is fully documented in the schema (including the multisite default and the list_sites hint). The description adds no parameter-level detail, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (List) and resource (this site's global singletons), with concrete examples (header, footer, site settings). It explicitly differentiates from sibling concepts by noting globals are NOT in the page tree and are not blocks.

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 says this is the only way to enumerate globals, ruling out list_pages/list_blocks/tree for this content type, and it routes the agent to the follow-up editing tools (get_content/update_content/set_field on the documentId), matching the sibling set.

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

list_localesA
Read-only

List the enabled locales (language branches), in order, with which one is the default. Each content item has one variant per locale; pass these codes as locale to other tools so text lands in the branch matching its language.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds useful behavioral context beyond that: locales are 'enabled', returned 'in order', one is the default, and each content item has one variant per locale. It does not contradict the annotations, though it omits details like auth needs or exact return shape.

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

Conciseness5/5

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

Two tight sentences, with the core purpose front-loaded and the usage note immediately after. Every clause carries useful information and there is no filler.

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

Completeness5/5

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

For a simple read-only list tool with no output schema, the description covers purpose, ordering, default-locale behavior, and the downstream use of the returned codes. The schema fully covers the only parameter, so nothing critical is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the single `site` parameter is fully documented in the schema itself. The description adds no parameter-level meaning beyond what the schema provides, so the baseline of 3 applies.

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

Purpose5/5

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

The description gives a specific verb and resource — 'List the enabled locales (language branches)' — and adds scope details (enabled, ordered, default locale). It is clearly distinguishable from all siblings, none of which deal with locale enumeration.

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

Usage Guidelines4/5

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

It tells the agent what to do with the result: 'pass these codes as `locale` to other tools so text lands in the branch matching its language.' That is clear contextual guidance for a read-only helper tool. It does not state when not to use it, but no sibling alternative exists for this purpose.

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

list_not_foundA
Read-only

Paths that answered 404 on the frontend, most hits first (path only — no query string). coveredBy is the id of a rule that now answers the path. Create a redirect for the ones with real traffic.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real behavioral detail beyond that: result ordering (most hits first), the normalization rule (path only, no query string), and how to interpret the coveredBy field. It stops short of explaining volume/pagination limits.

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

Conciseness4/5

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

Three compact sentences, front-loaded with what the tool returns and followed by field interpretation and a call to action. Nothing is padded, though the final imperative is guidance rather than description of the tool itself.

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

Completeness4/5

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

There is no output schema, so the description usefully documents the returned shape (path, coveredBy) and ordering, which is what an agent needs to act on results. The only real gap is the absence of any pointer to the sibling tools that consume this output (create_redirect / test_redirect).

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

Parameters3/5

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

Only one optional parameter (site) exists and the schema describes it at 100% coverage, including the multisite default behavior and the pointer to list_sites. The description adds nothing about parameters, so the baseline 3 for schema-carried semantics applies.

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

Purpose5/5

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

Names a specific resource ('paths that answered 404 on the frontend') with a clear scope qualifier ('most hits first'), which is directly distinguishable from sibling list_redirects (redirect rules) and list_pages/list_content. An agent can tell what this returns without opening the schema.

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

Usage Guidelines3/5

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

It implies the follow-up action ('Create a redirect for the ones with real traffic'), which hints at why you'd call it, but never states when to use this versus list_redirects or test_redirect, nor any prerequisite like checking for an existing covering rule first. Usage is inferable but not explicit.

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

list_pagesA
Read-only

List EVERY page you can see in this site as one flat array (documentId, name, type, parentId, per-locale status) — no tree walking needed. Use it to find a page by name or to pick a parent/reference target; use tree to see one level in display order.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds useful behavioral context beyond that: the result is a single unscoped flat array (no tree walking), and it enumerates the returned fields including per-locale status. 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.

Conciseness5/5

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

Two sentences, zero waste, with the scope and output shape front-loaded before the routing advice. Every clause earns its place.

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

Completeness5/5

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

For a single-param read tool with no output schema, the description compensates by describing the array shape and its fields (documentId, name, type, parentId, per-locale status). Combined with annotations covering the safety profile, an agent has everything needed to call it correctly.

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

Parameters3/5

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

There is only one parameter ('site') and schema coverage is 100%, so the schema already fully documents it, including the multisite fallback and the 'call list_sites' tip. The description adds nothing about the parameter, which is the expected baseline when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb and resource ('List EVERY page you can see in this site') and pins down the output shape as 'one flat array'. It explicitly distinguishes itself from the 'tree' sibling, so an agent can choose without inspecting either schema.

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

Usage Guidelines5/5

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

Gives affirmative conditions ('find a page by name or to pick a parent/reference target') and a named alternative with its own use case ('use tree to see one level in display order'). This is explicit when-to-use plus when-to-use-the-other-tool routing.

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

list_redirectsA
Read-only

List the site's redirect rules with each target's live URL, hit counts and problems (target-missing, target-unpublished, shadowed, chain, loop). Rules apply on the frontend ONLY where no published page answers the path. Pass targetDocumentId to see which old URLs point at one page.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
targetDocumentIdNoOnly rules pointing at this page (documentId). Omit for all rules.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description nonetheless adds genuinely non-obvious behavior: redirects only resolve on the frontend when no published page answers the path, and it enumerates the problem classes the output reports. No pagination or return-format detail, which keeps it below 5.

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

Conciseness5/5

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

Three dense sentences, front-loaded with the core action and exposed fields, then the routing semantics, then the filter hint. Every clause carries distinct information with no filler.

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

Completeness5/5

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

For a read-only list tool with two optional parameters and no output schema, the description supplies the return shape (live URL, hit counts, problem categories) and the resolution semantics. Nothing needed to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so both parameters are already well documented (site slug/id, targetDocumentId filter). The description still adds interpretive value by framing targetDocumentId as 'which old URLs point at one page', clarifying the intended use beyond the schema's literal wording.

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

Purpose5/5

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

States a specific verb and resource ('List the site's redirect rules') and goes further by naming the returned diagnostics (target-missing, target-unpublished, shadowed, chain, loop). An agent can immediately distinguish this read from siblings create_redirect, update_redirect, delete_redirects and test_redirect.

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

Usage Guidelines3/5

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

It gives a semantic context ('rules apply on the frontend ONLY where no published page answers the path') and a param-directed use case ('Pass targetDocumentId to see which old URLs point at one page'). However, there is no explicit when-to-use-vs-alternatives guidance (e.g., versus test_redirect or list_not_found), so selection is only implied.

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

list_sitesA
Read-only

List the sites in this instance and say which one this server acts in. This server is pinned to ONE site (PAPERBOY_SITE, a slug or id); content in another site is invisible to every tool here, so an empty tree or search may mean the wrong site, not missing content.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real insight beyond that: the server is pinned to ONE site (PAPERBOY_SITE) and content in other sites is invisible to every tool here, which explains apparent empty results.

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, both earning their place, with the core purpose front-loaded and the diagnostic caveat following directly. No padding or restatement 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?

For a no-required-parameter read-only list tool with no output schema, the description covers purpose, scope, and the main failure mode. It could say more about what the returned site list looks like, but nothing essential to calling it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the single 'site' parameter is fully documented, including the 'omit to use default' behavior. The description largely restates that guidance rather than adding syntax, format, or edge-case detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ('List the sites in this instance') and adds a distinguishing behavior ('say which one this server acts in') that no sibling offers. An agent can tell it apart from get_site_config or tree without opening another schema.

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

Usage Guidelines4/5

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

Gives clear context for when to reach for it: diagnosing empty trees or searches caused by the wrong site. It does not name an alternative tool or an explicit 'do not use this when' condition, so it falls short of a full 5.

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

list_trashA
Read-only

List the trashed content you can see in this site, with documentId, type, kind, name and deletedAt. Use the documentId with restore_content.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already establish this as a safe read (readOnlyHint=true, openWorldHint=false), so the behavioral bar is lower. The description adds useful context by enumerating the returned fields (documentId, type, kind, name, deletedAt) and scoping visibility to the current site, but says nothing about ordering, pagination, or limits.

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

Conciseness5/5

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

Two short sentences, front-loaded with the core action and terminating with an actionable next step. No filler or redundancy.

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

Completeness4/5

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

With no output schema, the description correctly compensates by listing the returned fields, and the single parameter is fully documented in the schema. For a read-only list tool this is nearly complete, lacking only ordering/limit details.

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

Parameters3/5

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

Schema coverage is 100% and there is a single optional 'site' parameter whose schema description already explains multisite behavior and the list_sites fallback. The description's 'in this site' phrasing echoes the schema rather than adding new semantics, so baseline 3 applies.

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

Purpose4/5

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

The description states a specific verb and resource ('List the trashed content') and scopes it ('you can see in this site'), so the agent knows exactly what it does. It also names returned fields, but does not explicitly contrast itself with nearby siblings like tree or trash_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?

Usage is only implied: the mention of 'Use the documentId with restore_content' points to the downstream restore flow, which suggests this is the discovery step before restore. There is no explicit when-to-use/when-not guidance or named alternative among the many list_* siblings.

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

list_type_templatesA
Read-only

List all content-type templates — named ContentTypeDef recipes. Includes the BUILT-IN library (starter pages/blocks that ship with Paperboy, read-only) alongside stored templates. Each template's name is the content type name it materialises by default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that: built-ins are included in the result and are read-only, and the template name maps to the materialised content type name — both useful traits an agent can't get from the annotations.

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

Conciseness5/5

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

Three tight declarative sentences, zero filler, and the core definition is front-loaded before the built-in/stored distinction. Every sentence contributes distinct information.

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

Completeness4/5

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

For a read-only list tool with no output schema, the description adequately explains what the result contains and how to interpret template names. Return format details (pagination, ordering, field shape) are absent but not critical given the annotations and the tool's 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 description coverage is 100% and the single 'site' param is well documented in the schema, including the multisite fallback and the list_sites hint. The description adds nothing about the parameter, so the baseline 3 applies.

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

Purpose5/5

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

Specific verb (List) plus resource (content-type templates) and an explanatory gloss defining what a template is ('named ContentTypeDef recipes'). It also distinguishes the two categories returned (BUILT-IN library vs stored templates), which helps separate it from get_type_template (singular) and list_content_types (materialised types).

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

Usage Guidelines3/5

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

Usage is only implied: an agent infers this is the enumeration step before instantiate_type_template or get_type_template, but the description never states when to use it versus those siblings or any precondition. No when-not guidance is given.

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

list_usersA
Read-only

List every CMS user account (instance-wide): id, email, name, roles, section scopes, locked flag and createdAt. Requires the user.manage permission (Admin).

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true and openWorldHint=false, so the safety profile is already covered; the description adds the previously unstated authorization requirement (user.manage / Admin) and reveals the full return shape in the absence of an output schema. It stops short of disclosing pagination or result caps for what claims to be an instance-wide listing.

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: the identity and return shape come first, the authorization prerequisite second. Nothing is repeated or padded.

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

Completeness4/5

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

With no output schema, the description usefully compensates by naming the returned fields, and it discloses the permission gate. It is nearly complete for a zero-required-param read tool, missing only notes on result limits or pagination for a potentially large instance-wide listing.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'site' parameter already carries a rich description (multisite behaviour, default site, pointer to list_sites). The description adds nothing about the parameter, so the baseline 3 for schema-does-the-work applies.

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

Purpose5/5

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

States a specific verb (List) with a precisely scoped resource (every CMS user account, instance-wide) and even enumerates the returned fields (id, email, name, roles, section scopes, locked flag, createdAt). It is unambiguously distinct from the sibling mutation tools create_user, update_user and delete_user by verb alone.

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

Usage Guidelines3/5

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

Usage is implied by the verb and the stated prerequisite 'Requires the user.manage permission (Admin)', which is a genuinely useful gating condition. However, it never says when to reach for this tool versus an alternative, and there is no guidance on filtering, scoping or pagination behaviour to help an agent decide how to call it.

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

list_versionsA
Read-only

List a content item's version history in one locale, newest first: each version's id, versionNumber, status, whether it is the live one, name, and who created it when. Pass a version's id to restore_version to roll back.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, covering the safety profile. The description adds useful behavioral context beyond annotations: it specifies ordering ('newest first') and details the returned fields (id, versionNumber, status, live flag, name, creator, timestamp), which is important since there is no output schema.

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

Conciseness5/5

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

Two tightly written sentences with zero waste. The core action and output fields are front-loaded, and the follow-up action (rollback via restore_version) is presented efficiently as a second sentence.

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 read-only list tool with no output schema, the description compensates by explicitly enumerating the returned fields and the ordering. It also covers the key downstream integration (restore_version), making the definition complete for an agent to use correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents site, locale, and documentId. The description reinforces that the listing is scoped to one locale, but adds no new syntax, format, or default behavior 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.

Purpose5/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 ('version history') with clear scope ('in one locale, newest first') and enumerates the returned fields. It distinguishes itself from siblings like get_content (current content) and restore_version (action) by focusing on version history retrieval.

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

Usage Guidelines4/5

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

It provides clear context: use this to see a content item's version history, and then pass a version's id to restore_version to roll back. It doesn't explicitly state when to use this versus alternatives like get_content, but the downstream action clarifies the primary use case.

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

list_webhooksA
Read-only

List this site's outbound webhooks: id, name, target url, subscribed events and status. Secrets are not shown. Admin only.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds two pieces of context beyond that: an auth requirement ('Admin only') and a data-redaction behavior ('Secrets are not shown'), which tells the agent not to expect secret values. It stops short of describing pagination or result limits.

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

Conciseness5/5

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

One sentence, front-loaded with the resource and its returned fields, followed by two short caveats. Every clause earns its place and nothing is padded.

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

Completeness4/5

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

With no output schema, the description compensates by naming the returned fields, and it discloses both the auth requirement and the secret-redaction behavior. Only minor gaps remain, such as pagination or ordering of results.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'site' parameter is fully documented there, including the list_sites fallback advice. The description adds nothing about the site parameter, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('List this site's outbound webhooks') and enumerates exactly what is returned: id, name, target url, subscribed events, status. The list/create/delete distinction against siblings create_webhook and delete_webhook is unambiguous from the verb alone.

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

Usage Guidelines3/5

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

No explicit when-to-use statement or comparison to alternatives; usage is only implied by the verb. It does supply a real prerequisite ('Admin only'), which constrains who may call it, but there is no guidance on scoping or when to prefer this over, say, audit tools.

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

move_contentA
Idempotent

Move a page in the tree: give parentId to re-parent it (its URL path changes with its new position, and the old URL gets a 301 automatically), and/or beforeId/afterId to place it among its siblings. The page's whole subtree moves with it. Sibling order only sticks under a parent whose child sort is manual; a computed sort (name, date…) re-orders it. Returns {ok:true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
afterIdNoPlace it directly after this sibling (documentId).
beforeIdNoPlace it directly before this sibling (documentId).
parentIdNodocumentId of the new parent page; null moves it to the top level. Omit to keep the current parent.
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=true) but say nothing about side effects; the description adds substantial unannotated behavior: URL path changes, automatic 301 on the old URL, whole-subtree movement, and the sort-mode dependency. These are exactly the traits an agent needs before mutating content.

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

Conciseness5/5

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

Front-loads the core action and parameter roles, then layers behavior and edge cases in dense, waste-free sentences. Nothing is redundant and the return claim is tacked on efficiently.

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

Completeness5/5

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

No output schema exists, and the description supplies the return shape ({ok:true}) as well as the side-effect and sort-mode caveats. An agent has everything needed to invoke this mutation correctly and predict its 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 coverage is 100%, so the baseline is 3, but the description adds interaction semantics the schema does not: it explains how parentId and beforeId/afterId combine ('and/or') and that the subtree follows. This goes beyond the per-field descriptions, justifying a 4.

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

Purpose5/5

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

States a specific verb (move) and resource (a page in the tree) and immediately distinguishes the two operation modes: re-parenting via parentId vs. sibling placement via beforeId/afterId. An agent can tell this apart from update_content without opening the schema.

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

Usage Guidelines4/5

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

Gives clear context for when each parameter applies (give parentId to re-parent, and/or beforeId/afterId to place among siblings) and warns about the manual-vs-computed sort caveat. It does not explicitly rule out alternative siblings (e.g. update_content) or state prerequisites, so it stays 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.

publishA

Publish the working draft of a content item for a locale. The locale is a LANGUAGE BRANCH — publishing Norwegian text into 'en' puts it on the English site; a strong language/branch mismatch is refused unless allowLanguageMismatch is true. A future publishAt SCHEDULES the go-live instead: the draft stays unpublished (and invisible to readers) until then, and shows on the dashboard under Scheduled publishing. Call publish again with a new publishAt to reschedule, or without one to go live now. NEVER fake scheduling by putting the date in a data field — that publishes immediately.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
expireAtNoWhen to unpublish automatically (ISO 8601). Must be after publishAt.
publishAtNoFuture go-live time (ISO 8601, e.g. "2026-09-01T09:00:00Z"). Omit to publish immediately.
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.
allowLanguageMismatchNoSet true ONLY when publishing content whose language deliberately differs from the locale branch

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only say it is a non-read-only, non-destructive, non-idempotent write. The description goes well beyond that: a future publishAt leaves the draft unpublished and invisible to readers until go-live, surfaces it under Scheduled publishing, and re-invocation reschedules. It also discloses the language-mismatch refusal gate and its override, which is real behavioral context no structured field carries.

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

Conciseness5/5

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

Purpose is front-loaded, then the language-branch hazard, then scheduling, rescheduling, and a final warning. Every sentence carries distinct operational information and the capitalized emphasis flags the two highest-risk misinterpretations without padding.

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

Completeness4/5

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

For a 6-parameter mutation with no output schema, the description covers the important failure and side-effect modes (mismatch refusal, invisible-until-scheduled, reschedule). It does not describe what a successful call returns or any error shape, but with annotations covering safety and the schema fully documented, the remaining gap is minor.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond it: 'locale' is characterized as a LANGUAGE BRANCH with concrete failure semantics, and allowLanguageMismatch is explained as a deliberate override. publishAt's scheduling (not immediate-publish) semantics are clarified. expireAt is left entirely to the schema, which documents it adequately.

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

Purpose5/5

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

States a specific verb and resource ('Publish the working draft of a content item for a locale'), which cleanly separates it from siblings like unpublish, discard_draft, and update_content. The scope (working draft, per-locale branch) is precise enough that an agent can select it without opening any schema.

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

Usage Guidelines4/5

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

Gives clear when-to-use context: with publishAt it schedules, without it goes live now, and re-calling either reschedules or publishes. It also supplies an explicit when-not ('NEVER fake scheduling by putting the date in a data field'). It never names the natural alternatives (unpublish, discard_draft, update_content), so sibling routing is left to inference.

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

rename_delivery_keyA
Idempotent

Change a Delivery API key's label (Admin only). The secret and its access are unchanged. Returns {ok:true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe key's id from list_delivery_keys.
nameYesThe new label.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that: the admin authorization requirement, an explicit statement that the secret and access are unaffected (narrowing the blast radius precisely), and the {ok:true} return shape for a tool with no output schema.

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

Conciseness5/5

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

Three short sentences, zero filler, front-loaded with the action and the authorization constraint before the side-effect clarification and return value.

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 low-complexity, 3-parameter mutation with full annotation coverage, the description supplies everything an agent needs: what changes, the admin gate, what is explicitly not changed, and the return contract.

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 id, name and site are already documented in the schema, including the list_delivery_keys provenance hint for id. The description adds nothing about parameter format or semantics beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource — changing a Delivery API key's label — and immediately scopes it to the label so an agent knows this is not create/revoke. It is trivially distinguishable from siblings like create_delivery_key and revoke_delivery_key.

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

Usage Guidelines4/5

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

Gives a clear precondition ('Admin only') and, via the schema's reference to list_delivery_keys, the lookup path for the required id. It does not explicitly route against alternatives like revoke_delivery_key, but the intent is unambiguous from the purpose statement.

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

restore_contentA

Bring a trashed item back to its old place in the tree, together with the descendants that were trashed with it. Restored content is NOT republished — call publish for each locale that should go live. Refused if its parent is still in the trash or a live sibling took its URL meanwhile. Returns {restored: }. Find trashed ids with list_trash.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.

TDQS

A4.7/5.0
Behavior5/5

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

With annotations already indicating a non-read-only, non-destructive, non-idempotent operation, the description adds important behavioral details: descendants are restored too, restoration does not republish, and there are specific refusal conditions. It also discloses the return shape as {restored: <count>}.

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 front-loaded, dense, and free of filler. Each sentence delivers a distinct piece of required information: restore scope, publish caveat, refusal conditions, return shape, and ID discovery.

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 restore operation with no output schema, the description supplies the essential behavioral context an agent needs: scope, side effects, failure modes, return value, and where to find input IDs. Nothing critical is missing.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents both site and documentId. The description adds helpful operational context about finding trashed IDs via list_trash but does not provide syntax or meaning beyond the schema for either parameter.

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

Purpose5/5

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

The description states a precise verb and resource: bring a trashed item back to its old location along with descendants trashed with it. It clearly distinguishes the action from related siblings like publish and list_trash, which are explicitly referenced.

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?

It explicitly says restored content is not republished and that publish must be called per locale for content to go live. It also states refusal conditions (parent still trashed, live sibling claimed URL) and points to list_trash for finding IDs.

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

restore_versionA

Roll back: copy an older version's content into the working draft of that locale. Nothing goes live until you publish; the version history keeps every earlier version. Returns the updated item.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
versionIdYesThe version's `id` from list_versions (not its versionNumber).
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare this is a non-readonly, non-destructive mutation, and the description meaningfully adds that nothing goes live until publish and that earlier versions remain in history, i.e. the operation is draft-scoped and reversible. It does not address the non-idempotent hint or auth/permission requirements, so it stops short of full disclosure.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action and followed by the safety-relevant consequence and the return shape. No filler; each 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?

For a draft-scoped mutation with no output schema, the description covers the action, the live-site safety implication, and the return value. Remaining gaps (permissions, idempotency behavior) are minor given the annotations and complete 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 description coverage is 100%, so all four parameters (site, locale, versionId, documentId) are already documented with sourcing hints in the schema. The description adds no parameter-level detail, so the baseline 3 applies.

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

Purpose5/5

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

States a specific action ('roll back: copy an older version's content into the working draft of that locale') with both the verb and the resource, and the draft-scoped framing cleanly separates it from sibling restore_content (trash recovery) and discard_draft. An agent can tell what it does without opening the schema.

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

Usage Guidelines3/5

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

The description implies the usage context (reverting to a point in version history, draft-only until publish) but names no alternative and gives no explicit when-not guidance (e.g. versus discard_draft or publish). Usage is inferable but not stated.

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

revoke_delivery_keyA
Destructive

Revoke a Delivery API key (Admin only): every request using it is refused from now on, so a website still using it stops getting content. Irreversible — mint a new key with create_delivery_key. Returns {ok:true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe key's id from list_delivery_keys.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds genuinely new context: the Admin-only authorization requirement, the irreversible nature of the action, the downstream impact on live websites, and the {ok:true} response shape. These are exactly the details annotations cannot 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, front-loaded with the core action and consequence, then the irreversibility warning and the alternative. Every clause earns its place with no filler.

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

Completeness5/5

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

For a destructive single-key mutation with no output schema, the description covers the action, its effect, its irreversibility, the auth prerequisite, the replacement path, and the return value. Nothing needed to call it safely is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the id and site parameters are already fully documented in the schema (including the cross-reference to list_delivery_keys and list_sites). The description adds no parameter-level detail, which is acceptable given the schema does the work, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (revoke) and resource (Delivery API key), plus the operational consequence ('every request using it is refused'). It is immediately distinguishable from siblings list_delivery_keys, create_delivery_key, and rename_delivery_key.

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

Usage Guidelines4/5

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

Explains the effect of calling it and points to create_delivery_key as the follow-up action for replacing the key. It does not explicitly contrast revoke against sibling operations like rename_delivery_key, but the operational context is clear enough to select it correctly.

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

search_stock_imagesA
Read-only

Search the configured stock photo provider (Settings → Stock images; Unsplash). Returns photo candidates with id, description and attribution. To USE a photo: call import_stock_image with its id, then set_field the returned asset documentId on an image field.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
queryYesWhat the photo should show, e.g. 'mountain lake sunrise'

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile and external-service nature are known. The description adds that results are non-persistent candidates (id/description/attribution) that must be imported to become assets — useful behavioral context beyond the annotations. It stops short of noting result limits, pagination, or provider rate limits.

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

Conciseness5/5

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

Three short sentences, zero waste: capability first, return shape second, downstream workflow third. The workflow sentence is the highest-value content and is placed where an agent will read it.

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

Completeness5/5

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

For a two-parameter read tool with no output schema, the description covers the return fields and the required follow-up chain, so an agent can act end-to-end without opening anything else. No output schema means return values need not be further specified.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents both 'site' and 'query' with examples and multisite guidance. The description adds no syntax or behavior detail for either parameter, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (Search) and resource (stock photo provider, i.e. Unsplash via Settings → Stock images), and enumerates what comes back: candidate ids, descriptions, attributions. It is cleanly distinguished from its sibling import_stock_image, which it explicitly frames as the consuming tool.

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 end-to-end workflow: search here, then call import_stock_image with the returned id, then set_field the asset documentId onto an image field. That names the alternative tool and the condition that selects it, leaving nothing to inference.

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

set_fieldA
Idempotent

Set ONE field of a content item's draft to a plain string value (merged — other fields are kept). THE MOST ROBUST WAY TO WRITE LONG TEXT/MARKDOWN CONTENT: a flat string parameter survives tool-call serialization that can mangle long strings nested inside data records. For text/markdown/select/datetime/image fields, and the special field name name (the item's display name).

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
fieldYesField name from the content type (or 'name')
valueYesThe plain string value
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.
allowLanguageMismatchNoSet true ONLY to deliberately write text whose language differs from the locale branch (the guard otherwise refuses, so e.g. Norwegian text can't silently land on the 'en' branch)

TDQS

A4/5.0
Behavior4/5

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

Adds real behavioral context beyond annotations: merge semantics (other fields preserved), the serialization-robustness rationale, and the set of supported field types. Annotations already cover the safety profile (idempotent, non-destructive, not read-only), and the language-mismatch guard is documented in the schema.

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

Conciseness4/5

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

Three sentences, front-loaded with the core action and followed by the differentiating rationale. The all-caps emphasis is slightly loud but the information is dense and non-redundant.

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

Completeness4/5

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

For a mutation tool with full annotation coverage, a 100%-documented schema, and no output schema, the description supplies merge behavior, the key serialization caveat, and supported types — enough for an agent to call it correctly. Auth/versioning prerequisites are the only notable omission.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already carries the parameter burden (baseline 3). The description still adds value by identifying which field types are settable and clarifying that `field` accepts the special value `name` for the display name.

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 precise verb+resource+scope: 'Set ONE field of a content item's draft to a plain string value (merged — other fields are kept).' The 'ONE field' and merge framing distinguishes it implicitly from whole-record siblings like update_content, but no sibling is named explicitly.

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

Usage Guidelines4/5

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

Gives a clear use case (writing long text/markdown where nested `data` records risk serialization mangling) and lists supported field types plus the special `name` target. It stops short of explicitly naming update_content or stating when NOT to use this tool.

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

set_start_pageA
Idempotent

Choose which page this site serves at / (the home page), or clear it with null. Takes effect immediately on the live site, in every locale the page is published in. Returns {ok:true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
documentIdYesdocumentId of a page in this site, or null to clear.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly=false, destructive=false, idempotent=true). The description adds genuinely useful context beyond them: changes hit the live site immediately with no staging step, and propagate to every locale the page is published in, plus the {ok:true} return shape.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the primary action, followed by the effect and the return value. No filler.

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

Completeness5/5

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

For a two-parameter mutation whose annotations already declare idempotency and non-destructiveness, the description covers the action, the live-site immediacy, locale scope, and the return value. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents both parameters, including 'null to clear.' The description restates the null-clears behavior but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (choose/clear) and resource (the page served at /, the home page), which no sibling tool does. An agent can identify exactly what this tool manipulates without opening the schema.

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

Usage Guidelines4/5

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

Explains the two usage modes: set a page as the home page, or pass null to clear it. It gives clear context but names no alternatives or when-not-to-use conditions, though few plauisble alternatives exist among siblings.

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

test_redirectA
Read-only

Follow a URL the way a visitor would: a published page answers first, then the rules, hop by hop. Returns each step (page, redirect, gone, external, not-found, loop) and the hop count. Use it to verify a migration: every old URL should end on a page in one hop.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesA path ('/old-page?x=1') or full URL on this site.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered without help. Beyond that, the description adds real behavioral context the annotations cannot: the resolution order (published page first, then rules, hop by hop), the enumerated step outcomes, and the hop count. It does not mention error conditions or limits on hop depth, but for a read-only probe this is solid disclosure.

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

Conciseness5/5

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

Two sentences, no filler: the first explains the mechanism and return shape, the second gives the motivating scenario. The most important information (what it does and what it returns) is 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?

There is no output schema, so the description must carry the return contract — and it does, naming each step type (page, redirect, gone, external, not-found, loop) and the hop count. Combined with a fully documented two-parameter schema and accurate read-only annotations, an agent has everything needed to call this correctly.

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

Parameters3/5

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

Schema description coverage is 100%, with both 'url' and 'site' fully documented in the schema itself, including the multisite caveat and the list_sites pointer. The description adds no URL syntax or site-handling detail beyond that, so the baseline 3 applies.

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

Purpose5/5

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

The description gives a specific verb and object ('Follow a URL the way a visitor would') and names the exact resolution behavior, so an agent can immediately tell this is a diagnostic resolver, not a redirect authoring tool like create_redirect or a listing tool like list_redirects. It also enumerates the outcome taxonomy, which pins down what the tool actually produces.

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

Usage Guidelines4/5

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

It states a clear use case ('Use it to verify a migration: every old URL should end on a page in one hop'), which is actionable guidance. It stops short of five because it names no alternative for related diagnostics (list_redirects, list_not_found) and gives no explicit when-not-to-use condition.

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

trash_contentA

Move a content item AND its whole page subtree to the trash: every locale is unpublished at once and disappears from delivery. Recoverable — restore_content brings it back (as drafts; publish again explicitly). Returns {trashed: }. To only take it off the live site, use unpublish instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.

TDQS

A4.7/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: all locales are unpublished simultaneously, content disappears from delivery, the operation is recoverable via restore_content (returning drafts that must be republished), and the response shape is {trashed: <number>}. This reconciles the destructiveHint=false annotation, which would otherwise read as odd for a trash operation, by explaining the recoverability.

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

Conciseness5/5

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

Three tight sentences, no filler. The destructive scope is front-loaded, then recovery, then the routing hint to unpublish — a sensible priority order for a destructive operation.

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

Completeness5/5

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

For a two-parameter, no-output-schema tool this covers everything: side effects on all locales, delivery impact, reversibility, the return value shape, and the alternative tool. Nothing an agent needs to call this correctly or to warn the user is absent.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters (site, documentId) are already fully documented in the schema, including the multisite fallback and where documentId comes from. The description adds no parameter-level detail, which is the correct baseline when the schema carries the 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?

States a specific verb ('move to trash') plus the exact scope ('a content item AND its whole page subtree'), which is a stronger and more precise statement than the tool name alone. It also separates itself from the near-siblings unpublish and restore_content by name, so an agent can disambiguate without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit when-not and the alternative that covers it: 'To only take it off the live site, use unpublish instead.' It also names the recovery path (restore_content) and the condition for using it, so the agent knows this is reversible rather than terminal.

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

treeA
Read-only

List ONE level of the page tree: the direct children of parentId, or the top-level pages when it is omitted, in the order the container sorts them. Each node has documentId, type, name, per-locale status and hasChildren — call tree again with a node's documentId to go deeper. Use it to find the parentId for create_content/move_content. For every page at once use list_pages; shared blocks and globals are not in the tree (list_blocks, list_globals).

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
parentIdNodocumentId of the page whose children to list. Omit for the top level.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint, so the description carries the rest and does so well: it discloses the one-level-at-a-time model, the recursion pattern, the container-defined sort order, and the per-node fields returned (documentId, type, name, per-locale status, hasChildren). This is meaningful behavioral context beyond the safety profile.

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

Conciseness5/5

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

Three sentences, zero filler, and the core listing behavior is front-loaded before the node shape and the alternative-tool routing. Every clause earns its place.

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

Completeness5/5

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

There is no output schema, but the description compensates by enumerating the returned node fields and the ordering guarantee, and it covers multisite pitfalls via the schema. An agent has everything needed to call and iterate this tool correctly.

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

Parameters4/5

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

Schema coverage is 100%, so both parameters are already documented, including the omit-for-top-level semantics of parentId. The description adds traversal meaning by explaining that a node's documentId is what you feed back into tree to descend, which goes slightly beyond the schema's per-parameter text.

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

Purpose5/5

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

States a specific verb and resource ('List ONE level of the page tree') and pins down the exact scope: direct children of parentId, or top-level pages when omitted. It explicitly distinguishes itself from list_pages, list_blocks, and list_globals, so an agent can route without opening sibling schemas.

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

Usage Guidelines5/5

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

Gives concrete when-to-use ('Use it to find the parentId for create_content/move_content') and when-not/alternatives ('For every page at once use list_pages; shared blocks and globals are not in the tree'). The traversal instruction ('call tree again with a node's documentId to go deeper') tells the agent how to walk the hierarchy.

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

unpublishA
Destructive

Take a content item off the live site in one locale: delivery stops serving it there (its URL starts answering 404) and content areas that reference it drop it. Fires the content.unpublished webhook. The content and its version history are kept, so publish brings it back. Other locales are unaffected. To remove the item entirely use trash_content.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.

TDQS

A4.7/5.0
Behavior4/5

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

Goes well beyond the destructiveHint=true annotation by describing exactly what destruction means: delivery stops serving (URL 404s), referencing content areas drop it, a content.unpublished webhook fires, and version history is retained while other locales are untouched. This is exactly the added context the annotations do not carry. The remaining minor gap is no note on permissions or whether the webhook is synchronous, which keeps it short of a perfect 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?

Six short sentences, each carrying a distinct fact (delivery effect, references, webhook, retention, locale scope, alternative), with the primary effect front-loaded. No filler or restatement of the tool name.

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

Completeness5/5

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

For a destructive, non-idempotent mutation with no output schema, the description supplies everything needed to call it safely: the exact observable consequences, reversibility via publish, locale scoping, and the escape hatch to trash_content. Nothing material is missing.

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

Parameters4/5

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

Schema description coverage is already 100%, so the baseline is 3, but the description adds real meaning to 'locale' by framing the operation as per-locale and asserting other locales are unaffected, which clarifies the blast radius of that parameter. It does not add syntax or format detail for site/documentId beyond the schema, so it lands just 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?

States a specific verb (take off the live site) and resource (content item), scoped explicitly to one locale. It distinguishes itself from trash_content and publish by naming both endpoints of the lifecycle, so an agent can tell it apart from siblings without opening a schema.

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

Usage Guidelines5/5

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

Names the alternative (trash_content) with the condition that selects it ('To remove the item entirely'), and spells out the reversible nature ('publish brings it back') that makes this the non-destructive-takedown choice. The when/when-not pair is explicit rather than inferred.

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

update_asset_altA
Idempotent

Set (overwrite) an image asset's alt text — the description screen readers announce and search engines index, wherever the image is used. Describe what the image shows in one sentence; use "" only for a purely decorative image. Returns the updated asset.

ParametersJSON Schema
NameRequiredDescriptionDefault
altYesThe new alt text, e.g. 'Two hikers on a ridge above a fjord at sunset'.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
documentIdYesThe asset's documentId from list_assets or an upload result.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is largely covered. The description adds real value by emphasizing the overwrite semantics of an existing value and stating 'Returns the updated asset', filling the gap left by the absent 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 tight sentences, front-loaded with the action ('Set (overwrite)') before the explanatory clause. Nothing is redundant and the key overwrite constraint appears first.

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

Completeness4/5

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

No output schema exists, but the description covers the return ('Returns the updated asset') and all three parameters are documented in the schema. Combined with annotations covering the mutation safety profile, the definition is essentially complete; only cross-tool routing is unaddressed.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining what alt text semantically is (screen-reader/search-engine description) and giving a value rule (one sentence; empty string only for decorative images), adding meaning for the 'alt' parameter specifically.

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

Purpose5/5

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

States a specific verb and resource ('Set (overwrite) an image asset's alt text') and immediately defines the concept it targets. An agent can distinguish this single-purpose alt-text setter from siblings like set_field or update_content without opening a schema.

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

Usage Guidelines3/5

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

Guidance is given for the value itself ('Describe what the image shows in one sentence; use "" only for a purely decorative image'), which is helpful. However, it never states when to prefer this tool over siblings such as set_field or update_content, nor any prerequisites (e.g. needing documentId from list_assets). Usage is implied rather than explicit.

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

update_contentA
Idempotent

Save the working draft of a content item. data maps field name → value. For LONG text/markdown values prefer set_field: a flat string parameter survives tool-call serialization that can mangle long strings nested inside data. IMPORTANT: each field's value shape depends on its content-type field TYPE — call get_content_type first. text/markdown → a plain string; richtext → a TipTap doc object {type:'doc',content:[…]}; contentArea → an ARRAY of block instances; reference → {documentId,type?}; select → one option-value string; image → an asset id. By default data is MERGED over the current draft — fields you omit are kept. Pass merge:false to REPLACE the whole map (then you must send every required field, or the next publish will fail validation). With merge:false, also pass the revision you got from get_content: the write is then refused (409) if a human editor changed the draft meanwhile, instead of overwriting them. Merged writes don't need it — they read current data at write time.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesField name → value, shaped per get_content_type's valueFormat. Pass {} to change only name/slug/displayInNav.
nameNoNew display name. Omit to keep it.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
slugNoNew URL slug for a page; publishing it adds a 301 from the old URL automatically. Omit to keep it.
mergeNoDefault true: shallow-merge data over the current draft. false = replace the whole field map
localeNoLocale code. Omit for the document's own locale (its site-default variant, else its only variant).
revisionNoOptimistic concurrency: the `revision` from get_content. If a human (or another agent) has changed the draft since, the write is refused instead of overwriting their work. Recommended whenever merge:false
documentIdYesThe item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content.
displayInNavNoWhether the page appears in the site navigation. Omit to keep it.
allowLanguageMismatchNoSet true ONLY to deliberately write text whose language differs from the locale branch (the guard otherwise refuses, so e.g. Norwegian text can't silently land on the 'en' branch)

TDQS

A4.7/5.0
Behavior4/5

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

Goes well beyond the annotations: default merge behavior (omitted fields kept), the 409 refusal when a human editor changed the draft, and the validation failure that follows an incomplete merge:false replace. The one thing not addressed is that merge:false can silently drop fields the caller didn't resend, which sits slightly in tension with destructiveHint=false, though the refusal path mitigates it.

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?

Purpose is front-loaded in the first sentence and the body is dense with load-bearing detail, but the run-on paragraph mixing value-shape rules, merge semantics, and concurrency would scan faster as short labeled segments. Nearly every sentence earns its place, so the length is defensible rather than padded.

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 10-parameter mutation with nested objects and no output schema, the description covers the write semantics (merge vs replace), the concurrency contract, the type-dependent value shapes, and the fallback to set_field. Nothing an agent needs before invoking it correctly is missing.

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?

Schema coverage is already 100%, yet the description adds the highest-value information: the per-content-type value shapes (richtext TipTap doc, contentArea block-instance array, reference {documentId,type?}, select option string, image asset id) that the schema's generic `additionalProperties: {}` cannot express. It also explains merge/revision interplay rather than restating field 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 a specific verb+resource ("Save the working draft of a content item") and immediately distinguishes itself from siblings by naming set_field as the preferred path for long values and get_content_type as a prerequisite. An agent can tell what this tool does and how it differs from create_content/set_field/publish without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use routing: prefer set_field for long text/markdown because a flat string parameter survives serialization; call get_content_type first for value shapes; use merge:false with a revision from get_content for replace semantics, and merged writes don't need it. This is close to a decision tree, not just context.

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

update_content_typeA
Idempotent

Replace a content type's definition (add/remove/rename fields, change options). name and kind are immutable. Send the FULL definition — get_content_type, edit, send back; a field you leave out is removed from the schema. Existing content is not migrated: its stored values for removed fields are simply no longer shown or delivered. Instance-wide (all sites).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe existing type's name, e.g. 'BlogPost'.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
definitionYesThe full updated ContentTypeDef (same shape get_content_type returns; its valueFormat/valueExample annotations are ignored).

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that name/kind are immutable, that omitted fields are dropped from the schema, that existing content is not migrated, and that removed fields' stored values stop being shown/delivered, plus the instance-wide scope. This is exactly the "what gets destroyed / what changes" context the annotations (destructiveHint=false, idempotentHint=true) cannot convey, and it clarifies rather than contradicts them.

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

Conciseness5/5

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

Front-loads the core action, then layers the workflow warning, behavioral consequences, and scope. Every clause carries distinct, load-bearing information with no filler despite the em-dash-heavy density.

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 mutation tool with no output schema, it covers everything needed to call it correctly: the full-replacement semantics, immutable fields, the consequence for existing content, and the multisite scope. Nothing material is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all three parameters (baseline 3). The description still adds real meaning: name/kind immutability for the name param and the full-definition requirement for the definition param, which the schema only hints at.

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 a specific verb+resource ("Replace a content type's definition") and enumerates the concrete operations (add/remove/rename fields, change options). It is clearly distinguishable from the sibling read tool get_content_type via the "get_content_type, edit, send back" workflow reference, so an agent can tell the two apart without opening either schema.

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

Usage Guidelines4/5

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

Gives strong procedural guidance for the correct usage path (get_content_type → edit → send back) and states the critical constraint that the FULL definition must be sent. It stops short of explicitly naming when-not or alternatives (e.g., "use create_content_type for new types"), so it is clear context without explicit exclusions.

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

update_redirectA
Idempotent

Update a redirect rule by id (from list_redirects). Same fields and rules as create_redirect; omitted fields are unchanged.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe rule's id from list_redirects.
noteNoFree-text note for editors, e.g. 'old WordPress URL'.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
sourceNoOld path ('/old-page'), prefix ('/blog/*') or full URL on the old site.
statusNo301 permanent (default), 302/307 temporary, 308 permanent, 410 gone (no target).
targetNoDestination path or https:// URL. Use this OR targetDocumentId.
keepQueryNoCarry the request's query string over to the target.
targetLocaleNoLocale of targetDocumentId to send visitors to. Omit for the site default.
targetDocumentIdNodocumentId of the destination page; the rule follows it if it moves. Use this OR target.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the bar is lower. The description nonetheless adds genuine behavioral context beyond them: omitted fields are left unchanged (PATCH semantics), and it delegates field rules to create_redirect, which is useful for predicting effects.

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

Conciseness5/5

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

A single dense sentence with zero filler; the verb-resource-id core is front-loaded, followed by the partial-update rule. Every clause carries information an agent needs.

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

Completeness4/5

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

For a mutation tool with no output schema, the description plus rich annotations and a fully documented schema cover what an agent needs to invoke it correctly, including id provenance and partial-update semantics. It does not mention failure behavior (e.g., unknown id) or permission requirements, a minor remaining gap.

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

Parameters3/5

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

Schema description coverage is 100% across all 9 parameters, including enum-like status codes, site, target vs targetDocumentId, and id provenance, so the schema does the heavy lifting. The description adds only a cross-reference to create_redirect rather than new per-parameter meaning, so the baseline 3 applies.

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

Purpose5/5

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

Specific verb (update) plus resource (redirect rule) plus the locating constraint (by id from list_redirects), which tells the agent exactly which identifier to supply. It also routes the agent to two named siblings — list_redirects for the id and create_redirect for field semantics — so it is distinguishable from neighboring redirect tools without opening schemas.

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

Usage Guidelines4/5

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

The description establishes the operating context (modify an existing rule, fields and rules inherited from create_redirect) and the partial-update contract ('omitted fields are unchanged'), which steers the agent on how to call it. It stops short of an explicit when-not or a direct contrast such as 'use create_redirect to add a new rule instead'.

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

update_type_templateA
Idempotent

Replace a stored type template's definition (name and kind are immutable; built-in templates are read-only — copy one under a new name with create_type_template instead). Content types already instantiated from it are NOT changed; re-apply with instantiate_type_template {updateExisting:true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe stored template's name.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
definitionYesThe full updated ContentTypeDef (same shape as create_content_type).

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing that name and kind are immutable, that built-ins are read-only, and critically that already-instantiated content types are NOT changed. This downstream-effect warning is exactly the context that destructiveHint=false alone cannot convey, and it is consistent with that hint.

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

Conciseness5/5

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

Two sentences, front-loaded with the action, then the immutability constraint and the downstream-effect guidance. Every clause (immutability, read-only built-ins, instantiated content) earns its place with no filler.

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

Completeness5/5

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

For a mutation tool with annotations present and no output schema, the definition covers the essential behavioral facts: what is replaced, what is immutable, what is unaffected downstream, and how to propagate. Nothing an agent needs to call it safely is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3, but the description adds real semantic constraints: which fields are immutable and that definition is the full replacement ContentTypeDef. That meaningfully restricts how 'name' and 'definition' may be used beyond the schema's own text.

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

Purpose5/5

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

States a specific verb and resource: replacing a stored type template's definition. It immediately distinguishes itself from create_type_template (copying built-ins) and instantiate_type_template (re-applying to content), so an agent can route correctly without opening a schema.

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

Usage Guidelines5/5

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

Explicitly gives the when-not condition (built-in templates are read-only, copy instead via create_type_template) and names the follow-up alternative (instantiate_type_template {updateExisting:true}) for propagating changes. Both the exclusion and the chaining path are stated, not inferred.

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

update_userA
Idempotent

Change a user's name, roles and/or section scopes (Admin only). Omitted fields are kept; roles and sections REPLACE the current lists. Changes apply from the user's next request. Returns {ok:true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe user's id from list_users.
nameNoNew display name.
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
rolesNoAdmin = everything; Editor = all content + publish + form submissions; Author = write content within its sections; Viewer = read-only.
sectionsNodocumentIds of top-level pages this user is limited to (its subtree). Omit or [] for the whole site.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnly=false, idempotent=true) by disclosing partial-update semantics ('omitted fields are kept'), the critical REPLACE behavior for roles/sections, propagation timing, and the return shape {ok:true}. These are exactly the traits an agent needs and cannot infer from the structured fields alone.

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

Conciseness5/5

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

Three short sentences, each load-bearing, with the Admin restriction and mutation semantics front-loaded. No filler or 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?

For a mutation tool with no output schema, it covers the restriction (Admin), replace-vs-keep semantics, timing, and return value. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds genuinely new meaning: which parameters are optional/preserved versus which are destructive-replacing lists. This clarifies the roles and sections arrays beyond their per-field schema text.

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

Purpose5/5

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

Specific verb 'Change' plus resource 'user' and the exact mutable fields (name, roles, section scopes). It is trivially distinguishable from sibling write operations like create_user, delete_user, and list_users without opening any schema.

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

Usage Guidelines4/5

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

States the '(Admin only)' precondition and the deployment timing ('apply from the user's next request'), giving clear context for safe use. It does not, however, explicitly route the agent to or away from the sibling user-management tools, so it stops short of full when/when-not guidance.

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

upload_assetA

Add a file (PNG, JPEG, GIF, WEBP or PDF, max 5 MB) to the media library from a public URL or from base64 bytes, and return the asset — set its documentId on an image field with set_field. For files on YOUR machine prefer create_upload_link: base64 through a tool call costs roughly 1 token per 2-3 bytes.

ParametersJSON Schema
NameRequiredDescriptionDefault
altNoAlt text
urlNoPublic http(s) URL of the file itself (not a web page showing it)
siteNoSite slug or id to act in (multisite). Omit to use this server's default site. Call list_sites to see what exists — an empty tree or search usually means the wrong site, not missing content.
filenameNoDisplay name in the media library, e.g. 'hero.jpg'
dataBase64NoThe file's bytes, base64-encoded (a data: URL prefix is accepted)

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true, idempotentHint=false), so the bar is lower; the description still adds real context beyond them — file type allowlist, 5 MB size limit, the ~1 token per 2-3 bytes cost of base64 transport, and the fact that an asset record is created and returned. It does not cover duplicate-filename behavior, permissions/authentication needs, or idempotency 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?

Three sentences, front-loaded with the core action and constraints, then the set_field follow-up, then the competing-tool advice. No filler, and the parenthetical size and token figures are compact rather than verbose.

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 create-style tool with no output schema, the description supplies the critical facts an agent needs: accepted formats, size ceiling, the two input modes, the cost tradeoff, and how to consume the returned asset. It stops short of describing error behavior (e.g. an oversized or unreachable URL) or what happens on filename collision.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value by framing `url` and `dataBase64` as the two mutually-alternative ingestion modes and explaining the token cost tradeoff that should drive the choice between them; it says nothing extra about `alt`, `filename`, or `site` beyond the schema.

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

Purpose5/5

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

States a precise verb+resource (add a file to the media library), enumerates supported formats (PNG, JPEG, GIF, WEBP, PDF) and the 5 MB cap, names both supported sources (public URL or base64), and describes the return value. It also distinguishes itself from the close sibling create_upload_link by naming it explicitly for the local-file case.

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

Usage Guidelines5/5

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

Explicit routing: use this tool for remote URLs or base64 bytes, prefer create_upload_link when the file lives on the caller's machine, then use set_field with the returned documentId to bind the asset. The when/when-not conditions and the downstream follow-up step are all spelled out.

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

Tool Schema Changelog

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

  1. 50 tool updatesv0.1.3
    • Changedai_assist3 fields changed
      • addedInput schema / properties / input / description
        Added value: +"The text to work on (or, for write, the topic/brief)."
      • addedInput schema / properties / targetLocale / description
        Added value: +"Locale code of the output language, e.g. 'nb'. Required for translate; for improve/rewrite/variants it overrides 'same language as the input'."
      • addedInput schema / properties / task / description
        Added value: +"meta_title / meta_description = SEO text from the input; summarize; improve = polish grammar and flow; rewrite; variants = 3 alternatives as a JSON array; translate (needs targetLocale); write = 2-4 paragraphs about the topic in input; schema_fields = suggested fields for the schema.org @type named in input; alt_text is refused (see above)."
    • Changedcopy_variant1 field changed
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
    • Changedcreate_content1 field changed
      • addedInput schema / properties / name / description
        Added value: +"Display name of the item (also the source of a page's auto slug), e.g. 'Summer sale 2026'."
    • Changedcreate_content_type1 field changed
      • addedInput schema / properties / definition / description
        Added value: +"A ContentTypeDef: {name: 'PascalCase', kind: 'page'|'block'|'global', fields: [{name, type, …}], …}. Copy the shape of an existing one from get_content_type."
    • Changedcreate_delivery_key2 fields changed
      • addedInput schema / properties / name / description
        Added value: +"Label for where it is used, e.g. 'Astro site production'."
      • addedInput schema / properties / type / description
        Added value: +"public = published only; preview = drafts too."
    • Changedcreate_redirect7 fields changed
      • addedInput schema / properties / keepQuery / description
        Added value: +"Carry the request's query string over to the target."
      • addedInput schema / properties / note / description
        Added value: +"Free-text note for editors, e.g. 'old WordPress URL'."
      • addedInput schema / properties / source / description
        Added value: +"Old path ('/old-page'), prefix ('/blog/*') or full URL on the old site."
      • addedInput schema / properties / status / description
        Added value: +"301 permanent (default), 302/307 temporary, 308 permanent, 410 gone (no target)."
      • addedInput schema / properties / target / description
        Added value: +"Destination path or https:// URL. Use this OR targetDocumentId."
      • addedInput schema / properties / targetDocumentId / description
        Added value: +"documentId of the destination page; the rule follows it if it moves. Use this OR target."
      • addedInput schema / properties / targetLocale / description
        Added value: +"Locale of targetDocumentId to send visitors to. Omit for the site default."
    • Changedcreate_user5 fields changed
      • addedInput schema / properties / email / description
        Added value: +"Sign-in email address; must be unique."
      • addedInput schema / properties / name / description
        Added value: +"Display name, e.g. 'Kari Nordmann'."
      • addedInput schema / properties / password / description
        Added value: +"Initial password, at least 10 characters."
      • addedInput schema / properties / roles / description
        Added value: +"Admin = everything; Editor = all content + publish + form submissions; Author = write content within its sections; Viewer = read-only."
      • addedInput schema / properties / sections / description
        Added value: +"documentIds of top-level pages this user is limited to (its subtree). Omit or [] for the whole site."
    • Changedcreate_webhook3 fields changed
      • addedInput schema / properties / events / description
        Added value: +"Events to send: content.published, content.unpublished, form.submitted. Omit or [] for all."
      • addedInput schema / properties / name / description
        Added value: +"Label, e.g. 'Netlify rebuild'."
      • addedInput schema / properties / url / description
        Added value: +"Public https:// endpoint to POST to."
    • Changeddelete_asset1 field changed
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The asset's documentId from list_assets."
    • Changeddelete_form_submission1 field changed
      • addedInput schema / properties / submissionId / description
        Added value: +"The submission's id from list_form_submissions."
    • Changeddelete_redirects1 field changed
      • addedInput schema / properties / ids / description
        Added value: +"Rule ids from list_redirects."
    • Changeddelete_type_template1 field changed
      • addedInput schema / properties / name / description
        Added value: +"The stored template's name."
    • Changeddelete_user1 field changed
      • addedInput schema / properties / id / description
        Added value: +"The user's id from list_users."
    • Changeddelete_webhook1 field changed
      • addedInput schema / properties / id / description
        Added value: +"The webhook's id from list_webhooks."
    • Changeddelivery_get_by_id3 fields changed
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
      • addedInput schema / properties / populate / description
        Added value: +"How many levels of references and shared blocks to resolve inline, 0-4 (default 0: references stay as ids)."
      • changedInput schema / properties / preview / description
        Previous value: -"Use the preview perspective (drafts)"New value: +"true = read the latest drafts as the preview pane shows them (needs site-wide read access). Default false: published content only, exactly what visitors get."
    • Changeddelivery_get_by_path3 fields changed
      • addedInput schema / properties / path / description
        Added value: +"The page's URL path without the locale prefix, e.g. '/blog/my-post'."
      • addedInput schema / properties / populate / description
        Added value: +"How many levels of references and shared blocks to resolve inline, 0-4 (default 0: references stay as ids)."
      • changedInput schema / properties / preview / description
        Previous value: -"Use the preview perspective (drafts)"New value: +"true = read the latest drafts as the preview pane shows them (needs site-wide read access). Default false: published content only, exactly what visitors get."
    • Changeddelivery_get_by_slug3 fields changed
      • addedInput schema / properties / populate / description
        Added value: +"How many levels of references and shared blocks to resolve inline, 0-4 (default 0: references stay as ids)."
      • changedInput schema / properties / preview / description
        Previous value: -"Use the preview perspective (drafts)"New value: +"true = read the latest drafts as the preview pane shows them (needs site-wide read access). Default false: published content only, exactly what visitors get."
      • addedInput schema / properties / slug / description
        Added value: +"The slug, without slashes, e.g. 'about-us'."
    • Changeddelivery_global2 fields changed
      • addedInput schema / properties / preview / description
        Added value: +"true = read the latest drafts as the preview pane shows them (needs site-wide read access). Default false: published content only, exactly what visitors get."
      • addedInput schema / properties / type / description
        Added value: +"The global's content type name, e.g. 'SiteHeader'."
    • Changeddelivery_list5 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Page size, 1-500."
      • addedInput schema / properties / offset / description
        Added value: +"Items to skip, for paging."
      • addedInput schema / properties / populate / description
        Added value: +"How many levels of references and shared blocks to resolve inline, 0-4 (default 0: references stay as ids)."
      • changedInput schema / properties / preview / description
        Previous value: -"Use the preview perspective (drafts)"New value: +"true = read the latest drafts as the preview pane shows them (needs site-wide read access). Default false: published content only, exactly what visitors get."
      • addedInput schema / properties / type / description
        Added value: +"Content type name, e.g. 'BlogPost'."
    • Changeddelivery_search4 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Max results, 1-100."
      • addedInput schema / properties / preview / description
        Added value: +"true = read the latest drafts as the preview pane shows them (needs site-wide read access). Default false: published content only, exactly what visitors get."
      • addedInput schema / properties / query / description
        Added value: +"Words to search for, e.g. 'pricing plans'."
      • addedInput schema / properties / type / description
        Added value: +"Only return items of this content type."
    • Changeddelivery_start2 fields changed
      • addedInput schema / properties / populate / description
        Added value: +"How many levels of references and shared blocks to resolve inline, 0-4 (default 0: references stay as ids)."
      • addedInput schema / properties / preview / description
        Added value: +"true = read the latest drafts as the preview pane shows them (needs site-wide read access). Default false: published content only, exactly what visitors get."
    • Changeddiscard_draft1 field changed
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
    • Changedduplicate_content1 field changed
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
    • Changedexport_form_submissions1 field changed
      • addedInput schema / properties / formId / description
        Added value: +"Export only this form (formId from list_forms). Omit to export every form in the site."
    • Changedget_content1 field changed
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
    • Changedget_content_type1 field changed
      • addedInput schema / properties / name / description
        Added value: +"Content type name, PascalCase, e.g. 'BlogPost' (as in a content item's `type`)."
    • Changedget_form_submission1 field changed
      • addedInput schema / properties / submissionId / description
        Added value: +"The submission's id from list_form_submissions."
    • Changedget_type_template1 field changed
      • addedInput schema / properties / name / description
        Added value: +"Template name as listed by list_type_templates, e.g. 'FaqPage'."
    • Changedlist_audit7 fields changed
      • addedInput schema / properties / action / description
        Added value: +"Action prefix, e.g. 'content.' (a whole category) or 'content.publish'."
      • addedInput schema / properties / actorUserId / description
        Added value: +"Only actions by this user id (from list_users)."
      • addedInput schema / properties / before / description
        Added value: +"Paging cursor: the id of the oldest row you already have."
      • addedInput schema / properties / documentId / description
        Added value: +"Only actions on this document."
      • addedInput schema / properties / from / description
        Added value: +"Earliest time, ISO 8601, e.g. '2026-10-01T00:00:00Z'."
      • addedInput schema / properties / limit / description
        Added value: +"Rows to return, 1-500 (default 100)."
      • addedInput schema / properties / to / description
        Added value: +"Latest time, ISO 8601."
    • Changedlist_form_submissions3 fields changed
      • changedInput schema / properties / formId / description
        Previous value: -"Limit to one form's submissions (documentId of the Form)."New value: +"Limit to one form's submissions (its formId from list_forms). Omit for all forms."
      • addedInput schema / properties / limit / description
        Added value: +"Page size, 1-200 (default 50)."
      • addedInput schema / properties / offset / description
        Added value: +"Rows to skip, for paging (default 0)."
    • Changedlist_redirects1 field changed
      • addedInput schema / properties / targetDocumentId / description
        Added value: +"Only rules pointing at this page (documentId). Omit for all rules."
    • Changedlist_versions1 field changed
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
    • Changedmove_content4 fields changed
      • addedInput schema / properties / afterId / description
        Added value: +"Place it directly after this sibling (documentId)."
      • addedInput schema / properties / beforeId / description
        Added value: +"Place it directly before this sibling (documentId)."
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
      • addedInput schema / properties / parentId / description
        Added value: +"documentId of the new parent page; null moves it to the top level. Omit to keep the current parent."
    • Changedpublish1 field changed
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
    • Changedrename_delivery_key2 fields changed
      • addedInput schema / properties / id / description
        Added value: +"The key's id from list_delivery_keys."
      • addedInput schema / properties / name / description
        Added value: +"The new label."
    • Changedrestore_content1 field changed
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
    • Changedrestore_version2 fields changed
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
      • addedInput schema / properties / versionId / description
        Added value: +"The version's `id` from list_versions (not its versionNumber)."
    • Changedrevoke_delivery_key1 field changed
      • addedInput schema / properties / id / description
        Added value: +"The key's id from list_delivery_keys."
    • Changedset_field1 field changed
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
    • Changedset_start_page1 field changed
      • addedInput schema / properties / documentId / description
        Added value: +"documentId of a page in this site, or null to clear."
    • Changedtest_redirect1 field changed
      • addedInput schema / properties / url / description
        Added value: +"A path ('/old-page?x=1') or full URL on this site."
    • Changedtrash_content1 field changed
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
    • Changedtree1 field changed
      • addedInput schema / properties / parentId / description
        Added value: +"documentId of the page whose children to list. Omit for the top level."
    • Changedunpublish1 field changed
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
    • Changedupdate_asset_alt2 fields changed
      • addedInput schema / properties / alt / description
        Added value: +"The new alt text, e.g. 'Two hikers on a ridge above a fjord at sunset'."
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The asset's documentId from list_assets or an upload result."
    • Changedupdate_content5 fields changed
      • addedInput schema / properties / data / description
        Added value: +"Field name → value, shaped per get_content_type's valueFormat. Pass {} to change only name/slug/displayInNav."
      • addedInput schema / properties / displayInNav / description
        Added value: +"Whether the page appears in the site navigation. Omit to keep it."
      • changedInput schema / properties / documentId / description
        Previous value: -"Content documentId"New value: +"The item's documentId (stable across locales and versions), e.g. from tree, list_pages or get_content."
      • addedInput schema / properties / name / description
        Added value: +"New display name. Omit to keep it."
      • addedInput schema / properties / slug / description
        Added value: +"New URL slug for a page; publishing it adds a 301 from the old URL automatically. Omit to keep it."
    • Changedupdate_content_type2 fields changed
      • addedInput schema / properties / definition / description
        Added value: +"The full updated ContentTypeDef (same shape get_content_type returns; its valueFormat/valueExample annotations are ignored)."
      • addedInput schema / properties / name / description
        Added value: +"The existing type's name, e.g. 'BlogPost'."
    • Changedupdate_redirect8 fields changed
      • addedInput schema / properties / id / description
        Added value: +"The rule's id from list_redirects."
      • addedInput schema / properties / keepQuery / description
        Added value: +"Carry the request's query string over to the target."
      • addedInput schema / properties / note / description
        Added value: +"Free-text note for editors, e.g. 'old WordPress URL'."
      • addedInput schema / properties / source / description
        Added value: +"Old path ('/old-page'), prefix ('/blog/*') or full URL on the old site."
      • addedInput schema / properties / status / description
        Added value: +"301 permanent (default), 302/307 temporary, 308 permanent, 410 gone (no target)."
      • addedInput schema / properties / target / description
        Added value: +"Destination path or https:// URL. Use this OR targetDocumentId."
      • addedInput schema / properties / targetDocumentId / description
        Added value: +"documentId of the destination page; the rule follows it if it moves. Use this OR target."
      • addedInput schema / properties / targetLocale / description
        Added value: +"Locale of targetDocumentId to send visitors to. Omit for the site default."
    • Changedupdate_type_template2 fields changed
      • addedInput schema / properties / definition / description
        Added value: +"The full updated ContentTypeDef (same shape as create_content_type)."
      • addedInput schema / properties / name / description
        Added value: +"The stored template's name."
    • Changedupdate_user4 fields changed
      • addedInput schema / properties / id / description
        Added value: +"The user's id from list_users."
      • addedInput schema / properties / name / description
        Added value: +"New display name."
      • addedInput schema / properties / roles / description
        Added value: +"Admin = everything; Editor = all content + publish + form submissions; Author = write content within its sections; Viewer = read-only."
      • addedInput schema / properties / sections / description
        Added value: +"documentIds of top-level pages this user is limited to (its subtree). Omit or [] for the whole site."
  2. 74 tool updatesv0.1.0
    • First observedai_assist
    • First observedcopy_variant
    • First observedcreate_content
    • First observedcreate_content_type
    • First observedcreate_delivery_key
    • First observedcreate_redirect
    • First observedcreate_type_template
    • First observedcreate_upload_link
    • First observedcreate_user
    • First observedcreate_webhook
    • First observeddelete_asset
    • First observeddelete_form_submission
    • First observeddelete_redirects
    • First observeddelete_type_template
    • First observeddelete_user
    • First observeddelete_webhook
    • First observeddelivery_get_by_id
    • First observeddelivery_get_by_path
    • First observeddelivery_get_by_slug
    • First observeddelivery_global
    • First observeddelivery_list
    • First observeddelivery_search
    • First observeddelivery_start
    • First observeddiscard_draft
    • First observedduplicate_content
    • First observederase_form_submissions
    • First observedexport_form_submissions
    • First observedexport_type_templates
    • First observedget_content
    • First observedget_content_type
    • First observedget_form_submission
    • First observedget_site_config
    • First observedget_type_template
    • First observedimport_stock_image
    • First observedimport_type_templates
    • First observedinstantiate_type_template
    • First observedlist_assets
    • First observedlist_audit
    • First observedlist_blocks
    • First observedlist_content_types
    • First observedlist_delivery_keys
    • First observedlist_form_submissions
    • First observedlist_forms
    • First observedlist_globals
    • First observedlist_locales
    • First observedlist_not_found
    • First observedlist_pages
    • First observedlist_redirects
    • First observedlist_sites
    • First observedlist_trash
    • First observedlist_type_templates
    • First observedlist_users
    • First observedlist_versions
    • First observedlist_webhooks
    • First observedmove_content
    • First observedpublish
    • First observedrename_delivery_key
    • First observedrestore_content
    • First observedrestore_version
    • First observedrevoke_delivery_key
    • First observedsearch_stock_images
    • First observedset_field
    • First observedset_start_page
    • First observedtest_redirect
    • First observedtrash_content
    • First observedtree
    • First observedunpublish
    • First observedupdate_asset_alt
    • First observedupdate_content
    • First observedupdate_content_type
    • First observedupdate_redirect
    • First observedupdate_type_template
    • First observedupdate_user
    • First observedupload_asset

TDQS

A4/5.0

Scored across 74 tools

Disambiguation5/5

Despite 74 tools, descriptions carefully differentiate overlapping-sounding operations: get_content vs delivery_get_by_id (draft vs published), tree vs list_pages (one level vs flat), list_blocks vs list_globals vs list_pages, and the many content-type/template tools are clearly scoped. The delivery_get_by_id/slug/path trio is explicitly ranked (prefer path), leaving almost no ambiguity.

Naming Consistency4/5

Overwhelmingly a consistent verb_noun snake_case pattern (list_/get_/create_/update_/delete_ reused per resource), which aids scanning. A few bare single-word exceptions like tree, publish, unpublish, and ai_assist break the pattern but remain readable.

Tool Count2/5

74 tools is heavy and well above a well-scoped range, even for a full CMS platform. The domain is genuinely broad (content, versions, blocks, forms, assets, delivery API, redirects, users, keys, webhooks, audit), but this many discrete tools invites consolidation.

Completeness5/5

Coverage is exceptional: full content lifecycle (create/update/publish/unpublish/discard/trash/restore/versions), content types and templates, form submissions with export and erasure, media assets, redirects, users, delivery keys, webhooks, audit and locales. No obvious dead ends for the stated CMS purpose.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    A self-hosted content engine with an MCP interface that enables AI agents to read, write, and manage content models through tools like describe_model, create_type, draft, and publish.
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Agent-first headless CMS running as a Cloudflare Worker, providing MCP servers for schema/content management and editorial operations.
    10 npm
    4
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP-native CMS that lets you create and edit content by chatting, with typed schemas and seamless publishing.
    0
    3
    MIT