NomaCMS MCP Server
OfficialNomaCMS MCP Server
An MCP (Model Context Protocol) server that connects AI agents like Cursor and Claude Code to your NomaCMS project. Manage collections, fields, content entries, assets, and webhooks programmatically through natural language.
Configuration
NOMA_API_KEY: API key from User settings → API keys — see API key abilities.NOMA_PROJECT_ID: Your project's UUID — you can find it on the project home page or under Project settings → API Access
Related MCP server: elmapicms-mcp-server
Usage with Cursor
Add this to your Cursor MCP settings (~/.cursor/mcp.json):
{
"mcpServers": {
"nomacms": {
"command": "npx",
"args": ["-y", "@nomacms/mcp-server"],
"env": {
"NOMA_API_KEY": "your-api-key",
"NOMA_PROJECT_ID": "your-project-uuid"
}
}
}
}Usage with Claude Code
Add the MCP server using the Claude Code CLI:
claude mcp add nomacms \
-e NOMA_API_KEY=your-api-key \
-e NOMA_PROJECT_ID=your-project-uuid \
-- npx -y @nomacms/mcp-serverAvailable Tools (39)
Project
get_project— Get project information (default_locale,locales, etc.)add_project_locale— Add a locale code to the project (requires admin)set_default_project_locale— Set the default locale (requires admin)
Removing locales is intentionally not exposed here (use Project settings → Localization in the NomaCMS dashboard if you must remove a locale).
Collections
list_collections— List all collectionsget_collection— Get a collection with its full field schemacreate_collection— Create a collection (with optional batch field creation)update_collection— Update a collection's name and slugreorder_collections— Reorder collections
Fields
create_field— Add a field to a collectionupdate_field— Update a fieldreorder_fields— Reorder fields within a collection
Content Entries
list_entries— List entries with advanced filtering (wherewith 13 operators, OR groups, relation filtering), sorting, pagination, count, and firstget_entry— Get a single content entrycreate_entry— Create a content entryupdate_entry— Update a content entrypatch_entry— Partially update an entry (HTTP PATCH; merge only the fields you send)publish_entry— Publish the draft as a new immutable version (update)unpublish_entry— Clear the live published pointer; versions retained (update)delete_entry— Soft-delete a content entry (moves to trash)bulk_create_entries— Create multiple entries atomicallybulk_update_entries— Update multiple entries atomically by UUIDbulk_delete_entries— Delete multiple entries atomically by UUIDlink_entry_translation— Link two entries (different locales) into the same translation group (POST …/link-translation; requires update ability)list_entry_versions— List version history for an entryget_entry_version— Fetch one version by number (includes snapshot payload)revert_entry_version— Restore draft from a prior snapshot and publish (update)update_entry_version_label— Edit label/description on a version; snapshot unchanged (update)
Content API shape: Each entry has uuid, locale, published_at, and fields (custom field values). Richtext values are markdown strings on write; on read they are either raw markdown or rendered HTML depending on the field’s editor.outputFormat (markdown vs html). Relation fields return nested entry objects (or arrays for one-to-many) on read; on write send only the related entry’s UUID or numeric id (never the full nested object from a previous get_entry). get_entry supports translation_locale, exclude, timestamps, and state query parameters.
Asset URLs: The API returns url, thumbnail_url, and original_url as stable links (optional ?variant=thumbnail or ?variant=original).
Assets
list_assets— List assets with paginationget_asset— Get an asset by UUID or filenameupload_asset— Upload a file as an assetbulk_upload_assets— Upload multiple files atomicallybulk_update_asset_metadata— Update metadata for multiple assets atomicallydelete_asset— Delete an asset
Webhooks
list_webhooks— List all webhooks for the projectget_webhook— Get a webhook by UUIDcreate_webhook— Create a webhook for content and auth events (name,url,events,sources; optionaldescription,secret,payload,status,collection_ids)update_webhook— Update a webhook by UUID (same fields as create)delete_webhook— Delete a webhook by UUIDlist_webhook_logs— List delivery logs for a webhook (uuid; optionalpaginate,page)
Resources
The server exposes three reference resources that AI agents can read for context:
Field Types Reference (
nomacms://field-types) — Complete reference of all 16 field types, their options, validations, and common patterns.Collections Guide (
nomacms://collections-guide) — Guide for working with collections, singletons, reserved slugs, and best practices.Query Reference (
nomacms://query-reference) — Full documentation for content queries:wherefilters with 13 operators, OR groups, relation filtering, sorting, pagination, and examples.
API key abilities
Your API key needs the appropriate abilities for the tools you want to use:
Ability | Tools |
| list/get collections, entries, assets, webhooks; webhook logs |
| create entries, upload assets, create webhooks |
| update entries, |
| delete entries, delete assets, delete webhooks |
| create/update/reorder collections and fields; add/set default project locales (MCP does not expose locale removal) |
Create the key in the NomaCMS dashboard under User settings → API keys. Copy the Project ID from the project home page or Project settings → API Access when you configure this server.
Using Multiple Projects
Each MCP entry connects to a single NomaCMS project. To work with multiple projects, add separate entries in your MCP config:
{
"mcpServers": {
"nomacms-blog": {
"command": "npx",
"args": ["-y", "@nomacms/mcp-server"],
"env": {
"NOMA_API_KEY": "blog-project-api-key",
"NOMA_PROJECT_ID": "blog-project-uuid"
}
},
"nomacms-store": {
"command": "npx",
"args": ["-y", "@nomacms/mcp-server"],
"env": {
"NOMA_API_KEY": "store-project-api-key",
"NOMA_PROJECT_ID": "store-project-uuid"
}
}
}
}License
MIT
Available Tools
39 toolsadd_project_localeAdd project localeA
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.
Inputs: locale (required).
bulk_create_entriesBulk Create EntriesA
Create multiple content entries atomically. If one item fails, the whole request is rolled back.
Inputs: items (required), collection_slug (required).
bulk_delete_entriesBulk Delete EntriesA
Delete multiple content entries atomically by UUID. If one delete fails, no entries are deleted.
Inputs: uuids (required), collection_slug (required), force.
bulk_update_asset_metadataBulk Update Asset MetadataA
Update metadata for multiple assets atomically by UUID. If one item fails, all updates are rolled back.
Inputs: items (required).
bulk_update_entriesBulk Update EntriesA
Update 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.
Inputs: items (required), collection_slug (required).
bulk_upload_assetsBulk Upload AssetsA
Upload multiple local files as assets atomically. If one upload fails, all uploads are rolled back.
Inputs: file_paths (required).
create_collectionCreate CollectionA
Create a new collection. Optionally include field definitions to create the collection with its full schema in a single request.
Inputs: name (required), slug (required), fields, is_singleton.
create_entryCreate EntryB
Create a new content entry in a collection
Inputs: data (required), collection_slug (required), state, locale, +1 more.
create_fieldCreate FieldB
Add a new field to a collection
Inputs: name (required), type (required), label (required), collection_slug (required), +5 more.
create_webhookCreate WebhookC
Create a webhook for content and auth events
Inputs: url (required), name (required), events (required), sources (required), +5 more.
delete_assetDelete AssetB
Delete an asset by UUID
Inputs: uuid (required).
delete_entryDelete EntryA
Soft-delete a content entry (moves to trash). Can be restored from the admin panel.
Inputs: uuid (required), collection_slug (required).
delete_webhookDelete WebhookB
Delete a webhook by UUID
Inputs: uuid (required).
get_assetGet AssetA
Get an asset by its UUID or by filename.
Inputs: identifier (required), by_name.
get_collectionGet CollectionA
Get a single collection with its full field schema by slug
Inputs: slug (required).
get_entryGet EntryA
Get 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.
Inputs: uuid (required), collection_slug (required), state, locale, +3 more.
get_entry_versionGet Entry VersionA
Fetch 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'.
Inputs: uuid (required), version_number (required), collection_slug (required).
get_projectGet ProjectA
Get information about the current Noma project (name, uuid, default_locale, locales, etc.)
Inputs: no named parameters.
get_webhookGet WebhookB
Get a webhook by UUID
Inputs: uuid (required).
link_entry_translationLink Entry TranslationA
Merge 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.
Inputs: uuid (required), collection_slug (required), translation_entry_uuid (required).
list_assetsList AssetsC
List assets in the project with optional pagination.
Inputs: page, paginate, per_page.
list_collectionsList CollectionsA
List all collections in the project
Inputs: no named parameters.
list_entriesList EntriesB
List 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.
Inputs: collection_slug (required), sort, count, first, +7 more.
list_entry_versionsList Entry VersionsA
List 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.
Inputs: uuid (required), collection_slug (required).
list_webhook_logsList Webhook LogsB
List delivery logs for a webhook
Inputs: uuid (required), page, paginate.
list_webhooksList WebhooksA
List all webhooks configured for the current project
Inputs: no named parameters.
patch_entryPatch EntryA
Partially 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.
Inputs: data (required), uuid (required), collection_slug (required), locale.
publish_entryPublish EntryA
Mint 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.
Inputs: uuid (required), collection_slug (required).
reorder_collectionsReorder CollectionsB
Update the display order of collections
Inputs: collections (required).
reorder_fieldsReorder FieldsB
Update the display order of fields within a collection
Inputs: fields (required), collection_slug (required).
revert_entry_versionRevert Entry VersionA
Restore 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.
Inputs: uuid (required), version_number (required), collection_slug (required).
set_default_project_localeSet default project localeA
Set the project's default locale. Adds the locale to the list if it was missing. Requires admin API ability.
Inputs: locale (required).
unpublish_entryUnpublish EntryA
Clear 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.
Inputs: uuid (required), collection_slug (required).
update_collectionUpdate CollectionC
Update the name and slug of an existing collection
Inputs: name (required), slug (required), new_slug (required).
update_entryUpdate EntryA
Replace 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.
Inputs: data (required), uuid (required), collection_slug (required), locale.
update_entry_version_labelUpdate Entry Version LabelA
Update a version's editable label and/or description. The snapshot payload itself is immutable.
Inputs: uuid (required), version_number (required), collection_slug (required), label, +1 more.
update_fieldUpdate FieldB
Update an existing field on a collection
Inputs: name (required), type (required), label (required), field_uuid (required), +5 more.
update_webhookUpdate WebhookC
Update a webhook by UUID
Inputs: url (required), name (required), uuid (required), events (required), +6 more.
upload_assetUpload AssetB
Upload a local file as an asset. Provide the absolute file path.
Inputs: file_path (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 39 tools
Each tool targets a distinct operation or resource. Bulk and single operations are clearly separated, and actions like publish, unpublish, patch, and update are well-differentiated through descriptions.
The naming follows a consistent verb_noun pattern in snake_case, with minor exceptions like 'link_entry_translation' and 'reorder_collections' that break the pattern slightly.
At 39 tools, the server is overpopulated for a typical CMS MCP server. While the domain is broad, many tools could be consolidated (e.g., bulk operations as parameters).
The tool surface covers most CRUD operations for entries, assets, collections, fields, and webhooks, but lacks delete operations for collections and fields, and asset file update is missing.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Related MCP Servers
AlicenseAqualityBmaintenanceAn MCP server that enables AI assistants to manage content, media, and schemas within Cosmic CMS buckets. It allows users to perform CRUD operations on objects and types while providing tools for AI-driven text, image, and video generation.19251 npm1MIT
elmapicms-mcp-serverofficial
AlicenseBqualityDmaintenanceAn MCP server that connects AI agents like Cursor and Claude Code to your ElmapiCMS instance. Manage collections, fields, content entries, and assets programmatically through natural language.188 npm7MIT- AlicenseAqualityDmaintenanceMCP server for Strapi CMS content and media management.1515 npmMIT
- AlicenseNot gradedqualityBmaintenanceAgent-first headless CMS running as a Cloudflare Worker, providing MCP servers for schema/content management and editorial operations.17 npm5MIT