add_project_locale
Add a locale code (e.g. tr, es) to the project. Requires admin API ability. Codes are lowercased. Call when setting up a multilingual site before creating translated content.
Define a collection and its fields, write entries into it, and decide separately when readers get to see the change.
LABSCO SUMMARY
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.
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
USE CASES
Create the collection with its fields in the same request, add the ones you missed, and put them in the order an editor should meet them.
Send only the keys that changed, confirm the draft reads back the way you meant, and mint the new version when it is ready to go out.
Read the version list to find the last good snapshot, check its payload before committing to it, and restore it as a new published version.
Write the rows atomically so a bad one leaves nothing behind, correct them in place, and read the collection back with a filter to confirm the shape.
Register the locale on the project, decide which one is the default, and tie the translated entry to the original so they travel as one.
Bind the events you care about to a URL with a shared secret, scope it to the collections that matter, and read the delivery log when a build does not fire.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
add_project_localeAdd a locale code (e.g. tr, es) to the project. Requires admin API ability. Codes are lowercased. Call when setting up a multilingual site before creating translated content.
bulk_create_entriesCreate multiple content entries atomically. If one item fails, the whole request is rolled back.
bulk_delete_entriesDelete multiple content entries atomically by UUID. If one delete fails, no entries are deleted.
bulk_update_asset_metadataUpdate metadata for multiple assets atomically by UUID. If one item fails, all updates are rolled back.
bulk_update_entriesUpdate multiple content entries atomically by UUID. If one item fails, all updates are rolled back. Saves never change publish state — call publish_entry per UUID to mint new versions after bulk updates.
bulk_upload_assetsUpload multiple local files as assets atomically. If one upload fails, all uploads are rolled back.
create_collectionCreate a new collection. Optionally include field definitions to create the collection with its full schema in a single request.
create_entryCreate a new content entry in a collection
create_fieldAdd a new field to a collection
create_webhookCreate a webhook for content and auth events
delete_assetDelete an asset by UUID
delete_entrySoft-delete a content entry (moves to trash). Can be restored from the admin panel.
delete_webhookDelete a webhook by UUID
get_assetGet an asset by its UUID or by filename.
get_collectionGet a single collection with its full field schema by slug
get_entryGet a single content entry by UUID. Response includes uuid, locale, published_at, and a fields object (custom field values — not a nested data key). Relation fields appear as nested entry objects (one-to-one) or arrays of entries (one-to-many), not as bare UUIDs.
get_entry_versionFetch a single version's metadata and raw snapshot payload. The snapshot contains the saved field values in restoration format; for API-rendered content use get_entry with state='published'.
get_projectGet information about the current Noma project (name, uuid, default_locale, locales, etc.)
get_webhookGet a webhook by UUID
link_entry_translationMerge two entries in the same collection into one translation group (same as dashboard “link translation”). Both entries must exist, belong to this collection, and have different locales. There is no unlink via API — use the dashboard if you need to split a group. Requires an API key with update ability.
list_assetsList assets in the project with optional pagination.
list_collectionsList all collections in the project
list_entriesList content entries for a collection with advanced filtering, sorting, and pagination. Use the 'where' parameter for powerful queries. Read the 'query-reference' resource for full documentation on operators and examples.
list_entry_versionsList all published versions for a content entry (newest first). Each version is an immutable snapshot taken at publish time. Response includes version_number, label, description, published_at, created_by, and is_current_published for each version.
list_webhook_logsList delivery logs for a webhook
list_webhooksList all webhooks configured for the current project
patch_entryPartially update a content entry (HTTP PATCH). Only include fields you want to change (e.g. relations, one field). Saves NEVER change the publish state — call publish_entry explicitly to mint a new version. Prefer this over update_entry when you are not replacing the entire entry.
publish_entryMint a new immutable version from the entry's current draft and make it the live published version. After this call, state=published reads from the public API will return the new snapshot and is_draft_dirty is reset to false.
reorder_collectionsUpdate the display order of collections
reorder_fieldsUpdate the display order of fields within a collection
revert_entry_versionRestore the draft to a previous version's snapshot and publish it as a new version. The current unpublished draft is replaced. Returns the new version number.
set_default_project_localeSet the project's default locale. Adds the locale to the list if it was missing. Requires admin API ability.
unpublish_entryClear the live published pointer for an entry. The entry becomes invisible under state=published in the public API, but all historical versions are retained and still accessible via list_entry_versions / get_entry_version.
update_collectionUpdate the name and slug of an existing collection
update_entryReplace an existing content entry (HTTP PUT). Sends the full data payload; required fields (e.g. title, slug) must be included. Saves NEVER change the publish state — if the entry has a published version, the public API keeps serving that snapshot under state=published until you explicitly call publish_entry. Use patch_entry for partial updates and publish_entry/unpublish_entry to control visibility.
update_entry_version_labelUpdate a version's editable label and/or description. The snapshot payload itself is immutable.
update_fieldUpdate an existing field on a collection
update_webhookUpdate a webhook by UUID
upload_assetUpload a local file as an asset. Provide the absolute file path.
BEFORE YOU INSTALL
39 tools when we connected. Removing a project locale is dashboard-only. Abilities are per key: without admin you cannot create collections or fields, and without delete you cannot delete entries, assets or webhooks.
Both documented clients run the server on your machine.
CONTEXT COST
Rated by the size of the 39 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
npx -y @nomacms/mcp-server{
"mcpServers": {
"nomacms": {
"command": "npx",
"args": [
"-y",
"@nomacms/mcp-server"
],
"env": {
"NOMA_API_KEY": "<YOUR_NOMA_API_KEY>",
"NOMA_PROJECT_ID": "<YOUR_NOMA_PROJECT_ID>"
}
}
}
}claude mcp add nomacms -e NOMA_API_KEY=<YOUR_NOMA_API_KEY> -e NOMA_PROJECT_ID=<YOUR_NOMA_PROJECT_ID> -- npx -y @nomacms/mcp-server