Cmssy

io.github.cmssy-io由 GitHub 帳號 cmssy-io 發布v0.135.1更新於 Nov 7, 2026

Hosted headless CMS with native commerce: pages, media, forms, products, orders, refunds, discounts.

已驗證Streamable HTTP可網頁執行資料庫效率與工作流商業與電商

概覽

AI 產生的概覽

Cmssy 的 MCP 伺服器:一個內建電商功能的託管式無頭 CMS,讓助理管理頁面、記錄、媒體、商品、訂單與折扣。

可以做什麼
  • 讀取站台內容:頁面樹、頁面區塊與區域、站台設定、工作區資訊、媒體庫與頁面回收筒
  • 建立與編輯頁面:新增頁面、設定區塊、局部修補 HTML 內容、更新 SEO、版面與區域設定,以及發布、取消發布、還原與復原
  • 定義自訂資料模型並對其記錄做增刪改查,支援批次匯入與批次更新
  • 管理電商業務:訂單、付款、退款、退貨、出貨、購物車、折扣、含庫存與變體的商品、價格表與銷售通路
  • 管理客戶與對外 Webhook,並取得用來建置 Next.js 前端的站台初始化檔案
適用情境
適合讓助理在 Cmssy 工作區中撰寫或重整內容,或在不開啟後台介面的情況下處理商店營運,例如核對訂單、處理退貨、調整庫存與價格、管理折扣碼與價格表。
執行需求
可使用 api.cmssy.io/mcp 的託管端點並以 OAuth 登入,也可透過 npx 在本機以 stdio 執行 npm 套件。需要一個 Cmssy 工作區、以 cs_ 開頭的 API 權杖(CMSSY_API_TOKEN 或 --token)以及工作區 ID(CMSSY_WORKSPACE_ID 或 --workspace-id);CMSSY_API_URL 為選用。購物車與結帳功能需要 Pro 方案。
安裝前請注意
權杖以建立它的成員權限行事,變更密碼不會使其失效,需在 Dashboard > API Tokens 中刪除。未限定範圍的權杖可存取你所屬的所有工作區。許多工具會寫入、發布、退款、刪除或批次修改資料,刪除模型會連帶刪除其全部記錄。Webhook 簽章密鑰只回傳一次。工具呼叫會把參數、權杖、工作區 ID 與用戶端名稱傳送給 Cmssy API。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Cmssy,將其新增到工作區。
  2. 連接 所需的 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.cmssy-io%2Fcmssy-mcp/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。 客戶端會在首次連接時完成 OAuth 登入。

{
  "mcpServers": {
    "cmssy": {
      "type": "http",
      "url": "https://api.cmssy.io/mcp"
    }
  }
}

README

@cmssy/mcp-server

MCP server for Cmssy, a hosted headless CMS with built-in commerce. Lets an AI agent work with pages, records, media, forms, products, orders, refunds and discounts in a Cmssy workspace.

Hosted server (no install)

https://api.cmssy.io/mcp serves the same tools over HTTP. Claude (web, desktop, Code) and Codex connect by signing in to cmssy. A client that asks for a server URL and an API key - v0, Lovable, Bolt or your own - sends a cs_ token instead:

URL:    https://api.cmssy.io/mcpHeader: Authorization: Bearer cs_YOUR_TOKEN

A token scoped to one workspace reaches only that workspace; an unscoped token reaches every workspace you belong to. Every tool takes a workspace (<orgSlug>/<workspaceSlug>), and list_workspaces names the ones the token may use. It reads and writes with your role in each workspace. Changing your password does not revoke it - delete it under Dashboard > API Tokens. Details: cmssy.com/docs/api/mcp.

Setup

Prerequisites

  1. A Cmssy workspace - the free plan works; cart and checkout need Pro
  2. An API token (Dashboard > API Tokens, starts with cs_)
  3. Your workspace ID (Workspace Settings > General)

The server talks to https://api.cmssy.io by default. Pass --api-url only for another backend.

Add to Claude Code

Add to .mcp.json in your project root:

json
{  "mcpServers": {    "cmssy": {      "type": "stdio",      "command": "npx",      "args": [        "-y",        "@cmssy/mcp-server@latest",        "--token",        "cs_YOUR_TOKEN",        "--workspace-id",        "YOUR_WORKSPACE_ID"      ]    }  }}

Environment Variables

Instead of CLI args, you can set:

  • CMSSY_API_TOKEN — API token (cs_xxx)
  • CMSSY_WORKSPACE_ID — Workspace ID
  • CMSSY_API_URL — API URL (optional; defaults to https://api.cmssy.io, so set it only for a self-hosted backend)

Checking which build is running

--version and --help need no token, so they answer even when the server is not configured. Run the flag against the same spec your client launches, copied out of your mcp.json:

bash
npx -y @cmssy/mcp-server --version          # what an unpinned config runsnpx -y @cmssy/mcp-server@latest --version   # what the registry serves todaynpm view @cmssy/mcp-server version          # the newest published version

The first two can disagree, and that disagreement is the answer: a warm npx cache holds the build an unpinned spec resolved to earlier, while @latest re-resolves and reports the newest one. So @latest --version cannot diagnose a stale cache - it is the command that hides it. Ask the unpinned spec first when a tool fails on a field the API should serve, then compare.

Clearing the cache is npx clear-npx-cache, or pin the version in your config so nothing has to be diagnosed.

Privacy Policy

Full policy: https://www.cmssy.com/privacy. Contact: [email protected].

  • What this server collects: nothing of its own. It keeps no local database, writes no files and sends nothing to any analytics service.
  • What it sends, and where: each tool call becomes a GraphQL request to the Cmssy API (https://api.cmssy.io unless you set CMSSY_API_URL), carrying your API token, your workspace ID, the tool's arguments, the client name and version, and the name of the tool being run. The Cmssy API records one usage event per tool call from those last two.
  • Files and URLs: upload_media reads only the local file path or downloads only the URL you pass it, then uploads the bytes to the Cmssy storage URL the API returns. It touches no other file.
  • Usage and storage: the Cmssy API stores workspace content (pages, records, media, orders, customers) as described in the policy above, in the European Union. Content is not sold and not used to train AI models.
  • Third-party sharing: the server talks to the Cmssy API and the Cmssy storage URL only, plus any URL you hand to upload_media. Third parties the Cmssy service itself uses are listed in the policy.
  • Data retention: the server keeps nothing after a call returns. Workspace data stays until you delete it or close your account; retention periods are in the policy.
  • Your token: it acts with the permissions of the member who created it. Revoke it under Dashboard > API Tokens at any time.

Response shape (write tools)

As of 0.6.0, most write tools accept an optional response arg:

  • response: "minimal" (default) - returns a small ack (~200 bytes): {id, slug, hasUnpublishedChanges, updatedAt} for page tools, {pageId, blockId, hasUnpublishedChanges, updatedAt} for block tools, {id, slug, status, updatedAt} for form tools, {id, slug, updatedAt} for model tools, {id, status, updatedAt} for record tools, {id, orderNumber, status, paymentStatus, fulfillmentStatus, total, balanceDue, currency, updatedAt} for order tools, {id, code, type, value, enabled, updatedAt} for discount tools.
  • response: "full" - returns the full mutation response (pre-0.6 behavior).

Use "full" only if you need the post-write state inline; otherwise issue a follow-up get_page/get_form/get_model/get_record. This keeps agent context windows from being eaten by echoed content.

Tools that accept response: create_page, update_page_blocks, update_page_settings, publish_page, unpublish_page, revert_to_published, update_page_layout, add_block_to_page, update_block_content, remove_block_from_page, create_form, update_form, create_model, update_model, create_record, update_record, create_manual_order, edit_order, update_order_details, mark_order_paid, record_order_payment, refund_order, cancel_order, close_order, reopen_order, create_return, approve_return, reject_return, cancel_return, receive_return, refund_return, complete_return, update_return_tracking, create_shipment, update_shipment, set_order_pipeline_stage, record_order_invoice, record_order_invoice_correction, create_discount, update_discount, set_discount_enabled.

patch_block_content and the various delete_* / status-only tools (update_form_submission_status, import_records) already returned a compact ack and don't take response.

Building a site

On connect the server sends instructions that send an agent (v0, Lovable, Bolt, Claude) to get_site_setup first. It returns the files cmssy init writes for Next.js - catch-all page, editor route, proxy, config, block registry, header/footer regions - with the workspace's env vars filled in. The agent then deploys, calls set_preview_url, creates the content.changed webhook for /api/revalidate, has the user open the editor once so the block types register, creates the pages with header and footer in their layout regions, and publishes them.

Available Tools

Read Tools

ToolDescription
get_site_setupEverything to build a site on the workspace: the files to write, packages, env vars filled in, steps
list_pagesPage tree with hierarchy (optional search filter)
get_pageFull page with blocks, i18n content and region settings (own regionSettings + resolved resolvedRegions with inheritance source) by slug or id
get_site_configLanguages, navigation, site name
get_workspace_infoWorkspace name, plan, limits
list_mediaMedia library listing
list_trashed_pagesPage trash: deleted groups with who deleted them, subtree size and when each is purged (30 days after deletion)

Write Tools

ToolDescription
create_pageCreate a new page
update_page_blocksSet full blocks array on a page
update_page_settingsUpdate page metadata and SEO
publish_pagePublish a page
set_preview_urlPoint the editor at the deployed app (stores the URL's origin)
unpublish_pageUnpublish a page
delete_pageMove a page and its subtree to the trash, restorable for 30 days
restore_pageRestore a trashed page group as unpublished drafts
revert_to_publishedDiscard draft, revert to published

Block Helper Tools

ToolDescription
add_block_to_pageInsert a block at position (auto-generates UUID + translations)
update_block_contentMerge content into an existing block
patch_block_contentSurgical HTML patch (insert/replace around unique markers)
remove_block_from_pageRemove a block by ID
update_page_layoutUpdate layout blocks and overrides
update_region_settingsSet one layout region's settings (manifest-validated; other regions untouched)
update_region_settings

Region (layout position) settings are declared by the workspace's layout manifest and validated against it on write. The tool reads the page's current layoutRegionSettings, replaces only the named region and writes the whole list back, so sibling regions keep their values (entries for regions the manifest no longer declares, and keys a region's schema no longer has, are dropped on the way - the same pruning the admin editor does). The backend's own BAD_USER_INPUT message is returned verbatim for an unknown region, an unknown key, or a non-empty values on a region that declares no settings (such a region accepts values: {} only); blockWarnings are surfaced when present.

jsonc
{ "pageId": "...", "region": "sidebar", "values": { "width": "wide" } }

Child pages inherit a region's settings unless they set their own - get_page shows the effective value per region in resolvedRegions (settingsAreInherited, settingsSourcePageId).

patch_block_content

For small edits on long HTML content strings (e.g. a docs-article body), patch_block_content is ~10x cheaper in tokens than update_block_content and catches marker mistakes before anything writes to the DB.

jsonc
{  "pageId": "...",  "blockId": "...",  "locale": "en",  "operations": [    {      "op": "insert_before",      "marker": "<h2>Environment Variables</h2>",      "html": "<hr><h2>cmssy skills install</h2><p>...</p>",    },  ],}

Four ops: insert_before, insert_after, replace_section, replace_all. Every marker must match exactly once - 0 or 2+ matches error out with the actual count (no silent half-applied state). For replace_section, startMarker is inclusive and endMarker is exclusive. replace_all sets the whole string and takes expected, the current value - refused if it moved.

Requires @cmssy/cli-registered workspace with PAGES_EDIT permission. Default fieldPath is "content" (the HTML body on docs-article); override if patching a different string field. Dot segments reach a nested string, e.g. tabs.0.label for the first tab's label.

Model Tools (Custom Data Models)

AI agents can define ModelDefinitions and CRUD their records. Schema/fields follow PropertyField from @cmssy/types; records are validated against the model on every write.

ToolDescription
list_modelsList all ModelDefinitions in the workspace
get_modelGet a model by id (ObjectId) or slug
create_modelCreate a model (name, slug, fields, optional statusField)
update_modelUpdate any field of a model (fields change triggers schema migrate)
delete_modelDelete a model — cascades to all its records
list_recordsList records with filter (JSON), sort, pagination, optional populate
get_recordGet a record by id; a company record carries its VAT id, verification and exemption
create_recordCreate a record; data keyed by model field keys
update_recordUpdate a record's data and/or transition its status
delete_recordDelete a record
import_recordsBulk import up to 1000 records; returns { importedCount, errors }
bulk_update_recordsSet data and/or status on up to 200 ids or every filter match

Requires workspace permissions MODELS_VIEW (read) / MODELS_CREATE / MODELS_EDIT / MODELS_DELETE depending on the operation.

Commerce Tools (Orders, Carts, Discounts)

Manage the storefront's orders, carts, and discount codes. All money fields are integer minor units (cents). Order/discount write tools accept the response arg (see Response shape).

ToolDescription
list_ordersList orders by payment/fulfillment/delivery/state, warehouse queue, customer, currency, dates; pages with skip/limit
get_orderGet an order with items, payments, parcels, invoices and corrections, tax summary and treatment, sales channel and the price lists that priced it
get_order_pipelineGet the workspace's configurable order pipeline stages
create_manual_orderCreate an admin-entered order, with an optional shipping address
edit_orderReplace an order's line items (recomputes totals)
update_order_detailsUpdate customer email, notes, PO number, and shipping address
mark_order_paidRecord a full payment (manual reconciliation, no provider verify)
record_order_paymentRecord a partial payment against the balance due
refund_orderRefund an order (full, or partial with amount)
cancel_orderCancel an order
close_orderMark an order done; reopens itself if payment or fulfillment slips
reopen_orderReopen a closed order
create_returnOpen a return: lines, quantities, reasons, return-parcel tracking
approve_returnApprove a return the customer requested
reject_returnReject a requested return
cancel_returnCancel a return not yet refunded
receive_returnRecord received units per line and how many go back to stock
refund_returnRecord a refund for a return
complete_returnClose a received return without a refund
update_return_trackingSet the carrier and tracking number of the return parcel
create_shipmentAdd a parcel (carrier, tracking number, link, status) to an order
update_shipmentChange a parcel's status or tracking, with a note for its history
set_order_pipeline_stageMove an order to a pipeline stage
record_order_invoiceAttach an invoice (number, url, provider) to an order
record_order_invoice_correctionAttach a correction invoice (credit note) to an invoiced order
list_cartsList shopping carts (admin view, optional status filter) with their sales channel
delete_cartsPermanently delete 1-100 carts, all or nothing
list_discountsList discount codes (filter by enabled/type/code)
get_discountGet a discount by id
create_discountCreate a discount (percentage / fixed / free_shipping)
update_discountPartial update (code/type/currency lock once the code is used)
set_discount_enabledEnable or disable a discount
list_productsProduct catalog with stock + variant info (over a Data Model)
bulk_update_productsBulk set/adjust status, stock, or price on selected products
bulk_delete_productsBulk-delete selected product records
set_product_tiersSet a product's record-level volume price breaks
set_product_variantsReplace a product's whole variant set
set_product_currency_pricesReplace a product's prices and breaks in additional currencies, and variants' per-currency prices without touching stock

Products are records of a Custom Data Model; these tools add product-aware stock/variant reads and bulk writes on top of the generic record tools. The bulk tools target an explicit ids list or everything matching a filter (allMatching: true). There is no per-variant stock write and no standalone inventory mutation - stock is set/adjusted in bulk via patch.setStock / patch.adjustStock.

Requires workspace permissions ORDERS_VIEW / ORDERS_MANAGE (orders), CARTS_VIEW (carts), DISCOUNTS_VIEW / DISCOUNTS_MANAGE (discounts), MODELS_VIEW / MODELS_EDIT / MODELS_DELETE (products).

Customer Tools

Customers are the accounts that sign in to the site - records of a model with accounts enabled - not the team that manages the workspace (list_team).

ToolDescription
list_customersList customers with status, verification, last login, company and order stats (paginated)
get_customerOne customer's account summary plus the profile record's data
suspend_customerBlock sign-in and end every live session (orders and carts stay)
unsuspend_customerLet a suspended customer sign in again
send_customer_password_resetIssue a reset token to an active customer; the app's account.* webhook sends the mail
resend_customer_verificationIssue a fresh verification token to a pending customer; the app's webhook sends the mail
unlock_customerClear the failed sign-in counter and lockout
set_customer_company_roleGive a customer a role in their company (admin sees every company order, buyer their own)
set_customer_price_listAssign a price list to a customer without a company; null unassigns

Price List Tools

A price list (Gold, Silver, dealer tiers) prices a buyer at a percent off the catalogue plus fixed prices per product or variant. Each buyer has one list: a company's members pay the company's list, a customer without a company their own.

ToolDescription
list_price_listsEvery price list with percentOff, fixed-price count, assignment count and channels
get_price_listOne list with a page of its fixed prices (filter by product, cursor-paginated)
create_price_listCreate a list with a name, an optional percent off and the channels it is published to
update_price_listRename a list, change its percentOff, window or channels ([] unpublishes)
delete_price_listDelete a list and unassign it everywhere
set_price_list_entrySet the fixed price for one product or variant, with optional volume breaks
set_price_list_entriesUpsert up to 1000 fixed prices at once, all or nothing
remove_price_list_entriesRemove up to 1000 fixed prices by product / variant
set_company_price_listAssign a price list to a company record; every member pays it; null unassigns
set_company_price_display_modeSet whether a company's buyers read net or gross prices; null = default (net)
set_company_tax_roundingSet a company's VAT rounding, per_line or per_rate; null = workspace setting
set_company_vat_idSet or clear a company's EU VAT id; a changed id is no longer verified
set_company_vat_verifiedAttest or withdraw a company's checked VAT id; drives reverse charge
set_company_tax_exemptionExempt a company's orders from VAT with a legal reason; null clears

Sales Channel Tools

A sales channel (retail, horeca, b2b) is a key a storefront sends to be priced from the price lists published to it: per product the buyer's own or company list wins, then the channel's dated list, then its base list, then the catalogue. Lists are published with create_price_list / update_price_list channels.

ToolDescription
list_sales_channelsEvery channel with key, displayMode, priceAccess, active list and open-cart count
get_sales_channelOne channel with its published lists, nextChangeAt and activeCartCount
create_sales_channelCreate a channel (key fixed once created), at most 20 per workspace
update_sales_channelRename a channel or change its displayMode or priceAccess
delete_sales_channelDelete a channel, unpublish its lists, abandon its open carts

Webhook Tools

Manage outbound event webhooks. create_webhook and rotate_webhook_secret return the signing secret once - it cannot be retrieved again.

ToolDescription
list_webhooksList webhook endpoints (secrets never returned)
list_webhook_deliveriesRecent delivery attempts (pending/success/failed)
list_webhook_event_typesThe authoritative allowlist of subscribable events
create_webhookCreate an endpoint; returns the endpoint + secret (once)
update_webhookPartial update; pass enabled to enable/disable
rotate_webhook_secretRotate the signing secret (returns new secret once)
delete_webhookDelete an endpoint

Requires workspace permissions WEBHOOKS_VIEW (read) / WEBHOOKS_MANAGE (create, update, rotate, delete).

Resources

URIDescription
cmssy://sitemapFull page tree as JSON
cmssy://workspaceWorkspace info + site config

Example Workflow

> List all pages in my workspace> Search for pages matching "blog"> Show me the available block types> Which pages still use block types the site no longer registers?> Create a new "Features" page with content in English and Polish> Add a hero block to the Features page> Publish the Features page

Hosting the server (library)

createHostedServer serves the same tools from a host that holds no token and no disk. Every tool takes a workspace (<orgSlug>/<workspaceSlug>); list_workspaces names the ones a connection may use. The package checks only the shape of workspace - everything below is the host's job:

  • resolveWorkspace(workspace) is the authorization. Check, on every call, that the caller is still a member of that workspace and that the connection was granted it. Throw the same message for "does not exist" and "not yours", so a refusal does not reveal which workspaces exist.
  • The executor is the scope. The CmssyApi it returns (createCmssyApi(execute, workspaceId)) runs every document as that user in that workspace; the package sends nothing that would scope it.
  • fetchUrl is the SSRF boundary. Refuse private, loopback and link-local addresses and re-check every redirect. The package caps the body at 50MB while reading.

Development

bash
pnpm installpnpm dev -- --token cs_xxx --workspace-id xxx --api-url http://localhost:4000

來源:README.md,提交 5b40247

工具

0
該伺服器需要登入,因此 SourceWeft 無法在沒有帳號的情況下讀取其工具,也未收錄。已連接帳號所能看到的內容可能因帳號及其權限而異。

版本歷史

52
  1. v0.135.1最新Nov 7, 2026
  2. v0.134.3Nov 4, 2026
  3. v0.134.1Nov 4, 2026
  4. v0.134.0Nov 3, 2026
  5. v0.133.1Oct 30, 2026
  6. v0.133.0Oct 29, 2026
  7. v0.130.0Oct 26, 2026
  8. v0.129.1Oct 25, 2026
  9. v0.129.0Oct 25, 2026
  10. v0.126.0Oct 24, 2026
  11. v0.125.0Oct 23, 2026
  12. v0.121.0Oct 23, 2026
  13. v0.119.0Oct 23, 2026
  14. v0.118.0Oct 22, 2026
  15. v0.117.0Oct 22, 2026
  16. v0.116.0Oct 22, 2026
  17. v0.112.0Oct 22, 2026
  18. v0.110.0Oct 21, 2026
  19. v0.107.0Oct 21, 2026
  20. v0.106.0Oct 21, 2026
  21. v0.105.0Oct 20, 2026
  22. v0.104.0Oct 19, 2026
  23. v0.103.0Oct 19, 2026
  24. v0.101.0Oct 19, 2026
  25. v0.100.0Oct 18, 2026
  26. v0.98.0Oct 18, 2026
  27. v0.97.0Oct 17, 2026
  28. v0.96.0Oct 13, 2026
  29. v0.94.0Oct 11, 2026
  30. v0.93.1Oct 9, 2026
  31. v0.93.0Oct 9, 2026
  32. v0.92.3Oct 8, 2026
  33. v0.92.2Oct 7, 2026
  34. v0.92.1Oct 7, 2026
  35. v0.92.0Oct 6, 2026
  36. v0.91.0Oct 5, 2026
  37. v0.90.0Oct 4, 2026
  38. v0.89.0Oct 4, 2026
  39. v0.88.0Oct 2, 2026
  40. v0.87.0Oct 1, 2026
  41. v0.86.0Sep 30, 2026
  42. v0.85.0Sep 29, 2026
  43. v0.84.0Sep 28, 2026
  44. v0.83.1Sep 27, 2026
  45. v0.83.0Sep 27, 2026
  46. v0.82.0Sep 27, 2026
  47. v0.81.0Sep 22, 2026
  48. v0.79.1Sep 21, 2026
  49. v0.78.0Sep 21, 2026
  50. v0.77.0Sep 21, 2026
  51. v0.75.0Sep 20, 2026
  52. v0.73.1Sep 20, 2026

評分

已滿足適用檢查項的 85%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分