An open-source headless CMS for managing content models and entries, exposed as MCP tools for reading and writing both entries and the schema that types them.
Inhalt demonstrates solid tool design with consistent naming (verb_noun pattern), comprehensive parameter descriptions, and clear input schemas across all 11 tools. All tools have descriptions (avg 120 chars) and typed parameters with descriptions. However, output schemas are not documented in the source code, and error handling guidance is minimal. Tool composition is clean (single responsibility per tool), but the server lacks tool annotations (readOnlyHint, destructiveHint) despite having clear risk classifications. No evidence of pagination support for list operations, which could be problematic at scale.
Create a new draft entry. `data` is validated against the content type's fields.
Delete an entry permanently.
Fetch one entry by slug. `view` selects the draft (default) or published copy.
List entries of a content type. Optionally filter by status and paginate.
Apply a typed patch to an entry's working draft. Only the given fields change.
Publish an entry: copy its working draft to the published copy served by the read API.
Output schemas not documented. LLMs cannot plan downstream tool calls or extract required fields without knowing response structure. All 11 tools lack documented return types.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications. Tools marked DESTRUCTIVE (schema.delete, entries.delete) should carry destructiveHint=true to guide agent behavior.
entries.list lacks pagination documentation. No mention of total count, next_cursor, or result limits. At scale, unbounded results risk context window exhaustion.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Find entries whose typed fields match the given values (matched against the working draft).
Define a new content type. `fields` is an array of typed field definitions (string, richtext, reference, enum, list). A richtext field takes an optional `format`: html (default), markdown, or plaintext.
Delete a content type. This permanently removes the type and every entry it holds.
List the project's content types and their typed field definitions.
Update a content type's name and/or fields. The key is immutable. Editing fields does not migrate existing entries.
entries.query 'filters' parameter is type 'object' with no schema constraints. LLMs cannot infer valid field names or value types without seeing the content type schema first.
No error recovery guidance. Tools lack descriptions of failure modes, retryability, or next steps. E.g., entries.create should document validation errors and how to fix them.