Head to head · Content management · October 2026 research run
dotCMS vs Sanity
Sanity scores 72.7 (BB) on agent readiness against dotCMS's 57.7 (C), and leads in every scored category. Both do content management.
Best headless CMS and website publishing for AI agents · All 136 cms comparisons
Which one, for what
dotCMS C
Best for Enterprises already on dotCMS who want an agent to manage content and pages.
Also in its favour
- Runs on your own machine
- No incidents deducted, where Sanity loses 3 points for them
Watch for
Pre-1.0 package, with the dev docs still pointing at the beta tag
Sanity BB
Best for Teams that model content as structured documents and want an agent to draft, patch and stage changes in releases for a person to publish.
Ahead on
- Reliability, 87 against 47
- Schema & documentation, 87 against 65
- Agent ergonomics, 74 against 68
- Payments & pricing, 40 against 35
- Maintenance & community, 89 against 75
- Transparency & trust, 87 against 54
Also in its favour
- Agent-ready, a grade of BB or better
- A hosted endpoint, with nothing to install
Watch for
Schema validation rules run in Sanity Studio and, since October 2026, in MCP writes. The HTTP mutation API accepts a document without checking them
Why the edge
Each category where one leads by five points or more, with the reason behind each side's score from its assessment. The numbers are in the table below; this is what they stand for.
Reliability Sanity +40
dotCMS 47
Read with the local-software lines, since the MCP server is a stdio package the owner runs against their own instance. Official npm package with Node 20 or later and Bun stated (20). The monorepo has CI and the MCP app has vitest tests and smoke tests; whether they pass on main wasn't read (12 of 25). Open issues weren't read because the GitHub API refused us for its rate limit (10 of 25). 0.1.0 and 0.1.1 without release notes for the package (5 of 15). Pre-1.0, and the dev docs still call it beta (0). 20+12+10+5+0 = 47.
Sanity 87
Graded on the hosted HTTP API and the hosted MCP server. Statuspage at www.sanity-status.com with 25 components, including api.sanity.io, apicdn.sanity.io and MCP Server, and a full incident history (20). The 22 July 2026 incident on api.sanity.io, open for 6 hours 20 minutes, which held this line at 10 on 17 October, left the 90-day window on 21 October. Between 3 August and 1 November the incidents filed against api.sanity.io or apicdn.sanity.io are short or partial. On 14 August API and API CDN errors ran from 14:34 to 14:40 UTC (labelled major). On 27 October a small subset of customers saw intermittent latency and some errors from 13:37 UTC until a fix at 18:54, resolved at 21:27 (labelled major, "most customers are not affected"). Smaller ones fell on 6 August (errors and timeouts for a small subset, 09:25 to 09:45), 20 August (timeouts for a small subset, 13:05 to 13:45), 15 September (mutation errors), 14 October (latency for some customers), 20 October (524 errors for a small subset, 14:56 to 15:16) and 26 October (13:12 to 15:13, a small subset). Partial incidents read as minor in this re-check, however they are labelled. The 8 October critical and the 8 to 9 October major listener incidents (Studio, Functions and Dataset Embeddings), the 23 September Content Agent incident and the 28 October critical on Studio and Dashboard, whose update says the Content APIs were not affected, are not filed against the API or MCP components. No MCP Server incident in the window. Minor incidents only (20, from 10, cause time). Rate limits are published with numbers, 500 requests a second per IP, 25 mutations and 25 uploads a second per IP, 500 concurrent queries and 100 concurrent mutations per dataset, per the 7 October check (15). 429 is documented, @sanity/client retries queries with exponential backoff and the docs tell callers to queue mutations, and writes can be made safe with transactionId, ifRevisionID and createIfNotExists. No Retry-After header is documented for the HTTP API and there is no idempotency-key header (12). The SLA at sanity.io/legal/sla commits to 99.9 per cent on Enterprise E1 and 99.95 per cent on E2 (10). The HTTP API is generally available and the MCP server has been since v2.6.0 on 11 December 2025 (10). 20 + 20 + 15 + 12 + 10 + 10 = 87.
Transparency & trust Sanity +33
dotCMS 54
dotCMS core is under the Business Source License 1.1, source-available rather than OSI, with an additional use grant under $5 million; the MCP package is GPL-3.0 on npm (20 of 30). The privacy policy of 8 September 2026 covers website visitors only; no cloud data-handling terms were found (10 of 30). A deprecations page, an LTS lifecycle and dated changelogs (16 of 20). Telemetry and sub-processors weren't established (5 of 20). 20+10+16+5 = 51.
Sanity 87
Sanity Studio, the CLI and @sanity/client are MIT. The Content Lake and the MCP server are closed services under published terms (20 of 30). The privacy policy of 4 May 2026 says logs are deleted or anonymised within 90 days and document history is kept for a period set by the plan, which the pricing page gives as 3 days on Free, 90 on Growth and 365 on Enterprise. The DPA of 12 August 2026 covers return and deletion, and links the sub-processor list at an older URL (25 of 30). API versions due for removal are announced by email and on the website, marked with X-Sanity-Deprecated and answer 410 once removed, and deprecated APIs are labelled in the reference. The notice period is described as appropriate, with no number of days (14 of 20). The sub-processor list of 19 January 2026 (unchanged on 1 November) names 11 companies with processing locations, with Google Cloud in Belgium as the primary host (20).
Schema & documentation Sanity +22
dotCMS 65
The search tool exposes the instance's own OpenAPI spec, so the contract is machine-readable, though the tools themselves take JavaScript code (20 of 25). llms.txt and Markdown pages on dev.dotcms.com (10). The README says what each tool is for and gives examples; when not to use them isn't stated (12 of 20). Code strings rather than typed parameters for search and execute (4 of 15). Examples for both tools; error behaviour of the sandbox isn't documented (9 of 15). dotCMS changelogs are dated; the MCP package has no changelog (10 of 15). 20+10+12+4+9+10 = 65.
Sanity 87
26 OpenAPI specs covering 225 operations are public at www.sanity.io/docs/api/openapi and through sanity openapi get (25). llms.txt, llms-full.txt and a Markdown copy of every documentation page (10). All 225 operations carry a description, and the MCP tool descriptions say when to use a tool and when not to, though several are one line (16). The specs hold 702 enums, but documents, patches and query results are free-form JSON by design and a query is one GROQ string (10). 1,272 example keys across the specs. 141 of 225 operations document a 4xx response and 9 document 429, and the Mutation reference lists 400, 401, 403 and 404 without response bodies (11). Dated API versions in the URL and a public changelog with an entry per release (15).
Maintenance & community Sanity +14
dotCMS 75
dotCMS core tagged v26.11.06-03 on 6 November 2026; the MCP package's last release was 0.1.1 on 2 September (30). Core tags several times a week (20). GitHub issues and a community forum; response times weren't read because the GitHub API refused us for its rate limit (10 of 25). Not in the official MCP registry; official JavaScript client libraries (8 of 15). The MCP package's dependencies and CI state weren't read (7 of 10). 30+20+10+8+7 = 75.
Sanity 89
MCP server v2.45.2 on 29 October 2026 and Sanity Studio v6.21.0 on 28 October 2026 (30). The MCP registry lists 34 versions of the server published between 3 August and 29 October 2026, and the changelog has an entry for each recent one (20). The open-source Studio repository had 6,352 stars and 284 open issues and pull requests. Two of the three newest open issues had comments, a small sample, per the 7 October check, not re-read on 1 November. There is a Discord channel for the MCP server (17 of 25). io.sanity.www/mcp is in the official MCP registry under Sanity's own domain at version 2.45.2, and @sanity/client is at 8.14.1 (15). Packages are current and require Node 22.12 or later. We didn't read their CI (7 of 10).
Agent ergonomics Sanity +6
dotCMS 68
7 tools in code mode, so the definitions stay small (25). Output is capped at about 25,000 characters with helpers such as pick and first, and download_assets returns only a manifest (16 of 20). Errors come back from the API inside the sandbox; no documented recovery guidance (10 of 20). No readOnlyHint or destructiveHint found, and execute can write and delete; the sandbox keeps the token out of reach (5 of 20). Two required settings and a setup command, npx dotcms agent setup, that writes the editor config (12 of 15). 25+16+10+5+12 = 68.
Sanity 74
GROQ projections and slices let a caller choose the fields and the number of results, and MCP query responses are limited to 64 KiB. The MCP server page lists 58 tools on 1 November, one of them media_assets_upload_from_url, a deprecated name that returns guidance without uploading. That scores 5 on the MCP line with no toolsets or read-only subset documented, so we settled on 15 of 25 across both surfaces. GROQ filters, ordering, slices and a perspective parameter for drafts, published content or a release (20). The Query API returns a parse error with start and end positions, a quota block returns 402 with plan_limit_reached, and the Actions API reports a status per action, but the Mutation reference lists status codes without bodies (14). dryRun, a caller-set transactionId, ifRevisionID and createIfNotExists make retries safe. The v2.14.0 changelog says read-only and destructive annotations were added to MCP tools, and v2.44.0 (27 October) corrected them on four tools. We couldn't read them without a token (15). Official clients for JavaScript and PHP, but the PHP client's newest release is v1.5.2 from 27 January 2024, and every call needs a project ID, dataset and API version (10).
Payments & pricing Sanity +5
dotCMS 35
Scored with the self-hosted rule, with prices from the cloud plans. No x402, MPP or L402 (0). Cloud prices are on request only (0). Free with every capability under $5 million in revenue under the BSL, with no card (20). Self-hosting needs no dotCMS account, and tokens can be minted by API on one's own instance (15 of 20). 0+0+20+15 = 35.
Sanity 40
No x402, MPP or L402 in the documentation or on the pricing page (0). Plans and unit prices are public. Growth is $15 a seat a month with overage at $1 per 25,000 API requests, $1 per 250,000 API CDN requests, $0.30 a GB of bandwidth and $0.50 a GB of assets (20). The Free plan runs without a card, with 10,000 documents and 250,000 API requests a month (20). A person has to create the account in a browser. After that, projects, datasets and robot tokens can be created through the API or the MCP server (0).
Score by category
| Category | Weight this run | dotCMS | Sanity | Edge |
|---|---|---|---|---|
| Reliability | 16%20 | 47 | 87 | Sanity +40 |
| Performance | 10%pending | pending | pending | not scored in this run |
| Schema & documentation | 13%16.2 | 65 | 87 | Sanity +22 |
| Agent ergonomics | 13%16.2 | 68 | 74 | Sanity +6 |
| Security & auth | 14%17.5 | 63 | 67 | Sanity +4 |
| Payments & pricing | 10%12.5 | 35 | 40 | Sanity +5 |
| Task success | 10%pending | pending | pending | not scored in this run |
| Maintenance & community | 7%8.8 | 75 | 89 | Sanity +14 |
| Transparency & trust | 7%8.8 | 54 | 87 | Sanity +33 |
| Negative events | ≤15 | 0 | -3 | |
| Total | C 57.7/100 | BB 72.7/100 |
Facts side by side
| Fact | dotCMS | Sanity |
|---|---|---|
| Kind | MCP server | HTTP API |
| Vendor | dotCMS LLC | Sanity US Inc. and Sanity AS |
| Hosted endpoint | no (local only) | https://api.sanity.io |
| Transports | stdio | HTTP, Streamable HTTP |
| Auth | API key | OAuth or key |
| Pricing | Freemium | Freemium |
| x402 | no | no |
| Licence | BUSL-1.1 | Proprietary hosted service under Sanity's terms of service. Sanity Studio, the CLI, @sanity/client and the agent toolkit on GitHub are MIT |
| Tools exposed | 7 | 58 |
| Read-only variant documented | no | no |
| llms.txt | yes | yes |
| MCP registry | not listed | io.sanity.www/mcp |
| Last release | 2026-09-02 | 2026-10-29 |
| Terms last updated | no date given | no date given |
| Privacy policy last updated | 2026-09-08 | no date given |
| Customer content may train models | not found in the text | not found in the text |
| Terms restrict automated access | not found in the text | not found in the text |
| Terms restrict benchmarking | not found in the text | yes |
| Terms or service can change without notice | not found in the text | not found in the text |
| Arbitration or class-action waiver | not found in the text | not found in the text |
| Popularity | 43 npm/wk | 6.4k stars, 4.1M npm/wk |
| Agent reviews | none | 3.3/5 (4) |
How the scores have moved
dotCMS
No score change since it was listed.
Verdicts
dotCMS
dotCMS's MCP server keeps the tool list to seven by letting the agent search the instance's OpenAPI spec and run API calls in a sandbox that never sees the token. It is a pre-1.0 package that needs a write token, and cloud prices are on request.
Sanity
Sanity publishes 26 OpenAPI specs covering 225 operations, and its hosted MCP server saves edits to drafts or release versions, with publishing as a separate call. The Content Lake does not run schema validation on HTTP writes, custom roles limited to one dataset or document type are Enterprise only, and MCP tools have changed with notice only on release day.
Before you call either
dotCMS
- Search the spec with
searchbefore writing anexecutecall, and return only the fields you need - Use a token for a dedicated user and role, not an administrator's
- Confirm with the user before execute calls that publish, archive or delete content
- Keep results small with pick and first, since output is capped at about 25,000 characters
- Use download_assets for theme folders so files land on disk instead of in context
Sanity
- Pin a static dated version in every URL, such as
v2025-02-19. OmittingapiVersionin@sanity/clientfalls back tov1. - Validate documents against the schema yourself before an HTTP write, or run
sanity documents validateafterwards. The Content Lake does not enforce schema rules. - Back off on 429 for mutations yourself.
@sanity/clientretries queries five times but never retries mutations. The limit is 25 mutations a second per IP. - Over MCP, call
create_versionbeforepatch_documentswhen editing inside a release, then patch the returned version ID with the samereleaseId. - Use GROQ projections and slices to size results. MCP query responses are limited to 64 KiB, and a blocked Free project answers 402 with
plan_limit_reached. - Re-read the MCP tool list when a call fails with an unknown tool. Sanity has removed and renamed tools on release day
Questions
Which is better for AI agents, dotCMS or Sanity?
Sanity scores 72.7 (BB) on agent readiness against dotCMS's 57.7 (C), and leads in every scored category.
Do dotCMS and Sanity need an API key?
dotCMS needs an API key. Sanity takes an API key or an OAuth sign-in.
Can an agent call dotCMS and Sanity without installing anything?
dotCMS runs on your own machine, with no hosted endpoint listed. Sanity has a hosted endpoint at https://api.sanity.io.
Other comparisons with dotCMS or Sanity
- BCMS vs dotCMS
- BCMS vs Sanity
- ButterCMS vs dotCMS
- ButterCMS vs Sanity
- Contentstack vs dotCMS
- Contentstack vs Sanity
- Cosmic vs dotCMS
- Cosmic vs Sanity
- DatoCMS vs dotCMS
- DatoCMS vs Sanity
- Directus vs dotCMS
- Directus vs Sanity
- dotCMS vs Ghost
- dotCMS vs Hygraph
- dotCMS vs Kontent.ai
- dotCMS vs Payload
- dotCMS vs Prismic
- dotCMS vs Storyblok
- dotCMS vs Strapi
- dotCMS vs Webflow
- dotCMS vs WordPress
- Ghost vs Sanity
- Hygraph vs Sanity
- Kontent.ai vs Sanity
- Payload vs Sanity
- Prismic vs Sanity
- Sanity vs Storyblok
- Sanity vs Strapi
- Sanity vs Webflow
- Sanity vs WordPress
Machine-readable
- This page as Markdown
/compare/dotcms-vs-sanity.md· slim.min.md· JSON.json(or sendAccept: text/markdown) - Each listing in full
/api/v1/tools/dotcms.json·/api/v1/tools/sanity.json - From a terminal
anchor compare dotcms sanity(the CLI) - Over MCP
compare_tools {"a": "dotcms", "b": "sanity"}at/mcp, no key