answer.cloud MCP: CMS Tools
Define collections and author content: list/upsert collections, list/get/upsert/preview/publish/archive/delete entries, and republish_cms, plus templates, markers, and the publish prerequisite.
These answer.cloud MCP tools manage CMS collections and entries — the structured, editable content that renders into pages, indexes, .txt mirrors, llms.txt, and sitemap.xml. They let an agent define a collection and then author, preview, publish, archive, or delete entries. For deploying the site itself, see the site & deploy tools page; for connection and auth, see the MCP overview.
CMS tools are organization- and site-scoped like the deploy tools, but they do not consume the daily deploy quota.
Before you publish: one prerequisite
A site must have gone live with at least one deploy before you can publish CMS entries. Publishing against a site that has never deployed returns cms_no_live_deploy. Define collections and draft entries any time; publish after the first live deploy.
How templates work
Each collection renders through a show template (single entry) and an index template (the listing). Templates are shipped inside the deploy artifact under .aeo/cms/{collection_key}/show.html and index.html, keyed by collection. A show template must contain the <!-- aeo:content --> marker; an index template must contain <!-- aeo:entries -->. If a template is missing or lacks its marker, answer.cloud renders the entry with a built-in fallback theme and records a warning. Other supported markers include <!-- aeo:title -->, <!-- aeo:summary -->, <!-- aeo:published_at -->, <!-- aeo:collection_name -->, and <!-- aeo:collection_summary -->.
list_cms_collections
List the site's collections and their health.
- Arguments:
site_slug - Returns:
collections[]withkey,name,description,index_path,path_pattern,item_type,template_path,index_template_path,template_health(healthyormissingforshowandindex), andentries_count/published_count/draft_count.
upsert_cms_collection
Create or update a collection.
- Arguments:
site_slug,key(required); optionalname,description,index_path,path_pattern,item_type,fields[],sort({ field, direction }), and templates via eithertemplates: { show, index }or the flattemplate_path/index_template_path. - Returns: the collection view.
- Notes:
keyidentifies the collection and maps to its template folder.path_patternmust include{slug}. This tool records the collection's shape; the actual template HTML is installed by a deploy that ships the matching.aeo/cms/{key}/**files.
list_cms_entries
List entries in a collection.
- Arguments:
site_slug,collection_key; optionalstatus(all,draft,published,archived),query - Returns:
entries[]withid,title,status,has_unpublished_changes,source_path,live_url,preview_url, and timestamps.querymatches entry title and content.
get_cms_entry
Fetch one entry in full.
- Arguments:
site_slug,collection_key,entry_id - Returns: the entry plus its
published_payload, anydraft_payload, and AEO status.
upsert_cms_entry
Create or update an entry.
- Arguments:
site_slug,collection_key; optionalentry_id(omit to create a new entry); content fieldstitle,slug,summary,content,published_at,metadata; andsave_mode—draft(default) orpublish. - Returns: the entry detail for drafts, or the publish result when
save_modeispublish. - Notes: by default this saves a draft, not a live page — you then publish separately. If a
publishsave fails to render, the draft is preserved and the response returns the entry ID so you can fix and retry.
preview_cms_entry
Get a private preview of a staged draft.
- Arguments:
site_slug,collection_key,entry_id - Returns: a private
preview_urlhosted on answer.cloud and the template status. It does not return raw HTML. - Notes: use this to review a draft before publishing.
publish_cms_entry
Publish an entry to the live site.
- Arguments:
site_slug,collection_key,entry_id - Returns: the entry, its
live_urlandindex_url, andwritten_paths[]— the entry HTML and.txt, the collection index HTML and.txt, plus refreshedllms.txtandsitemap.xml. - Notes: publishing renders the entry, updates the collection index, writes plain-text mirrors, refreshes discovery files, and injects JSON-LD and the chat widget. If the entry's path collides with an existing artifact file, it returns
cms_path_collision— choose another slug or path.
archive_cms_entry
Unpublish an entry while keeping it recoverable.
- Arguments:
site_slug,collection_key,entry_id - Returns: the updated entry status and
changed_paths[]. The collection index is re-rendered without the entry.
delete_cms_entry
Permanently delete an entry.
- Arguments:
site_slug,collection_key,entry_id - Notes: this is irreversible. To take a page down but keep the content, use
archive_cms_entryinstead.
republish_cms
Re-render published entries and indexes into the current deploy.
- Arguments:
site_slug; optionalcollection_key - Returns: the refreshed collections.
- Notes: run this after changing templates so existing published content picks up the new markup. Scope it to one collection with
collection_key, or refresh everything by omitting it.
A typical authoring loop
list_cms_collectionsto confirm the collection exists and its templates are healthy.upsert_cms_entrywithsave_mode: "draft"to stage content.preview_cms_entryto review the staged draft privately.publish_cms_entryto go live.archive_cms_entryto take something down later, orrepublish_cmsafter template changes.
Frequently asked questions
Why didn't my entry appear on the site after upsert_cms_entry?
Because upsert_cms_entry defaults to save_mode: "draft". Call publish_cms_entry (or pass save_mode: "publish") to make it live.
My pages render unstyled or generic. Why?
The collection's template is missing or lacks its required marker, so answer.cloud used the fallback theme. Ship .aeo/cms/{key}/show.html and index.html (with <!-- aeo:content --> and <!-- aeo:entries -->) in a deploy, then run republish_cms.
Do CMS operations use my daily deploy quota?
No. CMS tools are exempt from the deploy quota, though they do count toward the per-minute request rate.