update_entry, patch_entry and bulk_update_entries all state the same thing: a save never moves the publish pointer, so reads at state=published keep returning the last minted version until publish_entry runs. That makes staged editing the default rather than something you build, and it makes publish_entry the call that actually ships. There are edges worth knowing before you automate against it. A translation group can be created through link_entry_translation but not split — undoing one is a dashboard action, not an API call. And the bulk tools are all-or-nothing by design, which is what you want for a migration and is worth remembering when a single malformed row stops the batch.
The official MCP server for a NomaCMS project, exposing 39 tools that cover the content model, entries and their draft and published versions, translation groups, assets and webhooks.
- The content model itself, not only its contents: create_collection can carry its full field schema in the same request, create_field and update_field set type, options, validations, label and placeholder, and reorder_collections and reorder_fields control display order.
- Reads that come back shaped for use: get_entry returns a fields object with relation fields already expanded into nested entry objects or arrays rather than bare UUIDs, and list_entries takes a where expression alongside sort, state, locale and pagination.
- Writes split by intent: update_entry replaces the whole entry over HTTP PUT and needs the required fields present, while patch_entry changes only the keys you send.
- Publication as its own step: publish_entry mints an immutable version and resets is_draft_dirty, unpublish_entry clears the live pointer while keeping every historical version, and delete_entry is a soft delete recoverable from the admin panel.
- A version history you can read and walk back into: list_entry_versions returns version_number, label, description, published_at, created_by and is_current_published, get_entry_version returns the raw snapshot payload, revert_entry_version restores a snapshot into the draft and publishes it as a new version, and update_entry_version_label renames a version without touching its snapshot.
- Atomic bulk operations: bulk_create_entries, bulk_update_entries, bulk_delete_entries, bulk_upload_assets and bulk_update_asset_metadata each roll the whole request back if a single item fails.
- Multilingual structure: add_project_locale and set_default_project_locale manage the project's locale list, and link_entry_translation merges entries in different locales into one translation group.
- Assets and delivery hooks: upload_asset takes an absolute path, get_asset resolves by UUID or by filename, and create_webhook binds content and auth events to a URL with a secret, a payload, source filters and specific collection_ids, with list_webhook_logs showing what was delivered.
A NomaCMS project API key and the project it addresses, supplied as NOMA_API_KEY and NOMA_PROJECT_ID. Changing the project's locales needs a key carrying admin ability, and link_entry_translation needs one carrying update ability, so a read-and-write key alone will not cover the whole tool set.
One command plus a key — npx -y @nomacms/mcp-server, then supply credentials
