Contentrain MCP Server
OfficialProvides automated git operations including branch synchronization, commits, and structural 3-way merges to manage content within a git-based headless CMS.
Integrates with GitHub repositories to manage Contentrain CMS projects, ensuring content changes are automatically synchronized with the remote repository.
Allows for the management of Contentrain models and content entries using Markdown, supporting the creation and update of localized content through a standardized protocol.
Supports the management of Contentrain models and content using the MDX format, enabling AI agents to handle rich content creation and schema management.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Contentrain MCP ServerCreate a draft blog post titled 'Getting Started' in English"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@contentrain/mcp
MCP (Model Context Protocol) server for Contentrain CMS content management. Enables AI agents (Claude, Codex, Cursor, etc.) and humans to create, read, update, and delete Contentrain models, content, and assets — with automatic git branch synchronization.
Why?
Contentrain is a git-based headless CMS. This MCP server lets AI assistants directly manage your Contentrain content through a standardized protocol, so you can say things like:
"Create a blog post model with title, excerpt, and cover image fields"
"Add a new blog post in English and Turkish"
"List all FAQ entries and update the second one"
All changes are committed and pushed to your git repository automatically.
Prerequisites
A Contentrain project already set up via the Contentrain Web App
The project's GitHub repository cloned locally
Node.js >= 18
Important: Contentrain projects must be initialized through the Web App first. The Web App creates the repository structure, the
contentrainbranch, models, and environment configuration. This MCP server operates on an existing Contentrain project — it does not replace the initial setup.
Quick Start
1. Install
# From npm (when published)
npm install -g @contentrain/mcp
# Or from source
git clone https://github.com/Contentrain/contentrain-mcp.git
cd contentrain-mcp
pnpm install && pnpm build2. Configure your MCP client
Add to your MCP client configuration:
Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"contentrain": {
"command": "contentrain-mcp",
"env": {
"CONTENTRAIN_REPO_PATH": "/path/to/your/contentrain-project",
"CONTENTRAIN_BRANCH": "contentrain"
}
}
}
}Cursor (.cursor/mcp.json in your project root):
{
"mcpServers": {
"contentrain": {
"command": "contentrain-mcp",
"env": {
"CONTENTRAIN_REPO_PATH": "/path/to/your/contentrain-project",
"CONTENTRAIN_BRANCH": "contentrain"
}
}
}
}Claude Code (.mcp.json in your project root):
{
"mcpServers": {
"contentrain": {
"command": "contentrain-mcp",
"env": {
"CONTENTRAIN_REPO_PATH": "/path/to/your/contentrain-project",
"CONTENTRAIN_BRANCH": "contentrain"
}
}
}
}If installed from source instead of globally, replace
"command": "contentrain-mcp"with"command": "node"and add"args": ["/absolute/path/to/contentrain-mcp/dist/index.mjs"].
3. Start using
Once configured, your AI assistant has access to 14 tools. Here's an example conversation:
You: List all my models
Agent: → calls contentrain_list_models
You have 3 models: blog (MD, localized), faq (JSON), authors (JSON)
You: Show me the blog model schema
Agent: → calls contentrain_describe_model { modelId: "blog" }
Blog model has fields: title (string, required), description (string),
category (one-to-one → blogcategories), imagesrc (media), author (one-to-one → authors)
You: Create a new blog post titled "Getting Started with Contentrain"
Agent: → calls contentrain_create_content {
modelId: "blog",
data: { title: "Getting Started with Contentrain", slug: "getting-started-with-contentrain", description: "..." },
locale: "en",
status: "draft",
content: "# Getting Started\n\nWelcome to Contentrain..."
}
Created entry e7f3a1b9c0d2 in blog model (draft).
Committed and pushed to contentrain branch.
You: Now publish it
Agent: → calls contentrain_update_content {
modelId: "blog",
entryId: "e7f3a1b9c0d2",
data: { status: "publish" },
locale: "en"
}
Updated and published.Environments
Contentrain uses git branches to manage environments. Each environment maps to a branch:
Environment | Branch | Description |
Default |
| Main content branch (created automatically) |
Staging |
| Preview/staging environment |
Production |
| Production environment |
Environments are created via the Contentrain Web App. The branch naming follows the pattern contentrain-{environment-name}.
Targeting a specific environment
Set the CONTENTRAIN_BRANCH environment variable to the target environment's branch:
{
"mcpServers": {
"contentrain": {
"command": "contentrain-mcp",
"env": {
"CONTENTRAIN_REPO_PATH": "/path/to/project",
"CONTENTRAIN_BRANCH": "contentrain-staging"
}
}
}
}Multiple environments simultaneously
You can register multiple MCP server instances — one per environment:
{
"mcpServers": {
"contentrain-default": {
"command": "contentrain-mcp",
"env": {
"CONTENTRAIN_REPO_PATH": "/path/to/project",
"CONTENTRAIN_BRANCH": "contentrain"
}
},
"contentrain-staging": {
"command": "contentrain-mcp",
"env": {
"CONTENTRAIN_REPO_PATH": "/path/to/project",
"CONTENTRAIN_BRANCH": "contentrain-staging"
}
}
}
}Available Tools
Model Management
Tool | Description |
| List all models with metadata |
| Get full schema with field definitions |
| Create a new model (JSON, MD, or MDX) |
| Add a field to an existing model |
| Delete a model and all its content |
Content Management
Tool | Description |
| List all entries for a model |
| Get a single entry by ID |
| Create a new entry with validation |
| Update specific fields of an entry |
| Delete an entry (all locales + markdown) |
| Dry-run validation against model schema |
Asset Management
Tool | Description |
| List all registered assets |
| Register an existing file as an asset |
| Remove an asset from the registry |
Environment Variables
Variable | Default | Description |
|
| Path to the git repository |
|
| Target environment branch |
|
| Git remote name |
|
| Contentrain directory name |
|
| Skip git operations (local changes only) |
| — | Git commit author name |
| — | Git commit author email |
Programmatic Usage
You can also use the writer directly in your own code:
import { ContentrainWriter } from '@contentrain/mcp'
const writer = new ContentrainWriter({
repoPath: '/path/to/your/project',
branch: 'contentrain',
})
// Read operations (no git transaction needed)
const models = await writer.model.list()
const entries = await writer.content.list('blog-posts')
// Write operations (uses git worktree + commit + push)
await writer.transaction(async (tx) => {
await tx.content.create('blog-posts', {
title: 'Hello World',
excerpt: 'My first post',
}, { status: 'draft' })
}, { message: 'add new blog post' })How Git Sync Works
Every write operation runs inside a transaction:
Creates an isolated git worktree from the target branch
Applies all changes inside the worktree
Commits and pushes to the target branch
If the push is rejected (remote advanced), performs a structural 3-way merge — diffing JSON entries by their
IDfield instead of text lines — then retries (up to 3 attempts)Cleans up the worktree
This means concurrent writes from multiple agents or the Contentrain web app won't conflict.
Development
pnpm install # Install dependencies
pnpm dev # Watch mode build
pnpm test # Run tests (watch mode)
pnpm test:run # Run tests once
pnpm lint # Lint with oxlint
pnpm build # Production buildLicense
MIT
Available Tools
14 toolscontentrain_add_fieldC
Add a new field to an existing model.
| Name | Required | Description | Default |
|---|---|---|---|
| modelId | Yes | Target model ID | |
| name | Yes | Display name of the field | |
| fieldId | Yes | Unique field identifier | |
| componentId | Yes | UI component (single-line-text, integer, one-to-one, media, etc.) | |
| fieldType | Yes | Data type (string, number, boolean, relation, media, date, array) | |
| options | No | Field options (title-field, default-value, reference, etc.) | |
| validations | No | Field validations (required-field, unique-field) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but only states the basic action without behavioral details. It doesn't disclose permissions needed, whether the operation is reversible/destructive, rate limits, error conditions, or what happens on success/failure. This is inadequate for a mutation tool with 7 parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with zero waste. It's front-loaded with the core action and target, making it easy to parse quickly without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 7 parameters, no annotations, and no output schema, the description is insufficient. It doesn't cover behavioral aspects (permissions, side effects), usage context, or result expectations. The 100% schema coverage helps with parameters, but overall completeness is poor given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds no additional meaning about parameters beyond implying 'modelId' targets an existing model and 'fieldId' must be unique. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Add a new field') and target ('to an existing model'), which is specific and actionable. However, it doesn't explicitly differentiate from sibling tools like contentrain_create_model or contentrain_update_content, which might also involve field manipulation in different contexts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an existing model), exclusions, or comparisons to siblings like contentrain_create_model (which might create models with initial fields) or contentrain_update_content (which might modify content rather than schema).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentrain_create_contentA
Create a new content entry. System fields (ID, createdAt, updatedAt, status) are auto-generated. For localized models, specify locale to create in that language. Call contentrain_describe_model first to know required fields.
| Name | Required | Description | Default |
|---|---|---|---|
| modelId | Yes | Target model ID | |
| data | Yes | Content data object with field values matching model schema | |
| locale | No | Locale code (e.g., "en") — required for localized models | |
| status | No | Entry status (default: "draft") | |
| content | No | Markdown body content (only for MD/MDX models) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and discloses key behaviors: system fields are auto-generated, locale is required for localized models, and status defaults to 'draft'. It doesn't mention permissions, rate limits, or error handling, but covers essential operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with zero waste: first states purpose, second explains auto-generated fields and locale requirement, third provides prerequisite guidance. Every sentence adds value and is front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a creation tool with no annotations and no output schema, the description is reasonably complete: covers purpose, usage guidelines, key behaviors, and prerequisites. It could mention response format or error cases but provides sufficient context for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds some context: locale is 'required for localized models' and content is 'only for MD/MDX models', but doesn't significantly enhance parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'create' and resource 'new content entry', distinguishing it from sibling tools like contentrain_update_content (modify existing) and contentrain_delete_content (remove). It specifies what the tool does with precision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Call contentrain_describe_model first to know required fields' for prerequisites, and 'For localized models, specify locale' for conditional usage. It distinguishes when to use this vs. other content tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentrain_create_modelA
Create a new Contentrain model with field definitions. System fields (ID, createdAt, updatedAt, status) are auto-added. For MD/MDX models, slug and content fields are also auto-added.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name of the model | |
| modelId | Yes | Unique model ID in kebab-case | |
| type | Yes | Content type | |
| localization | Yes | Whether the model supports multiple languages | |
| description | No | Model description | |
| path | No | Base path for MD/MDX files | |
| fields | No | Custom field definitions (system fields are auto-added) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It usefully describes that system fields are auto-added and specifies which ones (ID, createdAt, updatedAt, status), plus additional fields for MD/MDX models. However, it doesn't cover important behavioral aspects like permissions required, whether the operation is idempotent, error conditions, or what happens on success. The description adds value but leaves significant gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately concise with two sentences that each add value. The first sentence states the core purpose, and the second provides important behavioral context about auto-added fields. There's no wasted language, and the information is front-loaded. It could be slightly more structured but is efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a creation tool with 7 parameters, no annotations, and no output schema, the description provides adequate but incomplete context. It covers the core purpose and some behavioral aspects (auto-added fields), but lacks information about what happens after creation, error handling, permissions, or relationships to other tools. Given the complexity and absence of structured metadata, the description should do more to be fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 7 parameters thoroughly. The description adds minimal value beyond the schema by mentioning that system fields are auto-added (which relates to the 'fields' parameter) and that MD/MDX models get additional auto-added fields (which relates to the 'type' parameter). This provides some context but doesn't significantly enhance understanding of parameter semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Create') and resource ('new Contentrain model with field definitions'), specifying what the tool does. It distinguishes from siblings like contentrain_add_field (which modifies existing models) and contentrain_create_content (which creates content entries rather than models). The mention of auto-added system fields provides additional specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by mentioning auto-added fields for MD/MDX models, suggesting when certain parameters might be relevant. However, it doesn't explicitly state when to use this tool versus alternatives like contentrain_describe_model or contentrain_list_models, nor does it provide prerequisites or exclusions. The guidance is helpful but incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentrain_delete_contentADestructive
Delete a content entry by ID. For localized models, removes from all locale files. For MD/MDX, also deletes markdown files.
| Name | Required | Description | Default |
|---|---|---|---|
| modelId | Yes | Model ID | |
| entryId | Yes | Entry ID to delete (12-char hex) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations provide destructiveHint=true, indicating this is a destructive operation. The description adds valuable context beyond annotations by specifying that for localized models, it removes from all locale files, and for MD/MDX, it also deletes markdown files. This clarifies the scope and side effects of the deletion, though it doesn't mention permissions, rate limits, or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action ('Delete a content entry by ID') and efficiently adds two clarifying sentences about localized models and MD/MDX files. Every sentence adds value without redundancy, making it appropriately concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the destructive nature (annotations cover safety), two well-documented parameters (schema coverage 100%), and no output schema, the description provides good contextual completeness by explaining the deletion scope for different content types. However, it could be more complete by mentioning potential side effects like broken references or confirmation prompts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters (modelId and entryId) clearly documented in the schema. The description does not add any additional semantic information about the parameters beyond what the schema provides, such as format details or relationships between modelId and entryId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Delete a content entry by ID') and resource ('content entry'), distinguishing it from siblings like contentrain_delete_model (which deletes models) and contentrain_update_content (which modifies content). It provides additional specificity about behavior for localized models and MD/MDX files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by specifying 'by ID' and mentioning localized models/MD/MDX contexts, but does not explicitly state when to use this tool versus alternatives like contentrain_delete_model or contentrain_deregister_asset. No explicit exclusions or prerequisites are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentrain_delete_modelADestructive
Delete a model and all its content. WARNING: This is destructive and cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| modelId | Yes | Model ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond the destructiveHint annotation by specifying that deletion affects 'all its content' and 'cannot be undone.' This provides crucial details about scope and permanence that annotations alone don't convey, though it doesn't mention potential side effects like cascading impacts on related data or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with just two sentences that are front-loaded: the first states the purpose, and the second provides critical warnings. Every word earns its place, and there's no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's high complexity (destructive deletion), the description is mostly complete with purpose and warnings, but lacks details on output (no schema provided) or error conditions. The annotations cover destructiveness, and the schema covers parameters, so the description compensates well but could mention response format or prerequisites.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the input schema already fully documents the modelId parameter. The description doesn't add any parameter-specific details beyond what's in the schema, such as format examples or constraints, so it meets the baseline for high schema coverage without extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Delete') and resource ('a model and all its content'), distinguishing it from siblings like contentrain_delete_content (which deletes individual content items) and contentrain_describe_model (which reads model info). The verb+resource combination is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context with the WARNING about destructiveness and irreversibility, which helps guide when to use this tool. However, it doesn't explicitly mention alternatives like contentrain_describe_model for inspection or when not to use it (e.g., for partial deletions), leaving room for improvement in sibling differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentrain_deregister_assetADestructive
Remove an asset from assets.json registry. Does NOT delete the physical file.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Asset path to deregister |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide destructiveHint=true, and the description adds valuable context by clarifying that this only removes from the registry, not deleting files. This goes beyond annotations by specifying the scope of destruction, though it doesn't mention permissions, side effects, or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences that are front-loaded with the main action and a critical clarification. Every word adds value without redundancy, making it efficient and easy to understand.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with one parameter and no output schema, the description is fairly complete, covering purpose and key behavioral nuance. However, it could improve by mentioning what happens after deregistration or error cases, given the complexity of asset management.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with one parameter 'path' documented. The description doesn't add extra details about the parameter beyond what the schema provides, such as path format or examples, so it meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Remove') and the target ('asset from assets.json registry'), distinguishing it from sibling tools like contentrain_delete_content or contentrain_delete_model by specifying it only affects the registry, not physical files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implicitly indicates when to use this tool (to remove registry entries) and distinguishes it from deletion tools by noting it 'Does NOT delete the physical file.' However, it lacks explicit guidance on when not to use it or alternatives like contentrain_list_assets for checking assets first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentrain_describe_modelA
Get detailed schema for a model including all field definitions, types, validations, and options. Call this BEFORE creating or updating content to understand required fields.
| Name | Required | Description | Default |
|---|---|---|---|
| modelId | Yes | The model ID to describe |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies this is a read-only operation (consistent with 'Get'), but doesn't explicitly state permission requirements, rate limits, or error conditions. The description adds some behavioral context about when to call it, but lacks details on response format or potential side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly concise with two sentences that each serve distinct purposes: the first explains what the tool does, the second provides usage guidance. No wasted words or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read operation with no output schema, the description provides good context about what information is returned and when to use it. However, without annotations or output schema, it could benefit from more detail about the response structure or error handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter 'modelId', which is adequately documented in the schema. The description doesn't add any additional parameter information beyond what the schema provides, so it meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get detailed schema') and resource ('for a model'), including what information is returned ('all field definitions, types, validations, and options'). It distinguishes from siblings like contentrain_list_models (which lists models) and contentrain_create_model (which creates models).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool ('Call this BEFORE creating or updating content to understand required fields'), offering clear context for its purpose relative to sibling tools like contentrain_create_content and contentrain_update_content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentrain_get_contentBRead-only
Get a single content entry by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| modelId | Yes | Model ID | |
| entryId | Yes | Entry ID (12-char hex) | |
| locale | No | Locale code for localized models |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, so the agent knows this is a safe read operation. The description adds minimal behavioral context beyond this - it specifies 'by ID' retrieval but doesn't mention error handling, authentication needs, rate limits, or what happens with invalid IDs. With annotations covering the safety profile, this meets baseline expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise - a single sentence that states the core functionality without any unnecessary words. It's front-loaded with the essential information and wastes no space on redundant explanations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read operation with good schema coverage and readOnlyHint annotation, the description is minimally adequate. However, without an output schema, the description doesn't indicate what format the content entry returns in or what fields are included. Given the complexity of content management systems, more context about the return structure would be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all parameters clearly documented in the schema. The description doesn't add any meaningful parameter semantics beyond what the schema already provides - it mentions 'by ID' which corresponds to the entryId parameter but doesn't explain the relationship between modelId and entryId or when locale is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get') and resource ('a single content entry by ID'), making the purpose immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'contentrain_list_content' or 'contentrain_describe_model', which might also retrieve content information in different ways.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With siblings like 'contentrain_list_content' (for multiple entries) and 'contentrain_describe_model' (for model metadata), there's no indication of when this specific retrieval method is preferred or what prerequisites might exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentrain_list_assetsBRead-only
List all registered assets in assets.json.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, so the agent knows this is a safe read operation. The description adds minimal behavioral context by specifying the source file ('assets.json'), but doesn't disclose other traits like pagination, sorting, error conditions, or what 'registered assets' means operationally. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's appropriately sized for a simple list operation and front-loads the core purpose without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, read-only annotation) but lack of output schema, the description is minimally adequate. It states what the tool does but doesn't explain the return format, what constitutes a 'registered asset', or how results are structured, leaving gaps for the agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters and 100% schema description coverage, the schema fully documents the absence of inputs. The description doesn't need to compensate for missing parameter info, and it appropriately doesn't discuss parameters. A baseline of 4 is given since no parameters exist to explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List all registered assets') and the target resource ('assets.json'), providing a specific verb+resource combination. However, it doesn't explicitly differentiate from sibling tools like 'contentrain_list_content' or 'contentrain_list_models' that also list different resource types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There's no mention of prerequisites, when-not-to-use scenarios, or comparison to sibling tools like 'contentrain_describe_model' or 'contentrain_get_content' that might retrieve specific assets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentrain_list_contentARead-only
List all content entries for a model. For localized models, specify a locale.
| Name | Required | Description | Default |
|---|---|---|---|
| modelId | Yes | Model ID to list content from | |
| locale | No | Locale code (e.g., "en", "tr") for localized models |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, indicating this is a safe read operation. The description adds context about locale handling for localized models, which is useful behavioral information beyond the annotations. However, it does not disclose other traits like pagination, rate limits, or error conditions, keeping the score at a baseline level with annotations present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with zero waste, front-loading the main purpose and following with a specific condition. Every sentence earns its place by providing essential information efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (list operation), high schema coverage, and read-only annotations, the description is mostly complete. However, without an output schema, it does not explain return values (e.g., format of listed entries), leaving a minor gap that prevents a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema fully documents both parameters (modelId and locale). The description adds minimal value by reinforcing the locale's purpose for localized models, but does not provide additional syntax or format details beyond what the schema states, resulting in the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List') and resource ('all content entries for a model'), making the purpose specific and understandable. However, it does not explicitly differentiate this tool from sibling tools like 'contentrain_list_models' or 'contentrain_list_assets', which reduces its score from a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides implied usage guidance by mentioning 'For localized models, specify a locale,' which suggests when to use the locale parameter. However, it lacks explicit when-to-use or when-not-to-use instructions compared to alternatives like 'contentrain_get_content' or 'contentrain_describe_model,' and does not name specific sibling tools for differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentrain_list_modelsB
List all Contentrain models with their metadata (type, localization, etc.)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but only states what the tool does, not how it behaves. It lacks details on pagination, rate limits, authentication needs, error handling, or whether it's read-only (implied but not stated). This is inadequate for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core action ('List all Contentrain models') and adds clarifying details in parentheses. Every word earns its place with no redundancy or waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and no output schema, the description adequately covers the purpose but lacks behavioral context needed for completeness. It doesn't explain return format, metadata structure, or operational constraints, leaving gaps for an AI agent to invoke it correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately adds no parameter details, focusing on output semantics. Baseline is 4 for zero-parameter tools when schema coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List') and resource ('Contentrain models') with specific output details ('metadata (type, localization, etc.)'). It distinguishes from siblings like 'contentrain_describe_model' (singular detail) and 'contentrain_list_content' (different resource). However, it doesn't explicitly contrast with all siblings, preventing a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving all models with metadata, but provides no explicit guidance on when to use this versus alternatives like 'contentrain_describe_model' for single-model details or 'contentrain_list_content' for content items. No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentrain_register_assetB
Register a new asset in assets.json. The file must already exist at the specified path in the repository.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path to the asset file (e.g., "contentrain/static/hero.png") | |
| mimetype | Yes | MIME type (e.g., "image/png", "image/jpeg", "application/pdf") | |
| alt | No | Alt text for the asset |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions that the file must already exist, which is useful behavioral context, but doesn't disclose other traits like whether this is a read/write operation, potential side effects, error conditions, or response format. For a mutation tool with zero annotation coverage, this leaves significant gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero waste: the first states the purpose, and the second adds a critical prerequisite. It's front-loaded and appropriately sized, with every sentence earning its place by providing essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a mutation with 3 parameters) and lack of annotations or output schema, the description is minimally adequate. It covers the purpose and a key prerequisite but doesn't explain what 'registering' does, what the response looks like, or other behavioral aspects. It's complete enough for basic use but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters (path, mimetype, alt) with clear descriptions. The description doesn't add any meaning beyond what the schema provides, such as explaining how parameters interact or providing examples. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Register a new asset') and target resource ('in assets.json'), distinguishing it from sibling tools like 'contentrain_deregister_asset' or 'contentrain_list_assets'. However, it doesn't specify what 'registering' entails beyond file existence, making it slightly less specific than a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating 'The file must already exist at the specified path in the repository', which provides context about prerequisites. However, it doesn't explicitly guide when to use this tool versus alternatives like 'contentrain_deregister_asset' or 'contentrain_list_assets', nor does it mention exclusions or specific scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentrain_update_contentB
Update an existing content entry. Only provide fields you want to change. updatedAt is auto-set.
| Name | Required | Description | Default |
|---|---|---|---|
| modelId | Yes | Model ID | |
| entryId | Yes | Entry ID to update (12-char hex) | |
| data | Yes | Fields to update | |
| locale | No | Locale code for localized models | |
| content | No | Updated markdown body (only for MD/MDX models) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions that 'updatedAt is auto-set,' which adds useful context about automatic field handling, but fails to cover critical aspects like authentication requirements, rate limits, error responses, or whether the operation is idempotent. For a mutation tool with zero annotation coverage, this leaves significant gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with just two sentences that are front-loaded and waste no words. Every sentence adds value: the first states the core purpose, and the second provides important behavioral context about partial updates and automatic field handling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 5 parameters, no annotations, and no output schema, the description is incomplete. It lacks information on authentication, error handling, response format, and how it differs from sibling tools. While concise, it doesn't provide enough context for safe and effective use by an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 5 parameters thoroughly. The description adds minimal value beyond the schema by implying partial updates ('Only provide fields you want to change') and noting automatic handling of 'updatedAt,' but doesn't provide additional syntax, format, or constraint details for the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Update') and resource ('existing content entry'), making the purpose immediately understandable. However, it doesn't differentiate this from sibling tools like 'contentrain_create_content' or 'contentrain_delete_content' beyond the basic verb difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides some implied guidance with 'Only provide fields you want to change' and mentions 'updatedAt is auto-set,' which suggests partial updates are supported. However, it doesn't explicitly state when to use this tool versus alternatives like 'contentrain_create_content' or 'contentrain_get_content,' nor does it mention prerequisites or error conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contentrain_validateARead-only
Validate content data against model schema without writing. Use for dry-run checks.
| Name | Required | Description | Default |
|---|---|---|---|
| modelId | Yes | Model ID to validate against | |
| data | Yes | Content data to validate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations provide readOnlyHint=true, indicating a safe read operation. The description adds valuable context by specifying 'without writing' and 'dry-run checks', which clarifies the tool's non-destructive nature beyond what annotations alone convey, though it doesn't detail error handling or validation specifics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded in a single sentence, with every word earning its place by clearly stating purpose and usage without any redundant information, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (validation with two parameters), annotations covering safety, and no output schema, the description is mostly complete. It clearly explains the tool's purpose and usage, though it could benefit from mentioning what validation results look like (e.g., success/failure details) to fully compensate for the lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the input schema fully documents both parameters (modelId and data). The description adds no additional parameter semantics beyond implying validation context, so it meets the baseline of 3 without compensating for any gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verbs ('validate content data against model schema') and distinguishes it from siblings by emphasizing 'without writing' and 'dry-run checks', which differentiates it from write operations like create_content or update_content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('Use for dry-run checks') and implies when not to use it ('without writing'), distinguishing it from sibling tools that perform actual writes like create_content or update_content, providing clear alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.1.0- First observed
contentrain_add_field - First observed
contentrain_create_content - First observed
contentrain_create_model - First observed
contentrain_delete_content - First observed
contentrain_delete_model - First observed
contentrain_deregister_asset - First observed
contentrain_describe_model - First observed
contentrain_get_content - First observed
contentrain_list_assets - First observed
contentrain_list_content - First observed
contentrain_list_models - First observed
contentrain_register_asset - First observed
contentrain_update_content - First observed
contentrain_validate
TDQS
Scored across 14 tools
Each tool has a distinct purpose with clear boundaries: model management (create/delete/describe/list), content operations (create/get/list/update/delete/validate), and asset handling (register/deregister/list). No tools overlap in functionality, and the descriptions explicitly differentiate them (e.g., contentrain_describe_model is for schema inspection, while contentrain_validate is for dry-run validation).
All tools follow a consistent 'contentrain_verb_noun' pattern with snake_case throughout (e.g., contentrain_create_model, contentrain_list_content). Verbs are descriptive and aligned with CRUD operations (create, get, list, update, delete) and domain-specific actions (describe, validate, register, deregister), making the naming highly predictable and readable.
With 14 tools, the server is well-scoped for a content management system, covering model lifecycle, content CRUD, asset management, and validation. Each tool serves a clear, non-redundant function, and the count is typical for this domain (similar to the GitHub MCP example), avoiding bloat or thin coverage.
The toolset provides complete coverage for content management: full CRUD for models and content, asset registration/deregistration, schema inspection, and validation. There are no obvious gaps; agents can perform all core workflows from model creation to content operations and asset handling, with no dead ends in the lifecycle.
Related MCP Connectors
Git-backed platform for skills, tools, and context for AI agents
- ZeroCMSOAuthio.zerocms
AI-native Git-based CMS for Astro. Create and publish content in the browser, without learning git.
Manage SRG+ hubs, channels, content, assets, users, and workspaces from any MCP-aware AI agent.
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.