Skip to main content
Glama
NomaCMS MCP Server

NomaCMS MCP Server

Official
by NomaCMS

NomaCMS 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-server

Available 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 collections

  • get_collection — Get a collection with its full field schema

  • create_collection — Create a collection (with optional batch field creation)

  • update_collection — Update a collection's name and slug

  • reorder_collections — Reorder collections

Fields

  • create_field — Add a field to a collection

  • update_field — Update a field

  • reorder_fields — Reorder fields within a collection

Content Entries

  • list_entries — List entries with advanced filtering (where with 13 operators, OR groups, relation filtering), sorting, pagination, count, and first

  • get_entry — Get a single content entry

  • create_entry — Create a content entry

  • update_entry — Update a content entry

  • patch_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 atomically

  • bulk_update_entries — Update multiple entries atomically by UUID

  • bulk_delete_entries — Delete multiple entries atomically by UUID

  • link_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 entry

  • get_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 pagination

  • get_asset — Get an asset by UUID or filename

  • upload_asset — Upload a file as an asset

  • bulk_upload_assets — Upload multiple files atomically

  • bulk_update_asset_metadata — Update metadata for multiple assets atomically

  • delete_asset — Delete an asset

Webhooks

  • list_webhooks — List all webhooks for the project

  • get_webhook — Get a webhook by UUID

  • create_webhook — Create a webhook for content and auth events (name, url, events, sources; optional description, secret, payload, status, collection_ids)

  • update_webhook — Update a webhook by UUID (same fields as create)

  • delete_webhook — Delete a webhook by UUID

  • list_webhook_logs — List delivery logs for a webhook (uuid; optional paginate, 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: where filters 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

read

list/get collections, entries, assets, webhooks; webhook logs

create

create entries, upload assets, create webhooks

update

update entries, link_entry_translation, update asset metadata, update webhooks

delete

delete entries, delete assets, delete webhooks

admin

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 tools
add_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

    B3.4/5.0

    Scored across 39 tools

    Disambiguation5/5

    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.

    Naming Consistency4/5

    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.

    Tool Count2/5

    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).

    Completeness3/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      An 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.
      19
      251 npm
      1
      MIT
    • A
      license
      B
      quality
      D
      maintenance
      An 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.
      18
      8 npm
      7
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Agent-first headless CMS running as a Cloudflare Worker, providing MCP servers for schema/content management and editorial operations.
      17 npm
      5
      MIT