Inhalt - MCP-native CMS
Inhalt The CMS your AI tools can run.
Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeCan modify data
What it can do
- Schema.Read: List the project's content types and their typed field definitions.
- Schema.Create: 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), markdo
- Schema.Update: Update a content type's name and/or fields. The key is immutable. Editing fields does not migrate existing entries.
What data it sees
Do you need an account
No: the server works without sign-in
Inhalt
The CMS your AI tools can run.
Inhalt is an open-source, MCP-native CMS. Instead of clicking through a traditional admin UI, the content layer is exposed through the Model Context Protocol (MCP). Any MCP client connects to the Inhalt server and you create and edit content just by chatting.
The protocol is the API. The client reads your content schema, finds the right entry, and proposes a clean, typed patch against real fields, never freeform text.
- Website: inhalt.tech
- MCP endpoint:
https://inhalt.tech - License: MIT
- Self-hostable: one container, your database, your keys. A hosted edge is also available.
Server tool list (11)
Raw names from tools/list. Only developers need these.
| schema.read | List the project's content types and their typed field definitions. |
| schema.create | 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. |
| schema.update | Update a content type's name and/or fields. The key is immutable. Editing fields does not migrate existing entries. |
| schema.delete | Delete a content type. This permanently removes the type and every entry it holds. |
| entries.list | List entries of a content type. Optionally filter by status and paginate. |
| entries.query | Find entries whose typed fields match the given values (matched against the working draft). |
| entries.get | Fetch one entry by slug. `view` selects the draft (default) or published copy. |
| entries.create | Create a new draft entry. `data` is validated against the content type's fields. |
| entries.patch | Apply a typed patch to an entry's working draft. Only the given fields change. |
| entries.publish | Publish an entry: copy its working draft to the published copy served by the read API. |
| entries.delete | Delete an entry permanently. |