CMS
Reference for the 4 CMS MCP tools: list_cms_connections, list_cms_push_targets, preview_article_for_cms, push_article_to_cms.
list_cms_connections
List the org's configured CMS connections (the content management systems an article can be pushed to). Deliberately unpaginated -- an org has only a handful of connections. Listing connections takes the cms:manage permission and is for administrators; to find a connection to push to without it, use list_cms_push_targets, whose ids and names work as preview_article_for_cms's and push_article_to_cms's cmsConnection.
read-only · idempotent · closed-world
No input parameters.
list_cms_push_targets
List the CMS connections the caller can file an article into, as id, displayName and vendor only (plus siteUrl for a WordPress connection). Needs the story:push_cms permission, not cms:manage, so a member can use it. Use a returned connection's id or name as preview_article_for_cms's and push_article_to_cms's cmsConnection. Deliberately unpaginated -- an org has only a handful of connections.
read-only · idempotent · closed-world
No input parameters.
preview_article_for_cms
Preview the article a push to one CMS connection would file, without filing it or writing any push record -- the vendor's own rendered draft (title, excerpt, contentHtml), exactly what a push would send. An article with images also carries featuredImage {alt, credit, previewUrl} and images [{slot, alt, caption, credit, previewUrl}], each previewUrl a link minted for this read or null when none could be had; the body's image blocks use the same URLs. Gated at story:read for any actor, unlike the push: a viewer who cannot push can still see what would go out. cmsConnection takes a connection id or a connection name (case-insensitive) -- use list_cms_push_targets to find one. A name matching more than one connection is refused, naming every match and its id, never resolved by picking one; a name lookup without story:push_cms is refused with that reason rather than reported as not found, since the id path is still open. Refused, each with its own reason, when the output is not ready or the connection's vendor has no registered publisher. The payload also carries claimCheck -- {blocked, openCount, unchecked} -- what the output's claim check would do to a push right now (blocked is open_findings, outdated or never_checked, or null when it would go through), so a preview is not read as a promise the push will succeed. It carries quoteCheck too -- {fields: [{field, spans}]} -- each article field (headline, standfirst, body) quoting words only a key quote dismissed on the story holds, with those words; the push is refused while any field is listed.
read-only · idempotent · closed-world
storyIdstring(required) — Story identifieroutputIdstring(required) — Story output identifiercmsConnectionstring(required) — A CMS connection id or display name -- see list_cms_push_targets
push_article_to_cms
File the generated article of one story output into one CMS connection, as an unpublished draft in the org's real newsroom -- use list_cms_push_targets to find a connection, get_story_output to confirm the output's status is "ready" (only a ready article can be filed), and preview_article_for_cms to see exactly what would be sent: there is no dryRun argument here, the dry run is its own tool. cmsConnection takes a connection id or a connection name (case-insensitive). A name matching more than one connection is refused, naming every match and its id, never resolved by picking one -- filing into whichever of two same-named newsrooms sorted first would stay invisible until someone found the draft; a name lookup without story:push_cms is refused with that reason rather than reported as not found, since the id path is still open. Idempotent per (output, connection, content version), NOT per article: a repeat call at the same content version is refused with a 409 conflict and files nothing, so retrying a push that may already have succeeded is safe -- but saving an edit advances the content version, and the same call then files the article again, on purpose. Nothing here takes a filed draft back. Refused, each with its own reason, when the output is not ready, when the connection's vendor has no registered publisher, on the already-filed conflict, and when the output's claim check holds it back. That refusal is a tool error whose text is JSON {error: "claim_check_blocked", reason, openCount, message}; branch on reason: outdated or never_checked means call request_story_output_claim_check, poll get_story_output until claimCheck.state is neither pending nor checking, then push again; open_findings means stop and leave the output for a person to accept or fix the findings, since re-checking does not clear them. A check that failed does not block, and the push record is marked unchecked. Also refused, with a 422 naming the first field, when the article quotes words only a key quote dismissed on the story holds (an editor's rejection: the words were given to the wrong person); preview_article_for_cms's quoteCheck and get_story_output's quoteFlags list the fields and words, and the fix is a person's edit or restoring the quote, never a retry. Needs a user credential, so an interactive MCP connection: a static API key authenticates as a service and there is no user to record as the pusher.
destructive · idempotent · closed-world
storyIdstring(required) — Story identifieroutputIdstring(required) — Story output identifiercmsConnectionstring(required) — A CMS connection id or display name -- see list_cms_push_targets
Report a problem with this page
Outputs
Reference for the 8 Outputs MCP tools: list_output_templates, get_story_output, list_story_outputs, add_story_output, regenerate_story_output, request_story_output_claim_check, accept_story_output_draft, discard_story_output_draft.
Insights
Reference for the 4 Insights MCP tools: top_pitches, pitch_to_story_trace, stories_ready_to_push, pitch_review_digest.