Skip to main content
Glama
nitti510x

mcp-content-ops

by nitti510x

mcp-content-ops

An MCP server that lets an agent work with CMS content. The tools are the boring part — search, read, create a draft, set a field, publish. What took the thinking is what happens before any of them run.

Most content MCP servers we have looked at hand the model an API client and a credential with whatever permissions the integration account happens to have, which in a CMS is usually everything. The demo works. Then someone asks the agent to "tidy up the product pages" and it publishes forty drafts, because nothing in the system ever said it could not.

The scoping

Four gates, in order, and none of them live in the tool schema:

  1. Argument validation against the published schema. Unknown properties are rejected rather than dropped — a model that invents an argument has misunderstood the tool, and dropping it quietly hides that.

  2. Deny by default. Writes are off unless config turns them on. There is no permissive default anywhere in Policy.

  3. Type and field allowlists. A type being readable does not make it writable, and a writable type does not make every field on it writable.

  4. Structured audit of every call, allowed or refused, with the reason.

The type a call is judged against comes from the stored item, never from the arguments. Letting the caller assert what kind of thing it is editing is letting the caller pick which policy applies.

A refused call comes back as a normal tool result with isError set, not a JSON-RPC error. The model should see why it was refused and adapt; a protocol error means the client is broken, which is a different conversation.

Related MCP server: ToolBridge

Running it

pip install -e ".[dev]"
python -m content_ops.server policy.example.json
pytest -q

The CMS behind it is an in-memory stub in cms.py — four methods, swap it for your content API.

What it does not do

No delete tool, on purpose. No resources or prompts, only tools. No auth: this is a stdio server and the trust boundary is the process that launched it. The schema validator covers the subset our own tool schemas use rather than all of JSON Schema.

Why not use an SDK

The MCP Python SDK is fine and for a larger server it is the right call. This one implements three methods over stdio, and the wire format is small enough that a dependency moving at the pace the SDKs currently move was the bigger risk.

Available Tools

5 tools
create_contentB

Create a content item as a draft.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
content_typeYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully disclose side effects. It only states 'create as a draft' without mentioning permissions, reversibility, or what happens on success/failure. This is insufficient for a mutation operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with no unnecessary words. It is well-structured and appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that no output schema is provided, the description should at least indicate what the tool returns or how it affects state. It only mentions the draft state, omitting important details like whether an ID or object is returned, or any post-creation steps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no descriptions for 'name' or 'content_type', and the description does not explain their meaning or usage. With zero parameter coverage, the description fails to compensate, leaving the agent without context for these required fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (create), the resource (content item), and the state (as a draft), distinguishing it from sibling tools like search, get, update, and publish.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for creating a new content item, but does not explicitly state when to use it vs alternatives. It lacks explicit conditions or exclusions, though the intent is clear from the tool name and description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contentC

Read one content item.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations to provide read-only or safety hints. The description 'Read' implies no mutation, but it does not mention how the content is returned, errors, or any special behavior at all. A descr without annotations bears the full disclosure burden, but only provides one cliché sentence.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Exactly one sentence and no filler. It says what it does in minimal words. But its minimalism is excessive and becomes thin.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No annotations and annotations absent. One input without output. No returns, no error conditions, no content type. The description misses entire behavioral and contextual layers.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the param is just 'id' with maxLength 40 and type string, which could be an identifier, but the description adds no meaning to what this id actually names or how to use it in content operations. Even a baseline of 0% coverage requires explicit parameter explanation in description, and the description does not provide any.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Read' and the resource 'one content item', which aligns with the id parameter. It distinguishes from siblings that create, update, or publish content, but it does not specify what kind of content item is being read.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance or alternatives are given. The single sentence implies direct retrieval by identifier, but the context of usage versus search_content or create_content_field is not addressed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publish_contentC

Publish a draft.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are absent, so the description carries the burden of behavioral disclosure. 'Publish a draft' implies a state change, but it does not disclose consequences like making the content publicly visible, whether the action is reversible, or if any permission is required. It conveys a mutation but lacks details on 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with one short sentence. It is front-loaded with the key action and resource. However, its brevity is a trade-off: it lacks valuable context, but it does not waste words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a mutation with a simple schema (one required parameter) and no output schema or annotations. The description is minimal and does not provide expected context such as prerequisites (draft must exist), success criteria, or failure modes. Given the lack of additional structured information, the description is incomplete from a behavioral standpoint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. The description does not elaborate on the 'id' parameter (e.g., the ID of the draft to publish). It adds no meaning beyond the schema's type and required flag, leaving the agent to infer that 'id' refers to the draft ID.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Publish a draft') and the resource ('draft'), which distinguishes it from sibling tools like get_content or search_content. However, it does not specify what 'publish' entails (e.g., making content publicly visible, changing status) or what resource type it applies to beyond 'draft', but the verb and resource are specific and clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for draft content but provides no guidance on when to use this tool versus update_content_field (which might also change content status) or prerequisites (e.g., the content must be in draft status). No explicit when-not or alternative mentions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_contentC

Find content items by a substring of their name.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
content_typeNo

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits but only mentions the search action. It lacks details on pagination, limit handling, content_type filtering behavior, or what happens when no results match.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence with no redundancy. It is concise and front-loaded, though the brevity sacrifices essential details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 3 parameters and no output schema, the description is severely incomplete. It fails to explain limit and content_type, return format, or usage context, making it inadequate for reliable agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% so the description should compensate. It implicitly explains the query parameter as the name substring but omits limit and content_type semantics, leaving agents without guidance on their purpose or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool finds content items by a substring of their name, providing a specific verb and resource. It differentiates from siblings like 'create_content' and 'publish_content' but is somewhat similar to 'get_content' without explicit distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case (searching by name substring) but provides no explicit guidance on when to choose this over 'get_content' or other alternatives. It doesn't mention exclusion criteria or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_content_fieldC

Set one field on one content item.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
fieldYes
valueYes

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It implies mutation ('set') but gives no details on whether other fields are preserved, if the operation is idempotent, what errors occur, or what the return value looks like. There is no mention of authentication or 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.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

While the description is very short, it is under-specified rather than concise. It essentially restates the tool name with minimal extra meaning. It lacks any structure or useful detail, so it does not 'earn its place' by adding value beyond the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is grossly insufficient for a tool with 3 required parameters and no annotations or output schema. It fails to explain parameter semantics, usage context, behavioral implications, or expected return. Sibling tools exist but are not referenced. An agent would be left guessing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description provides no explanation of the parameters id, field, or value. It does not clarify that id is the content item identifier, field is the field name, or that value is the new value. The agent cannot infer parameter usage from the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Set one field on one content item.' It defines the scope (one field, one item) and distinguishes it from sibling tools like create_content (which creates new items) and publish_content (which publishes). This is a specific verb-resource pairing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. It does not mention that this is for updating an existing field, nor does it reference sibling tools like search_content or get_content for locating items beforehand, or create_content for new items. The description offers no exclusions or context.

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.

  1. 5 tool updatesv0.1.0
    • First observedcreate_content
    • First observedget_content
    • First observedpublish_content
    • First observedsearch_content
    • First observedupdate_content_field

TDQS

B3.1/5.0

Scored across 5 tools

Disambiguation4/5

The tools are mostly distinct: search, get, create, update, publish. Minor overlap: get_content vs search_content could be confused but descriptions clarify one is for exact retrieval and the other for substring search.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (search_content, get_content, create_content, update_content_field, publish_content). The action verbs are clear and uniform.

Tool Count5/5

5 tools is well-scoped for a content operations server. Each tool covers a distinct lifecycle step: search, read, create, update, publish. No redundancy or excess.

Completeness3/5

Covers basic search/read/create/update/publish workflow, but missing delete_content (or archive), and possibly list/summary operations. Update is limited to one field at a time, which may be restrictive, but the core workflow is covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A governed MCP server for integrating AI agents with customer data, featuring role-based access control, field redaction, and human-in-the-loop approval for secure support operations.
    1
    -