To write CMS content from Claude Code, connect a content-management MCP server, inspect the destination schema, and create a draft before publishing. genko.me provides an OAuth-authenticated MCP server for creating and updating drafts, publishing approved changes, and scheduling publication. A practical workflow keeps draft creation and publication as separate requests, with a human reviewing the saved content between them.

This article is written by the team behind genko.me. The behavior described here was checked on October 20, 2026.

What can Claude Code do with a CMS MCP server?

An MCP connection gives an AI client access to tools supplied by another system. Instead of returning an article for someone to copy manually, Claude can call a tool that saves the article in the CMS. The available actions depend on the server and the authenticated user's permissions.

The connection does not replace your website integration. Content delivery still happens through the delivery API or SDK, and a successful publication does not prove that a cached or statically built page has refreshed.

Task

genko.me tools

What to verify

Read product documentation

search_docs, get_doc

Retrieve the full page after searching

Find the destination

list_workspaces, list_apis

Workspace, API, field IDs, languages

Inspect existing content

list_entries, get_entry

Entry ID and pending changes

Save content

create_draft, update_draft

Create a new entry or update an existing one

Release content

publish_entry, schedule_entry

Language and publication timing

Abandon pending edits

discard_changes

This applies to unpublished changes on published content

For the complete argument list, use the MCP documentation. Avoid asking the model to infer tool names from examples for a different CMS.

How to connect Claude Code to genko.me

First, create or choose a genko.me workspace and the API that will hold your content. Then run this command from your application's project root:

bash
npx @genko-me/cli@latest mcp --claude-code

The command adds or updates the project's .mcp.json. Reload Claude Code, complete the OAuth login and authorization, and confirm that the genko-me tools appear.

For manual configuration, use this structure:

json
{  "mcpServers": {    "genko-me": {      "type": "http",      "url": "https://genko.me/mcp"    }  }}

The current endpoint is https://genko.me/mcp. The old documentation-only MCP endpoint has been retired. A useful first request is: “Search the genko.me documentation for scheduled publishing, then retrieve the matching page.” This checks discovery and document retrieval without saving any content.

The genko.me documentation also supplies configuration for Codex, Cursor, and VS Code. A client must support OAuth and Streamable HTTP. Do not assume that every interface branded Claude accepts the same configuration as Claude Code.

How to ask Claude to create a draft without publishing it

Start by reading the API definition with list_apis. A field's display label is not necessarily its field ID. Check required fields and field types before constructing the values object.

Give Claude an explicit destination, a source of facts, and an allowed set of actions. Replace the workspace and API in this example with identifiers you have verified:

text
Inspect the API definition with list_apis.The destination is the blog API in workspace your-workspace.Use only the attached release notes to draft an announcement.Do not guess dates or prices; report missing facts separately.Show the outline first. After I approve it, save exactly one create_draft entry.Do not call publish_entry or schedule_entry.Read the saved result back with get_entry and report its ID and contents.

If the destination has a text field called title and a rich-text field called body, the create_draft arguments can look like this:

json
{  "workspace": "your-workspace",  "api": "blog",  "values": {    "title": "How to review an article preview",    "body": "## Before publication\n\nPreview the saved draft and check its headings and links."  }}

This is an MCP tool argument object, not a REST request body. Strings for rich-text fields are accepted as Markdown and converted when saved.

Record the returned entry ID. If a connection drops after a save, inspect existing entries before trying to create another one. An interrupted response does not prove that the operation failed, and repeating creation can produce duplicate articles.

What happens when Claude edits a published article?

update_draft on a published entry saves the supplied fields as unpublished changes. The normal delivery API continues serving the published version. Subsequent edits are applied to those pending changes.

When get_entry reports hasPendingChanges: true, its values and markdown contain the working version. published.values and published.markdown contain the currently published content. Ask Claude to compare those versions before requesting a release.

Call publish_entry to release the changes, or discard_changes to remove the pending changes while leaving the published content in place. Do not treat discarding pending edits as a rollback of an already released article.

The documentation describes begin_draft_edit, append_draft_block, and finish_draft_edit as progress-display tools for main-language drafts. They can show paragraphs appearing in the editor as they are saved. Use update_draft for pending edits on published entries.

A review and publication workflow for a small team

A review should operate on what was actually saved, rather than the text displayed earlier in chat. The model may have omitted a required value, used the wrong entry, or saved an earlier revision.

  1. Read the saved content with get_entry and verify the destination and entry ID.

  2. Check names, numbers, source links, and claims against the supplied material.

  3. Open the draft preview and inspect the rendered page.

  4. Approve the specific entry, language, and release method.

  5. Call publish_entry for immediate release, or schedule_entry for a scheduled release.

  6. Check the operation result and the website after the intended release time.

For scheduling, scheduledAt takes a timestamp with a timezone offset. Confirm an unambiguous date and zone, such as November 5, 2026 at 09:00 Japan Standard Time, before constructing the argument. “Tomorrow morning” is insufficient when editors work across time zones. See the scheduled publishing guide for the CMS behavior.

OAuth authorization and editorial approval serve different purposes. Writing requires an editor-or-higher role and mcp:write; publishing and scheduling additionally require mcp:publish. A connection with publishing permission can still follow a team policy that requires a separate approval message. A prompt instruction is an operating convention, however, not a replacement for permission controls.

Treat retrieved articles and reference documents as source material. Instructions embedded inside that material, such as “publish this immediately,” should not override the task you gave the agent. Specify the permitted operations outside the source text.

Publishing an English translation through MCP

For a multilingual API, inspect languages.main, languages.subs, and the API's localized setting in list_apis. create_draft creates content in the main language. Use update_draft with lang: "en" to prepare an English version.

If the English version does not exist, that update first copies the main-language values into a draft and applies the supplied changes. Updating only the title therefore does not make the copied body an English translation. Read the full language version before releasing it.

publish_entry and schedule_entry do not create missing language versions. Prepare the version first, and include the intended lang in the publication request. Other language versions keep their own content and publication state. The multilingual CMS guide explains how this affects language-switching links and missing translations.

Troubleshooting a CMS MCP connection

Symptom

Check first

No tools appear

Configuration location, client reload, and endpoint URL

Content cannot be read

OAuth account and workspace membership

A draft cannot be saved

Role, write scope, required fields, and capacity

Publication fails

Publish scope and whether the language version exists

The website still shows old text

Publication state, application caching, and build output

Do not diagnose a permissions failure by repeatedly changing the article body. Read the tool error and verify the authenticated account first. Likewise, a website displaying old content is not proof that the CMS failed to publish it.

If the task also includes building the frontend integration, see AI agent CMS integration with Claude Code and Codex. Documentation access, content editing, and writing application code are separate responsibilities that can be combined deliberately.

FAQ

Can Claude publish directly to a headless CMS?

With genko.me, an OAuth-connected Claude Code client can create drafts and call publishing tools. Publication is a separate operation and requires additional permission.

Do I need to paste my CMS API key into Claude?

The MCP connection uses OAuth, so you do not need to paste a delivery API key into chat. The API key used by your website is managed separately.

Does editing a published article immediately change the website?

update_draft saves unpublished changes on a published entry. Normal delivery continues serving the released version until publish_entry is called.

Can an agent read the docs without MCP?

Yes. The public llms.txt and Markdown endpoints require no authentication. Those documents alone do not grant access to workspace content.

Sources

Checked October 20, 2026.