Reference
MCP tools
The 40 tools of /mcp, as tools/list describes them. A tool checks its scopes when it runs: a token without them gets a 403 that names what is missing.
approve_review
writecontent:publishPublishes the revision a review asked for, in your name, after the contracts run again as publish runs them. The warnings the request acknowledged count as acknowledged; a new one answers needs_acknowledgement, and you approve again with it in acknowledgeWarnings.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^rvw_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of a review (rvw_…), as publish and list_reviews return it."
},
"acknowledgeWarnings": {
"default": [],
"description": "Warnings you accept besides those the request acknowledged.",
"type": "array",
"items": {
"type": "object",
"properties": {
"contract": {
"type": "string"
},
"path": {
"type": "string"
}
},
"required": [
"contract",
"path"
]
}
}
},
"required": [
"id"
],
"additionalProperties": false
}comment_review
writecontent:writeAdds a comment to a pending review, for the person who decides it and for the author: what to change, what reads well, what the contracts cannot check. It neither approves nor closes the review.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^rvw_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of a review (rvw_…), as publish and list_reviews return it."
},
"body": {
"type": "string",
"minLength": 1,
"maxLength": 4000,
"description": "The comment, in Markdown."
}
},
"required": [
"id",
"body"
],
"additionalProperties": false
}connect_analytics
writeschema:adminConnects the site to the analytics it already has, so content_stats can say what readers read: Cloudflare Web Analytics, PostHog, Plausible or GA4. It asks the provider for the last 7 days with the credential first, and saves nothing unless the provider answers; the credential is then kept sealed and never shown again. A new connection replaces the old one. Prefer the admin (Site, Analytics) or `hollware analytics connect`, so the credential does not pass through an agent. refused when the provider turned the credential down, with the permission to give it; unreachable when it did not answer; unavailable when the deployment has no HOLLWARE_SECRET to seal it with.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"cloudflare",
"ga4",
"plausible",
"posthog"
],
"description": "Where the site measures its readers: cloudflare (Web Analytics), posthog, plausible or ga4."
},
"credential": {
"type": "string",
"minLength": 1,
"maxLength": 16384,
"description": "A read-only credential: cloudflare, an API token with Account Analytics Read; posthog, a personal API key with Query read; plausible, a Stats API key; ga4, the JSON key of a service account that can view the property."
},
"settings": {
"type": "object",
"properties": {
"hosts": {
"description": "Hosts whose views count for the site, such as www.example.com. The host of the site's url always counts.",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"maxLength": 253,
"pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$"
}
},
"accountId": {
"description": "cloudflare: the account, the 32 characters after dash.cloudflare.com/ in the address of the dashboard. Required for cloudflare.",
"type": "string",
"pattern": "^[0-9a-f]{32}$"
},
"host": {
"description": "posthog or plausible: the https origin of the instance. PostHog Cloud (US or EU) is found from the key; plausible.io when not given.",
"type": "string",
"maxLength": 200,
"pattern": "^https:\\/\\/[a-z0-9.-]+(:\\d{1,5})?$"
},
"projectId": {
"description": "posthog: the project. Found from the key when not given.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"siteId": {
"description": "plausible: the site id, its domain. The host of the site's url when not given.",
"type": "string",
"minLength": 1,
"maxLength": 253
},
"propertyId": {
"description": "ga4: the property id, digits only. Required for ga4.",
"type": "string",
"pattern": "^\\d{1,20}$"
}
},
"additionalProperties": false
}
},
"required": [
"provider",
"credential"
],
"additionalProperties": false
}content_stats
readcontent:readThe most read pages of the sites that read this one, over the last days, most read first, each with the published entry it shows when it shows one, from the analytics the site connected (ADR-040). Use it to pick what to update. unavailable when the site has connected none.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"days": {
"default": 30,
"description": "How many days back to count.",
"type": "integer",
"minimum": 1,
"maximum": 90
},
"limit": {
"default": 10,
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"additionalProperties": false
}create_draft
writecontent:writeCreates an entry from a Markdown file and saves it as a draft at version 1. Contract errors do not stop the draft: it is saved, and the verdict says what to fix before publishing. It is refused only when it cannot be stored: the file is too large, its frontmatter or syntax does not parse, or the slug or translation is taken. An entry in the trash keeps its slug and translation: the answer is in_trash with that entry, and restore_entry brings it back.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"collection": {
"type": "string",
"minLength": 1,
"description": "A collection of the site, as describe_site lists it."
},
"locale": {
"type": "string",
"minLength": 1,
"description": "A locale of the site, as describe_site lists it."
},
"slug": {
"type": "string",
"maxLength": 200,
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"description": "The entry's path segment: lowercase letters and digits joined by hyphens, such as edge-caching-guide."
},
"markdown": {
"type": "string",
"description": "The whole Markdown file: the YAML frontmatter between two --- lines, then the body. The collection schema in describe_site says what the frontmatter needs."
}
},
"required": [
"collection",
"locale",
"slug",
"markdown"
],
"additionalProperties": false
}create_site
writeschema:adminCreates a site in this deployment, with its definition, and makes you its owner. It is served at once; to work in it, get a token of that site (the admin switches to it).
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "The key of a site: lowercase letters and digits joined by hyphens, such as my-site."
},
"definition": {
"type": "object",
"properties": {
"locales": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
"defaultLocale": {
"type": "string",
"minLength": 1
},
"url": {
"default": null,
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"styleGuide": {
"default": null,
"type": [
"string",
"null"
]
},
"cors": {
"default": {
"origins": []
},
"type": "object",
"properties": {
"origins": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"origins"
],
"additionalProperties": false
},
"events": {
"default": {
"webhooks": [],
"indexNow": null
},
"type": "object",
"properties": {
"webhooks": {
"default": [],
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"minLength": 1,
"description": "The https URL that receives each event, signed."
},
"secret": {
"description": "The Worker secret that signs the deliveries. Leave it out for Hollware to make one with make_webhook_secret and keep it sealed.",
"type": "string",
"minLength": 1
}
},
"required": [
"name",
"url"
],
"additionalProperties": false
}
},
"indexNow": {
"default": null,
"anyOf": [
{
"type": "object",
"properties": {
"key": {
"type": "string",
"minLength": 1
}
},
"required": [
"key"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"audit": {
"default": {
"ipAddresses": "off",
"retentionDays": null
},
"description": "What the activity log of the site keeps (ADR-037). Only an owner should change it.",
"type": "object",
"properties": {
"ipAddresses": {
"default": "off",
"description": "Whether the activity log keeps the address of each request, as a hash keyed by the site, or nothing of it.",
"type": "string",
"enum": [
"off",
"hashed"
]
},
"retentionDays": {
"default": null,
"description": "The days each line of the activity log is kept; null keeps it as long as the site.",
"anyOf": [
{
"type": "integer",
"minimum": 30,
"maximum": 3650
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"backups": {
"default": {
"enabled": true,
"retentionDays": 30
},
"description": "The daily backups of the site. Only an owner should change it.",
"type": "object",
"properties": {
"enabled": {
"default": true,
"description": "Whether the cron writes a backup of the site each day after 03:00 UTC to the R2 bucket of the deployment: the definition and the Markdown of every entry, never the images. false makes none; those already kept go when their retention passes.",
"type": "boolean"
},
"retentionDays": {
"default": 30,
"description": "How many days each daily backup is kept, 1 to 365.",
"type": "integer",
"minimum": 1,
"maximum": 365
}
},
"additionalProperties": false
},
"media": {
"default": {
"format": "webp",
"quality": 85,
"maxWidth": 2400,
"widths": [
640,
1280
],
"keepOriginals": true
},
"description": "How the site converts the images it receives (ADR-038).",
"type": "object",
"properties": {
"format": {
"default": "webp",
"description": "What JPEG, PNG and GIF images become when they arrive: \"webp\", \"avif\", or \"original\" to keep them as they came. SVG is never converted.",
"type": "string",
"enum": [
"webp",
"avif",
"original"
]
},
"quality": {
"default": 85,
"description": "The quality of photographs, 1 to 100. PNG images are always kept lossless.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"maxWidth": {
"default": 2400,
"description": "The widest an image is kept, in pixels; a wider one is scaled down, never up.",
"type": "integer",
"minimum": 320,
"maximum": 8192
},
"widths": {
"default": [
640,
1280
],
"description": "The widths, in pixels and smallest first, of the narrower copies made of each image when it is uploaded, for srcset: an image gets those narrower than itself. [] makes none; each copy is one more conversion of Cloudflare Images.",
"maxItems": 4,
"type": "array",
"items": {
"type": "integer",
"minimum": 320,
"maximum": 8192
}
},
"keepOriginals": {
"default": true,
"description": "Whether the file as it was uploaded is kept in R2 besides the one served, for a later change of format. false keeps only the file served and its copies, which takes less storage; the images uploaded before keep theirs.",
"type": "boolean"
}
},
"additionalProperties": false
},
"collections": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"schema": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "The JSON Schema of the frontmatter."
},
"routes": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
},
"description": "The public path of an entry in each locale, with :slug: { \"en\": \"/blog/:slug/\" }."
},
"translationGroupField": {
"default": null,
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"tagsField": {
"default": null,
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"sortByField": {
"default": null,
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"automaticFields": {
"default": {},
"description": "The fields Hollware fills itself, so that nobody writes them: { \"date\": \"firstPublished\", \"dateModified\": \"lastModified\", \"readingTime\": \"readingTime\" }. firstPublished and lastModified fill a date field (a date written in the Markdown wins for the first, and a later one for the second); readingTime (minutes at 200 words a minute) and wordCount fill an integer. A site reads them filled; they are never required.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"enum": [
"firstPublished",
"lastModified",
"readingTime",
"wordCount"
]
}
},
"components": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"props": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "The JSON Schema of the props."
},
"description": {
"type": "string",
"minLength": 1
},
"example": {
"type": "string",
"minLength": 1
}
},
"required": [
"props"
],
"additionalProperties": false
}
},
"rules": {
"default": [],
"type": "array",
"items": {
"type": "object",
"properties": {
"rule": {
"type": "string",
"minLength": 1,
"description": "The name of a rule of the catalog that describe_site lists."
},
"severity": {
"default": "error",
"type": "string",
"enum": [
"error",
"warning"
]
},
"params": {
"default": {},
"description": "The parameters of the rule, as the catalog describes them.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"id": {
"description": "The id of the contract, when a collection lists one rule twice; its name otherwise.",
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
}
},
"required": [
"rule"
],
"additionalProperties": false
}
},
"maxMarkdownBytes": {
"default": null,
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"styleGuide": {
"default": null,
"type": [
"string",
"null"
]
}
},
"required": [
"schema",
"routes"
],
"additionalProperties": false
}
}
},
"required": [
"locales",
"defaultLocale",
"collections"
],
"additionalProperties": false
}
},
"required": [
"key",
"definition"
],
"additionalProperties": false
}delete_entry
destructivecontent:writeMoves a draft to the trash, if it is still at the version you read: every operation treats it as gone, its pending review is cancelled, and nothing is deleted. It keeps its slug and translation, and restore_entry brings it back as the draft it was. A published or scheduled entry answers published: unpublish it first.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ent_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of an entry (ent_…), as the other operations return it."
},
"version": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "The version of the entry you read. A change against an older version answers conflict."
}
},
"required": [
"id",
"version"
],
"additionalProperties": false
}delete_site
destructiveschema:adminPuts a site you own in the trash: it is served no more, and its tokens stop working. Nothing is deleted; restore_site brings it back, from a token of another site you own. The first call answers needs_confirmation with how many entries the site holds; call again with confirm.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "The key of a site: lowercase letters and digits joined by hyphens, such as my-site."
},
"confirm": {
"default": false,
"description": "true to go ahead when needs_confirmation listed what the change does to existing entries.",
"type": "boolean"
}
},
"required": [
"key"
],
"additionalProperties": false
}describe_site
readcontent:readDescribes the site: its locales, and for each collection the JSON Schema of the frontmatter, the components the body may use, the contracts that writes and publishes are checked against, and the style guides. Read it before writing.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}disconnect_analytics
writeschema:adminForgets the analytics connection of the site and its credential. content_stats is unavailable until another is connected.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}get_analytics
readschema:adminThe analytics the site reads its page views from (ADR-040), without its credential: the provider, its settings and when it was last checked. not_connected when there is none.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}get_asset
readcontent:readGets an image of the site by its id: its reference, URL, size and alt. The file as it was uploaded is at GET /v1/assets/<id>/original, with a personal token.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ast_[0-9a-f]{26}$",
"description": "The id of an asset, such as ast_3f1c… (26 hexadecimal characters)."
}
},
"required": [
"id"
],
"additionalProperties": false
}get_entry
readcontent:readGets an entry by collection, locale and slug, with its latest revision: the Markdown, the frontmatter, the verdict of its contracts and its last publication.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"collection": {
"type": "string",
"minLength": 1,
"description": "A collection of the site, as describe_site lists it."
},
"locale": {
"type": "string",
"minLength": 1,
"description": "A locale of the site, as describe_site lists it."
},
"slug": {
"type": "string",
"maxLength": 200,
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"description": "The entry's path segment: lowercase letters and digits joined by hyphens, such as edge-caching-guide."
},
"formats": {
"default": [
"markdown"
],
"description": "What to return of the revision: markdown, the Comark document, or html.",
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"markdown",
"document",
"html"
]
}
},
"published": {
"default": false,
"description": "Read the revision that is live instead of the latest one: not_found when the entry is not published.",
"type": "boolean"
},
"related": {
"default": false,
"description": "Also return the published entries closest to this one by meaning, in its collection and locale, closest first. Needs the semantic search of the deployment; empty without it.",
"type": "boolean"
},
"references": {
"default": false,
"description": "Also return the published entries that the fields of a reference rule name (an author, a series, an event), by field, in the order the field names them.",
"type": "boolean"
}
},
"required": [
"collection",
"locale",
"slug"
],
"additionalProperties": false
}get_revision
readcontent:readGets one revision of an entry by its id, as list_revisions names it: the whole Markdown file it held, and who wrote it and when. Compare it with the latest revision of get_entry to see what changed.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^rev_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of a revision (rev_…)."
}
},
"required": [
"id"
],
"additionalProperties": false
}get_structure
readcontent:readGets the definition of the site as update_site and set_collection take it: its locales, URL, CORS origins, events, style guide, and each collection with the JSON Schema of its frontmatter, its routes, components and rules; with its version, and the catalog of rules a collection may use, each with the JSON Schema of its parameters.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}get_translations
readcontent:readGets the entries of a translation group of a collection, one per locale. The group is the value of the field that describe_site names as translationGroupField.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"collection": {
"type": "string",
"minLength": 1,
"description": "A collection of the site, as describe_site lists it."
},
"translationGroup": {
"type": "string",
"minLength": 1
}
},
"required": [
"collection",
"translationGroup"
],
"additionalProperties": false
}list_assets
readcontent:readLists the images of the site, newest first, with their reference, URL, size and alt. Pass the nextCursor of an answer as cursor to get the next page.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
}list_backups
readschema:adminLists the daily backups of the site, newest first: one JSON file a day, made by the cron after 03:00 UTC and kept 30 days in the deployment's R2 bucket, with the definition of the site and the Markdown of every entry. Download one at GET /v1/backups/<date> with a token of an owner, or with hollware backup get, which writes it as files that hollware import takes back. unavailable without the bucket.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}list_entries
readcontent:readLists the entries of a collection, newest first, filtered by locale, tag or status. Pass the nextCursor of an answer as cursor to get the next page. Entries in the trash are left out, unless trashed asks for them.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"collection": {
"type": "string",
"minLength": 1,
"description": "A collection of the site, as describe_site lists it."
},
"locale": {
"type": "string",
"minLength": 1,
"description": "A locale of the site, as describe_site lists it."
},
"tag": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"enum": [
"draft",
"scheduled",
"published"
]
},
"trashed": {
"description": "true to list the entries in the trash, last trashed first, instead of the others.",
"type": "boolean"
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string",
"minLength": 1
}
},
"required": [
"collection"
],
"additionalProperties": false
}list_redirects
readcontent:readLists the old paths of the site's entries that moved (move_entry) and where each goes now, newest first: what a site answers with a 301. Narrow it to a collection or a locale; pass the nextCursor of an answer as cursor for the next page.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"collection": {
"type": "string",
"minLength": 1,
"description": "A collection of the site, as describe_site lists it."
},
"locale": {
"type": "string",
"minLength": 1,
"description": "A locale of the site, as describe_site lists it."
},
"limit": {
"default": 100,
"type": "integer",
"minimum": 1,
"maximum": 500
},
"cursor": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
}list_reviews
readcontent:readLists the requests to publish, newest first, with the entry each one is for: the pending ones unless you name another status.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"status": {
"default": "pending",
"type": "string",
"enum": [
"pending",
"approved",
"changes_requested",
"rejected",
"cancelled"
]
},
"limit": {
"default": 50,
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"additionalProperties": false
}list_revisions
readcontent:readLists every revision of an entry, newest first: who wrote it and how, when, its title, what the contracts said, and whether it is the latest, the one the site shows, or was ever published. Read one with get_revision; go back to one with restore_revision. Pass the nextCursor of an answer as cursor to get the next page.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ent_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of an entry (ent_…), as the other operations return it."
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cursor": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
}make_webhook_secret
writeschema:adminMakes a new secret for a webhook of the site that names no Worker secret of its own, keeps it sealed, and answers it once: give it to the receiver, which checks each delivery's signature with it. A new one replaces the old at once. unavailable when the deployment has no HOLLWARE_SECRET to seal it with.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"webhook": {
"type": "string",
"minLength": 1,
"description": "The name of the webhook, as the definition of the site has it."
}
},
"required": [
"webhook"
],
"additionalProperties": false
}move_entry
editcontent:writeGives an entry another slug, and so another path on the site, if the entry is still at the version you read; it keeps its revisions and its translations. An entry that was ever published keeps its old slug as a redirect (list_redirects), so a site answers the old path with a 301 and links and search engines follow. Moving a published entry takes content:publish; the site's pages of it are purged. A slug another entry of the collection and locale holds answers taken.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ent_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of an entry (ent_…), as the other operations return it."
},
"version": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "The version of the entry you read. A change against an older version answers conflict."
},
"slug": {
"type": "string",
"maxLength": 200,
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"description": "The new slug."
}
},
"required": [
"id",
"version",
"slug"
],
"additionalProperties": false
}publish
writecontent:writePublishes the latest revision of an entry, if the entry is still at the version you read, and with group, other entries in the same step. It is blocked while the contracts report errors. Warnings have to be acknowledged: an answer of needs_acknowledgement lists them, and publish again with them in acknowledgeWarnings. Publish entries that link to each other as one group. Without content:publish, the same checks run and the answer is pending_review: a person who may publish approves the revision or asks for changes, and a new revision of the entry cancels the request. A review is for one entry, now: never with group or publishAt.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ent_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of an entry (ent_…), as the other operations return it."
},
"version": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "The version of the entry you read. A change against an older version answers conflict."
},
"acknowledgeWarnings": {
"default": [],
"description": "The warnings you accept, as needs_acknowledgement listed them.",
"type": "array",
"items": {
"type": "object",
"properties": {
"contract": {
"type": "string"
},
"path": {
"type": "string"
}
},
"required": [
"contract",
"path"
]
}
},
"group": {
"default": [],
"description": "Other entries to publish in the same step, each with the version you read: all of them are published, or none. A link between two of them counts as published, and an acknowledged warning holds for every entry that reports it.",
"maxItems": 99,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ent_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of an entry (ent_…), as the other operations return it."
},
"version": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "The version of the entry you read. A change against an older version answers conflict."
}
},
"required": [
"id",
"version"
],
"additionalProperties": false
}
},
"publishAt": {
"description": "Publish at this time instead of now, as an ISO 8601 date and time: the entry is checked now and waits as scheduled, and it is published within a minute of the time, if nobody changes it before. One entry at a time, never with group.",
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"version"
],
"additionalProperties": false
}reject_review
editcontent:publishCloses a pending review without publishing, saying why this change is not to be published at all: unlike request_changes, it does not ask the author for another try. The entry stays as it is, published or not.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^rvw_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of a review (rvw_…), as publish and list_reviews return it."
},
"reason": {
"type": "string",
"minLength": 1,
"maxLength": 4000,
"description": "Why it is rejected, for the author."
}
},
"required": [
"id",
"reason"
],
"additionalProperties": false
}request_changes
editcontent:publishCloses a pending review without publishing, with a note that says what to change. The author saves a new revision and asks again.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^rvw_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of a review (rvw_…), as publish and list_reviews return it."
},
"note": {
"type": "string",
"minLength": 1,
"maxLength": 4000,
"description": "What to change, for the author."
}
},
"required": [
"id",
"note"
],
"additionalProperties": false
}request_review
writecontent:writeAsks a person who may publish to review the latest revision of an entry, after the same checks publish makes, if the entry is still at the version you read. It never publishes, whatever your scopes: the answer is pending_review, or why not (blocked by the contracts, warnings to acknowledge, a conflict). A new revision of the entry cancels the request.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ent_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of an entry (ent_…), as the other operations return it."
},
"version": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "The version of the entry you read. A change against an older version answers conflict."
},
"acknowledgeWarnings": {
"default": [],
"description": "The warnings you accept, as needs_acknowledgement listed them.",
"type": "array",
"items": {
"type": "object",
"properties": {
"contract": {
"type": "string"
},
"path": {
"type": "string"
}
},
"required": [
"contract",
"path"
]
}
}
},
"required": [
"id",
"version"
],
"additionalProperties": false
}restore_entry
writecontent:writeBrings an entry back from the trash as the draft it was, with its revisions, at the next version. An entry that is not in the trash answers not_trashed.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ent_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of an entry (ent_…), as the other operations return it."
}
},
"required": [
"id"
],
"additionalProperties": false
}restore_revision
editcontent:writeSaves an earlier revision's Markdown as a new revision of the entry, if the entry is still at the version you read: nothing is deleted, and the history keeps every revision, the restored one included. It is a draft until it is published, as any change. Answers as update_draft does; unchanged when the latest revision already holds that Markdown.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ent_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of an entry (ent_…), as the other operations return it."
},
"version": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "The version of the entry you read. A change against an older version answers conflict."
},
"revision": {
"type": "string",
"pattern": "^rev_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The revision to go back to, of this entry."
}
},
"required": [
"id",
"version",
"revision"
],
"additionalProperties": false
}restore_site
writeschema:adminBrings back a site you own from the trash, as it was: served again, with its entries and tokens.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "The key of a site: lowercase letters and digits joined by hyphens, such as my-site."
}
},
"required": [
"key"
],
"additionalProperties": false
}schedule_unpublish
destructivecontent:publishTakes a published entry off the site at a time, as an ISO 8601 date and time: for an offer, an event or a notice that ends. It stays published until then, and the cron unpublishes it within a minute of the time, in your name, if you may still publish. A time that has passed unpublishes it now. Scheduling again moves the time; unpublishAt null cancels it. get_entry says when, as unpublishAt.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ent_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of an entry (ent_…), as the other operations return it."
},
"unpublishAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
],
"description": "When to unpublish it, or null to cancel the unpublication it has."
}
},
"required": [
"id",
"unpublishAt"
],
"additionalProperties": false
}search
readcontent:readSearches the published entries of the site, best match first. Full text finds the entries that hold every word of query, in their title, tags and text; semantic finds them by meaning, in any language; hybrid merges both. Narrow it to a collection or a locale. Drafts are not searched: read them with list_entries.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The words to find, or a question; punctuation is ignored by full text."
},
"collection": {
"type": "string",
"minLength": 1,
"description": "A collection of the site, as describe_site lists it."
},
"locale": {
"type": "string",
"minLength": 1,
"description": "A locale of the site, as describe_site lists it."
},
"limit": {
"default": 10,
"type": "integer",
"minimum": 1,
"maximum": 50
},
"mode": {
"description": "fulltext, semantic or hybrid; hybrid when not given. Semantic and hybrid need the semantic search of the deployment: without it the search is full text, and mode in the answer says so.",
"type": "string",
"enum": [
"fulltext",
"semantic",
"hybrid"
]
},
"passages": {
"default": false,
"description": "Also answer, for each result, the passage that matched: the whole section of the entry, with its heading, and the URL of the entry. What a model reads to answer with the content and cite it (retrieval-augmented generation).",
"type": "boolean"
},
"minScore": {
"description": "Leave out what matches by meaning less than this (0 to 1), so a question nothing answers finds nothing. Full text matches are kept.",
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"query"
],
"additionalProperties": false
}set_collection
destructiveschema:adminAdds the collection name to the site, replaces it, or removes it with collection null, leaving the rest of the definition as it is; with the version of the structure you read. Answers as update_site does.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"version": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "The version of the structure you read with get_structure. Another one answers conflict."
},
"name": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]*$",
"description": "The name of the collection: lowercase letters, digits and hyphens, such as blog."
},
"collection": {
"anyOf": [
{
"type": "object",
"properties": {
"schema": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "The JSON Schema of the frontmatter."
},
"routes": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
},
"description": "The public path of an entry in each locale, with :slug: { \"en\": \"/blog/:slug/\" }."
},
"translationGroupField": {
"default": null,
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"tagsField": {
"default": null,
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"sortByField": {
"default": null,
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"automaticFields": {
"default": {},
"description": "The fields Hollware fills itself, so that nobody writes them: { \"date\": \"firstPublished\", \"dateModified\": \"lastModified\", \"readingTime\": \"readingTime\" }. firstPublished and lastModified fill a date field (a date written in the Markdown wins for the first, and a later one for the second); readingTime (minutes at 200 words a minute) and wordCount fill an integer. A site reads them filled; they are never required.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"enum": [
"firstPublished",
"lastModified",
"readingTime",
"wordCount"
]
}
},
"components": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"props": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "The JSON Schema of the props."
},
"description": {
"type": "string",
"minLength": 1
},
"example": {
"type": "string",
"minLength": 1
}
},
"required": [
"props"
],
"additionalProperties": false
}
},
"rules": {
"default": [],
"type": "array",
"items": {
"type": "object",
"properties": {
"rule": {
"type": "string",
"minLength": 1,
"description": "The name of a rule of the catalog that describe_site lists."
},
"severity": {
"default": "error",
"type": "string",
"enum": [
"error",
"warning"
]
},
"params": {
"default": {},
"description": "The parameters of the rule, as the catalog describes them.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"id": {
"description": "The id of the contract, when a collection lists one rule twice; its name otherwise.",
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
}
},
"required": [
"rule"
],
"additionalProperties": false
}
},
"maxMarkdownBytes": {
"default": null,
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"styleGuide": {
"default": null,
"type": [
"string",
"null"
]
}
},
"required": [
"schema",
"routes"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The collection, or null to remove it."
},
"confirm": {
"default": false,
"description": "true to go ahead when needs_confirmation listed what the change does to existing entries.",
"type": "boolean"
}
},
"required": [
"version",
"name",
"collection"
],
"additionalProperties": false
}unpublish
destructivecontent:publishTakes an entry off the public site and keeps it, with its revisions, as a draft. An entry that is not published stays as it is.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ent_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of an entry (ent_…), as the other operations return it."
}
},
"required": [
"id"
],
"additionalProperties": false
}update_asset
editcontent:writeChanges what an image shows for whoever cannot see it, its alt: every entry that shows it with no alt of its own reads the new one. The file never changes: a new picture is a new upload.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ast_[0-9a-f]{26}$",
"description": "The id of an asset, such as ast_3f1c… (26 hexadecimal characters)."
},
"alt": {
"type": "string",
"minLength": 1,
"maxLength": 500,
"description": "What the image shows, for whoever cannot see it."
}
},
"required": [
"id",
"alt"
],
"additionalProperties": false
}update_draft
editcontent:writeSaves a new revision of an entry from the whole Markdown file, if the entry is still at the version you read; otherwise it answers conflict with the current version, and nothing is saved. A file identical to the latest revision answers unchanged. Contract errors do not stop the save; the verdict says what to fix.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^ent_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The id of an entry (ent_…), as the other operations return it."
},
"version": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "The version of the entry you read. A change against an older version answers conflict."
},
"markdown": {
"type": "string",
"description": "The whole Markdown file: the YAML frontmatter between two --- lines, then the body. The collection schema in describe_site says what the frontmatter needs."
}
},
"required": [
"id",
"version",
"markdown"
],
"additionalProperties": false
}update_site
destructiveschema:adminReplaces the definition of the site with another, at once and with no deploy: read it with get_structure, change it, and send it with the version you read. Every problem is answered at its path with its fix, and nothing changes. A change that removes a collection or a locale with entries, or a schema that refuses entries the site holds, answers needs_confirmation with what it would do; send it again with confirm to go ahead. Entries are never deleted: a removed collection keeps them out of reach until it comes back.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"version": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "The version of the structure you read with get_structure. Another one answers conflict."
},
"definition": {
"type": "object",
"properties": {
"locales": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
"defaultLocale": {
"type": "string",
"minLength": 1
},
"url": {
"default": null,
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"styleGuide": {
"default": null,
"type": [
"string",
"null"
]
},
"cors": {
"default": {
"origins": []
},
"type": "object",
"properties": {
"origins": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"origins"
],
"additionalProperties": false
},
"events": {
"default": {
"webhooks": [],
"indexNow": null
},
"type": "object",
"properties": {
"webhooks": {
"default": [],
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"minLength": 1,
"description": "The https URL that receives each event, signed."
},
"secret": {
"description": "The Worker secret that signs the deliveries. Leave it out for Hollware to make one with make_webhook_secret and keep it sealed.",
"type": "string",
"minLength": 1
}
},
"required": [
"name",
"url"
],
"additionalProperties": false
}
},
"indexNow": {
"default": null,
"anyOf": [
{
"type": "object",
"properties": {
"key": {
"type": "string",
"minLength": 1
}
},
"required": [
"key"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"audit": {
"default": {
"ipAddresses": "off",
"retentionDays": null
},
"description": "What the activity log of the site keeps (ADR-037). Only an owner should change it.",
"type": "object",
"properties": {
"ipAddresses": {
"default": "off",
"description": "Whether the activity log keeps the address of each request, as a hash keyed by the site, or nothing of it.",
"type": "string",
"enum": [
"off",
"hashed"
]
},
"retentionDays": {
"default": null,
"description": "The days each line of the activity log is kept; null keeps it as long as the site.",
"anyOf": [
{
"type": "integer",
"minimum": 30,
"maximum": 3650
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"backups": {
"default": {
"enabled": true,
"retentionDays": 30
},
"description": "The daily backups of the site. Only an owner should change it.",
"type": "object",
"properties": {
"enabled": {
"default": true,
"description": "Whether the cron writes a backup of the site each day after 03:00 UTC to the R2 bucket of the deployment: the definition and the Markdown of every entry, never the images. false makes none; those already kept go when their retention passes.",
"type": "boolean"
},
"retentionDays": {
"default": 30,
"description": "How many days each daily backup is kept, 1 to 365.",
"type": "integer",
"minimum": 1,
"maximum": 365
}
},
"additionalProperties": false
},
"media": {
"default": {
"format": "webp",
"quality": 85,
"maxWidth": 2400,
"widths": [
640,
1280
],
"keepOriginals": true
},
"description": "How the site converts the images it receives (ADR-038).",
"type": "object",
"properties": {
"format": {
"default": "webp",
"description": "What JPEG, PNG and GIF images become when they arrive: \"webp\", \"avif\", or \"original\" to keep them as they came. SVG is never converted.",
"type": "string",
"enum": [
"webp",
"avif",
"original"
]
},
"quality": {
"default": 85,
"description": "The quality of photographs, 1 to 100. PNG images are always kept lossless.",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"maxWidth": {
"default": 2400,
"description": "The widest an image is kept, in pixels; a wider one is scaled down, never up.",
"type": "integer",
"minimum": 320,
"maximum": 8192
},
"widths": {
"default": [
640,
1280
],
"description": "The widths, in pixels and smallest first, of the narrower copies made of each image when it is uploaded, for srcset: an image gets those narrower than itself. [] makes none; each copy is one more conversion of Cloudflare Images.",
"maxItems": 4,
"type": "array",
"items": {
"type": "integer",
"minimum": 320,
"maximum": 8192
}
},
"keepOriginals": {
"default": true,
"description": "Whether the file as it was uploaded is kept in R2 besides the one served, for a later change of format. false keeps only the file served and its copies, which takes less storage; the images uploaded before keep theirs.",
"type": "boolean"
}
},
"additionalProperties": false
},
"collections": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"schema": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "The JSON Schema of the frontmatter."
},
"routes": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
},
"description": "The public path of an entry in each locale, with :slug: { \"en\": \"/blog/:slug/\" }."
},
"translationGroupField": {
"default": null,
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"tagsField": {
"default": null,
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"sortByField": {
"default": null,
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"automaticFields": {
"default": {},
"description": "The fields Hollware fills itself, so that nobody writes them: { \"date\": \"firstPublished\", \"dateModified\": \"lastModified\", \"readingTime\": \"readingTime\" }. firstPublished and lastModified fill a date field (a date written in the Markdown wins for the first, and a later one for the second); readingTime (minutes at 200 words a minute) and wordCount fill an integer. A site reads them filled; they are never required.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"enum": [
"firstPublished",
"lastModified",
"readingTime",
"wordCount"
]
}
},
"components": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"props": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "The JSON Schema of the props."
},
"description": {
"type": "string",
"minLength": 1
},
"example": {
"type": "string",
"minLength": 1
}
},
"required": [
"props"
],
"additionalProperties": false
}
},
"rules": {
"default": [],
"type": "array",
"items": {
"type": "object",
"properties": {
"rule": {
"type": "string",
"minLength": 1,
"description": "The name of a rule of the catalog that describe_site lists."
},
"severity": {
"default": "error",
"type": "string",
"enum": [
"error",
"warning"
]
},
"params": {
"default": {},
"description": "The parameters of the rule, as the catalog describes them.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"id": {
"description": "The id of the contract, when a collection lists one rule twice; its name otherwise.",
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
}
},
"required": [
"rule"
],
"additionalProperties": false
}
},
"maxMarkdownBytes": {
"default": null,
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"styleGuide": {
"default": null,
"type": [
"string",
"null"
]
}
},
"required": [
"schema",
"routes"
],
"additionalProperties": false
}
}
},
"required": [
"locales",
"defaultLocale",
"collections"
],
"additionalProperties": false
},
"confirm": {
"default": false,
"description": "true to go ahead when needs_confirmation listed what the change does to existing entries.",
"type": "boolean"
}
},
"required": [
"version",
"definition"
],
"additionalProperties": false
}upload_asset
writecontent:writeUploads an image to the site: JPEG, PNG, WebP, AVIF, GIF or SVG, at most 10 MB, sent in base64. What it is comes from its bytes, never from its name. The site's media setting converts it once (to WebP at 85 by default; PNG lossless; GIF with its frames; nothing wider than its maxWidth) and makes the narrower copies of its widths for srcset (640 and 1280 pixels by default), and an SVG is kept as it is when nothing in it can run, or refused with what to remove. The same file uploaded again answers exists with the same asset. Write its reference in content: img: asset:ast_… in the frontmatter, or  in Markdown.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"filename": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Its name, such as continuum.png."
},
"alt": {
"type": "string",
"minLength": 1,
"maxLength": 500,
"description": "What the image shows, for whoever cannot see it: required."
},
"data": {
"type": "string",
"minLength": 1,
"maxLength": 13981016,
"description": "The file, in base64."
}
},
"required": [
"filename",
"alt",
"data"
],
"additionalProperties": false
}validate
readcontent:readChecks a Markdown file against every contract of the collection, as publish would, without saving anything: the verdict lists each problem with its fix.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"collection": {
"type": "string",
"minLength": 1,
"description": "A collection of the site, as describe_site lists it."
},
"locale": {
"type": "string",
"minLength": 1,
"description": "A locale of the site, as describe_site lists it."
},
"slug": {
"type": "string",
"maxLength": 200,
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"description": "The entry's path segment: lowercase letters and digits joined by hyphens, such as edge-caching-guide."
},
"markdown": {
"type": "string",
"description": "The whole Markdown file: the YAML frontmatter between two --- lines, then the body. The collection schema in describe_site says what the frontmatter needs."
}
},
"required": [
"collection",
"locale",
"slug",
"markdown"
],
"additionalProperties": false
}