DevHub CMS MCP
OfficialClick on "Install 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., "@DevHub CMS MCPcreate a blog post about our new product launch with some marketing content"
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.
DevHub CMS MCP
A Model Context Protocol (MCP) integration for managing content in the DevHub CMS system.
Installation
You will need the uv package manager installed on your local system.
Manual configuration of Claude Desktop
To use this server with the Claude Desktop app, add the following configuration to the "mcpServers" section of your claude_desktop_config.json:
{
"mcpServers": {
"devhub_cms_mcp": {
"command": "uvx",
"args": [
"devhub-cms-mcp"
],
"env": {
"DEVHUB_API_KEY": "YOUR_KEY_HERE",
"DEVHUB_API_SECRET": "YOUR_SECRET_HERE",
"DEVHUB_BASE_URL": "https://yourbrand.cloudfrontend.net"
}
}
}
}After updating the config, restart Claude Desktop.
Manual configuration for Cursor
This MCP can also be used in cursor with a similar configuration from above added to your Cursor global environment or to individual projects.
Examples here
Installing via Claude Code
Claude Code's command line supports MCP installs.
You can add the devhub-cms-mcp by updating the environment variables below
claude mcp add devhub-cms-mcp \
-e DEVHUB_API_KEY=YOUR_KEY_HERE \
-e DEVHUB_API_SECRET=YOUR_SECRET_HERE \
-e DEVHUB_BASE_URL=https://yourbrand.cloudfrontend.net \
-- uvx devhub-cms-mcpInstalling via Smithery
To install DevHub CMS MCP for Claude Desktop automatically via Smithery:
npx -y @smithery/cli install @devhub/devhub-cms-mcp --client claudeRelated MCP server: MCP Adapter Implementation Example
Local development
Clone the repo (or your fork)
git clone git@github.com:devhub/devhub-cms-mcp.gitManual configuration of Claude Desktop
To use this server with the Claude Desktop app for local development, add the following configuration to the "mcpServers" section of your claude_desktop_config.json:
{
"mcpServers": {
"devhub_cms_mcp": {
"command": "uv",
"args": [
"--directory",
"/YOUR/LOCAL/PATH/devhub-cms-mcp/",
"run",
"main.py"
],
"env": {
"DEVHUB_API_KEY": "YOUR_KEY_HERE",
"DEVHUB_API_SECRET": "YOUR_SECRET_HERE",
"DEVHUB_BASE_URL": "https://yourbrand.cloudfrontend.net"
}
}
}
}After updating the config, restart Claude Desktop.
Configuration for running with uv directly
This MCP requires the following environment variables to be set:
export DEVHUB_API_KEY="your_api_key"
export DEVHUB_API_SECRET="your_api_secret"
export DEVHUB_BASE_URL="https://yourbrand.cloudfrontend.net"Then run the MCP
uv run main.pyAvailable Tools
This MCP provides the following tools for interacting with DevHub CMS:
Business and Location Management
get_businesses(): Gets all businesses within the DevHub account. Returns a list of businesses with their IDs and names.
get_locations(business_id): Gets all locations for a specific business. Returns detailed location information including address, coordinates, and URLs.
get_hours_of_operation(location_id, hours_type='primary'): Gets the hours of operation for a specific DevHub location. Returns a structured list of time ranges for each day of the week.
update_hours(location_id, new_hours, hours_type='primary'): Updates the hours of operation for a DevHub location.
get_nearest_location(business_id, latitude, longitude): Finds the nearest DevHub location based on geographic coordinates.
site_from_url(url): Gets the DevHub site ID and details from a URL. Returns site ID, URL, and associated location IDs.
Content Management
get_blog_post(post_id): Retrieves a single blog post by ID, including its title, date, and HTML content.
create_blog_post(site_id, title, content): Creates a new blog post. The content should be in HTML format and should not include an H1 tag.
update_blog_post(post_id, title=None, content=None): Updates an existing blog post's title and/or content.
Media Management
upload_image(base64_image_content, filename): Uploads an image to the DevHub media gallery. Supports webp, jpeg, and png formats. The image must be provided as a base64-encoded string.
Usage with LLMs
This MCP is designed to be used with Large Language Models that support the Model Context Protocol. It allows LLMs to manage content in DevHub CMS without needing direct API access integrated into the LLM natively.
Testing
This package includes a test suite with mocked requests to the DevHub API, allowing you to test the functionality without making actual API calls.
Running Tests
To run the tests, first install the package with test dependencies:
uv pip install -e ".[test]"Run the tests with pytest:
uv run pytestFor more detailed output and test coverage information:
uv run pytest -v --cov=devhub_cms_mcpTest Structure
tests/devhub_cms_mcp/test_mcp_integration.py: Tests for MCP integration endpoints
Available Tools
10 toolscreate_blog_postB
Create a new blog post
Args:
site_id: Website ID where the post will be published. Prompt the user for this ID.
title: Blog post title
content: HTML content of blog post. Should not include a <h1> tag, only h2+
| Name | Required | Description | Default |
|---|---|---|---|
| site_id | Yes | ||
| title | Yes | ||
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions that content 'Should not include a <h1> tag, only h2+' which is useful behavioral guidance, but fails to disclose critical aspects: whether this is a mutation (implied but not stated), what permissions are needed, whether the post is published immediately or saved as draft, what happens on success/failure, or what the return value contains. For a creation tool with zero annotation coverage, this leaves significant behavioral 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 sized and front-loaded with the core purpose. The parameter explanations are organized in a clear 'Args:' section. While efficient, the 'Prompt the user for this ID' note could be more concise, and the formatting constraint for content might belong in a separate guidelines section rather than inline with the parameter definition.
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 a 3-parameter creation tool with no annotations and no output schema, the description does an adequate job but has clear gaps. It covers parameter meanings well and provides some behavioral guidance about HTML formatting, but misses critical context about the mutation nature, permissions, publication status, and return values. The description is minimally viable but incomplete for a tool that creates content.
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 description provides excellent parameter semantics despite 0% schema description coverage. It explains what each parameter represents: 'Website ID where the post will be published' for site_id, 'Blog post title' for title, and 'HTML content of blog post' with specific formatting constraints for content. The 'Prompt the user for this ID' guidance for site_id adds practical usage context. This fully compensates for the lack of schema descriptions.
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 'blog post', making the purpose immediately understandable. It distinguishes from siblings like 'update_blog_post' by specifying 'new', but doesn't fully differentiate from other creation tools that might exist (though none are listed as siblings). The purpose is specific and actionable.
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. While it mentions 'Prompt the user for this ID' for site_id, this is parameter guidance rather than tool selection advice. There's no mention of prerequisites, when not to use it, or how it differs from similar operations like 'update_blog_post' beyond the obvious creation vs. update distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_blog_postC
Get a single blog post
Args:
post_id: Blog post id
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes |
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 of behavioral disclosure. It states the tool 'Get[s] a single blog post', which implies a read-only operation, but doesn't clarify aspects like authentication requirements, error handling (e.g., what happens if the post_id doesn't exist), rate limits, or response format. This leaves significant gaps in understanding how the tool behaves in practice.
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 well-structured, with a clear purpose statement followed by parameter details in a labeled section. It avoids unnecessary fluff and is front-loaded with the main functionality. However, the 'Args' section could be integrated more seamlessly, and there's room for slight improvement in flow.
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 (1 parameter, no output schema, no annotations), the description is incomplete. It lacks information on return values, error conditions, and behavioral traits, which are crucial for a read operation. Without annotations or an output schema, the description should provide more context to ensure the agent can use the tool effectively, but it falls short.
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 description includes an 'Args' section that documents the 'post_id' parameter, adding meaning beyond the input schema, which has 0% description coverage. However, it only provides a basic label ('Blog post id') without details on format, constraints, or examples. With one parameter and low schema coverage, this compensates minimally, meeting the baseline for adequate but incomplete documentation.
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 a specific verb ('Get') and resource ('a single blog post'), making it immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'create_blog_post' or 'update_blog_post' beyond the verb choice, which prevents 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 provides no guidance on when to use this tool versus alternatives. It doesn't mention when to use 'get_blog_post' instead of other sibling tools like 'get_businesses' or 'get_locations', nor does it specify prerequisites or context for usage. The only implied usage is retrieving a specific blog post, but this is basic and insufficient for effective tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_businessesA
Get all businesses within the DevHub account
Returns a list of businesses with the following fields:
- id: Business ID that can be used in the other tools
- business_name: Business name
If only one business exists in the account, you can assume that the user wants to use that business for any business_id related tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 discloses that the tool returns a list of businesses with specific fields (id and business_name), which is useful behavioral context. However, it lacks details on error handling, pagination, or rate limits, which are important for a read operation. The description doesn't contradict any annotations, but it's not fully comprehensive.
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 well-structured and concise, with three sentences that each add value: stating the purpose, detailing the return fields, and providing usage guidance. It's front-loaded with the core purpose. A minor point is that the second sentence could be more tightly integrated, but overall it's efficient with minimal 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 the tool has no annotations, no output schema, and 0 parameters, the description does a decent job by explaining the return format and usage assumption. However, for a tool that returns data, more details on response structure (e.g., list format, error cases) would improve completeness. It's adequate but has clear gaps in behavioral 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 doesn't discuss parameters, which is correct. However, it doesn't add any extra semantic context beyond the schema, so it earns a baseline 4 for zero-parameter tools.
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: 'Get all businesses within the DevHub account.' It specifies the verb ('Get') and resource ('businesses'), and the scope ('within the DevHub account') is well-defined. However, it doesn't explicitly differentiate from sibling tools like 'get_locations' or 'get_nearest_location', which prevents a score of 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 clear usage context by stating 'If only one business exists in the account, you can assume that the user wants to use that business for any business_id related tools.' This gives practical guidance on when to use the tool's output. However, it doesn't specify when not to use it or name explicit alternatives among siblings, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hours_of_operationA
Get the hours of operation for a DevHub location
Returns a list of items representing days of the week
Except for the special case formatting, this object is a list of 7 items which represent each day.
Each day can can have one-four time ranges. For example, two time ranges denotes a "lunch-break". No time ranges denotes closed.
Examples:
9am-5pm [["09:00:00", "17:00:00"]]
9am-12pm and 1pm-5pm [["09:00:00", "12:00:00"], ["13:00:00", "17:00:00"]]
Closed - an empty list []
Args:
location_id: DevHub Location ID
hours_type: Defaults to 'primary' unless the user specifies a different type
| Name | Required | Description | Default |
|---|---|---|---|
| location_id | Yes | ||
| hours_type | No | primary |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the return format (list of 7 items representing days) and behavioral traits like handling of closed days and lunch breaks, but lacks details on error handling, permissions, or rate limits. It adds value beyond basic function but is incomplete for full transparency.
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 sized and front-loaded with the core purpose. It efficiently includes examples and parameter explanations, though the formatting of examples could be slightly clearer. Most sentences add value without 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 no annotations and no output schema, the description does well to explain the return structure and parameters. However, it lacks information on error cases, authentication needs, or rate limits, making it incomplete for a tool with 2 parameters and complex return behavior.
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 0%, so the description must compensate. It explains 'location_id' as a 'DevHub Location ID' and 'hours_type' with its default and user specification context, adding meaningful semantics beyond the bare schema. However, it doesn't detail possible values for 'hours_type' beyond 'primary'.
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 the hours of operation') and resource ('for a DevHub location'), distinguishing it from sibling tools like 'get_locations' or 'update_hours'. It precisely defines what the tool does without being vague or tautological.
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 like 'get_locations' or 'update_hours'. It mentions a default for 'hours_type' but lacks explicit context, prerequisites, or exclusions for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_locationsB
Get all locations for a business
Returns a list of locations with the following fields:
- id: Location ID that can be used in the other tools
- location_name: Location name
- location_url: Location URL in DevHub
- street: Street address
- city: City
- state: State
- country: Country
- postal_code: Postal code
- lat: Latitude
- lon: Longitude
| Name | Required | Description | Default |
|---|---|---|---|
| business_id | Yes |
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 states the tool returns a list of locations with specific fields, which is helpful, but lacks critical details such as whether it's read-only (implied by 'Get' but not explicit), pagination behavior, error handling, authentication needs, or rate limits. For a tool with zero annotation coverage, this leaves significant gaps in understanding its behavior.
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 sized and front-loaded: the first sentence states the core purpose, followed by a structured list of return fields. Every sentence earns its place by adding value, with no redundant or verbose language, making it efficient and easy to parse.
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 (1 parameter, no output schema, no annotations), the description is moderately complete. It explains the purpose and return fields adequately, but lacks details on behavioral aspects like error handling or usage context. Without annotations or an output schema, it should do more to compensate, but it covers the basics for a simple read operation.
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 1 parameter (business_id) with 0% description coverage, so the description must compensate. It adds meaning by clarifying that locations are retrieved 'for a business', implicitly explaining the business_id parameter's role. However, it doesn't specify format constraints or examples, leaving some ambiguity. With 0 parameters documented in the schema, the baseline is 4, and the description partially meets this by providing contextual meaning.
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: 'Get all locations for a business' specifies the verb ('Get') and resource ('locations'), with the scope ('for a business') distinguishing it from siblings like 'get_nearest_location' or 'get_businesses'. However, it doesn't explicitly differentiate from potential similar tools beyond the business context.
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 a valid business_id), exclusions, or comparisons to siblings like 'get_nearest_location' or 'get_businesses', leaving usage context implied at best.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_nearest_locationB
Get the nearest DevHub location
Args:
business_id: DevHub Business ID associated with the location. Prompt the user for this ID
latitude: Latitude of the location
longitude: Longitude of the location
| Name | Required | Description | Default |
|---|---|---|---|
| business_id | Yes | ||
| latitude | Yes | ||
| longitude | Yes |
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 states it 'Get's data, implying a read-only operation, but doesn't cover critical aspects like authentication needs, rate limits, error handling, or what the return format looks like (e.g., distance, address details). This is a significant gap 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 appropriately sized and front-loaded, with the core purpose stated first followed by parameter details. The parameter explanations are efficient, though the formatting with 'Args:' could be slightly more polished for readability.
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 complexity (3 required parameters, no annotations, no output schema), the description is incomplete. It doesn't explain what the tool returns (e.g., nearest location details, distance metrics), error conditions, or behavioral traits like performance or dependencies, leaving the agent with insufficient context for reliable invocation.
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 description adds meaningful context beyond the input schema, which has 0% description coverage. It explains that 'business_id' is a 'DevHub Business ID associated with the location' and instructs to 'Prompt the user for this ID', and clarifies that 'latitude' and 'longitude' refer to 'the location' (presumably the user's or a target location). This compensates well for the lack of schema descriptions.
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 'Get' and resource 'nearest DevHub location', making the purpose specific and understandable. However, it doesn't differentiate from sibling tools like 'get_locations' or 'get_businesses', which might have overlapping functionality for location-related queries.
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?
No guidance is provided on when to use this tool versus alternatives like 'get_locations' or 'get_businesses'. The description lacks context about prerequisites, exclusions, or specific use cases, leaving the agent with no directional cues for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
site_from_urlA
Get the DevHub site ID from a URL.
Can prompt the user for the URL instead of passing a site_id.
Returns details about the Site matches the URL that can be used in the other tools.
- Site ID: ID of the DevHub site
- Site URL: URL of the DevHub site
- Site Location IDs: List of location IDs associated with the site
Args:
url: URL of the DevHub site, all lowercase and ends with a slash
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool returns site details (ID, URL, location IDs) and can prompt for user input, which adds useful behavioral context. However, it lacks details on error handling, permissions, or rate limits, leaving gaps for a tool that fetches data.
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 well-structured and appropriately sized: it starts with the core purpose, adds usage notes, lists return values, and details parameters. Each sentence adds value, but the bulleted return list could be slightly more concise. Overall, it's efficient with minimal 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 no annotations, no output schema, and 1 parameter with low schema coverage, the description is moderately complete. It covers the purpose, parameter semantics, and return values, but lacks error handling, authentication needs, or examples. For a data-fetching tool, this leaves some contextual 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?
The schema has 1 parameter with 0% description coverage, so the description must compensate. It adds meaning by specifying the 'url' parameter format: 'all lowercase and ends with a slash.' This provides critical syntax details beyond the schema's basic string type, though it doesn't cover all potential edge cases (e.g., validation rules).
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: 'Get the DevHub site ID from a URL.' This specifies the verb ('Get') and resource ('DevHub site ID'), and distinguishes it from sibling tools like 'get_locations' or 'get_businesses' by focusing on site identification from a URL. However, it doesn't explicitly differentiate from all siblings (e.g., 'get_nearest_location' might also involve URLs), keeping it at 4 rather than 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 some usage context: 'Can prompt the user for the URL instead of passing a site_id.' This implies an alternative input method but doesn't specify when to use this tool versus others (e.g., 'get_locations' for location data). No explicit when/when-not guidance or named alternatives are given, so it's implied rather than clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_blog_postC
Update a single blog post
Args:
post_id: Blog post ID
title: Blog post title
content: HTML content of blog post. Should not include a <h1> tag, only h2+
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | ||
| title | No | ||
| content | No |
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 states 'Update a single blog post', implying a mutation operation, but doesn't cover critical aspects like required permissions, whether changes are reversible, error handling, or response format. The HTML content guideline is useful but insufficient for a mutation 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 appropriately sized and front-loaded, starting with the core purpose 'Update a single blog post'. The parameter details are listed concisely, though the HTML guideline could be integrated more smoothly. There's minimal wasted text, making it efficient for quick understanding.
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 complexity of a mutation tool with 3 parameters, 0% schema description coverage, no annotations, and no output schema, the description is incomplete. It lacks information on behavioral traits (e.g., side effects, auth needs), usage context, and return values, leaving significant gaps for an AI agent to rely on.
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 description adds meaningful context for parameters: it clarifies that 'post_id' is a 'Blog post ID', 'title' is a 'Blog post title', and 'content' is 'HTML content of blog post' with a specific guideline about avoiding <h1> tags. Since schema description coverage is 0%, this compensates somewhat, but it doesn't fully explain all three parameters (e.g., format of post_id, constraints on title).
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 'a single blog post', making the purpose immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'create_blog_post' or 'get_blog_post', though the action 'Update' implies it modifies existing posts rather than creating new ones or retrieving them.
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 post_id), exclusions, or comparisons to siblings like 'create_blog_post' for new posts or 'get_blog_post' for retrieval, leaving usage context unclear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_hoursA
Update the hours of operation for a DevHub location
Send a list of items representing days of the week
Except for the special case formatting, this object is a list of 7 items which represent each day.
Each day can can have one-four time ranges. For example, two time ranges denotes a "lunch-break". No time ranges denotes closed.
Examples:
9am-5pm [["09:00:00", "17:00:00"]]
9am-12pm and 1pm-5pm [["09:00:00", "12:00:00"], ["13:00:00", "17:00:00"]]
Closed - an empty list []
Args:
location_id: DevHub Location ID
new_hours: Structured format of the new hours
hours_type: Defaults to 'primary' unless the user specifies a different type
| Name | Required | Description | Default |
|---|---|---|---|
| location_id | Yes | ||
| new_hours | Yes | ||
| hours_type | No | primary |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It clearly indicates this is a mutation tool ('Update'), describes the data structure (7 items representing days, 0-4 time ranges), and provides formatting examples. However, it lacks information about permissions, side effects, error conditions, or what happens to existing hours not mentioned.
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 sized and well-structured: it starts with the core purpose, explains the data format, provides concrete examples, and lists parameters with explanations. Every sentence adds value, though the parameter explanations could be slightly more integrated with the initial description.
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 no annotations and no output schema, the description does a good job explaining parameters and data format. However, it lacks information about what the tool returns, error handling, authentication requirements, or how changes affect existing data. The examples help but don't fully compensate for missing behavioral 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?
With 0% schema description coverage, the description fully compensates by explaining all three parameters: 'location_id' identifies the target, 'new_hours' is described in detail with structure and examples, and 'hours_type' is explained with its default value and optional nature. The description adds substantial meaning beyond the bare 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 specific action ('Update'), resource ('hours of operation for a DevHub location'), and scope (days of the week with time ranges). It distinguishes from sibling tools like 'get_hours_of_operation' by focusing on modification rather than retrieval.
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 when updating hours for a DevHub location, but provides no explicit guidance on when to use this tool versus alternatives like 'get_hours_of_operation' or other update tools. No prerequisites, exclusions, or comparison to siblings are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imageB
Upload an image to the DevHub media gallery
Supports webp, jpeg and png images
Args:
base64_image_content: Base 64 encoded content of the image file
filename: Filename including the extension
| Name | Required | Description | Default |
|---|---|---|---|
| base64_image_content | Yes | ||
| filename | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions the upload action and supported formats but lacks critical behavioral details: whether this requires authentication, what permissions are needed, whether it overwrites existing files with same names, what happens on success/failure, rate limits, or what the return value contains. For a mutation tool with zero annotation coverage, this leaves significant behavioral 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 sized and well-structured with clear sections: purpose statement, format support, and parameter explanations. Each sentence earns its place by adding value. The information is front-loaded with the core purpose first. Minor improvement could be made by integrating parameter details more seamlessly rather than using a separate 'Args:' section.
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 this is a mutation tool with no annotations and no output schema, the description is incomplete. It covers the basic action and parameters but misses critical context: authentication requirements, error handling, return values, file size limits, or what happens in the DevHub media gallery after upload. For a tool that modifies system state, this leaves too many unknowns for safe and 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?
The description adds meaningful semantic context beyond the schema. While schema description coverage is 0% (titles only), the description explains that 'base64_image_content' should contain 'Base 64 encoded content of the image file' and 'filename' should be 'Filename including the extension' - providing crucial usage guidance not present in the bare schema. For 2 parameters, this adequately compensates for the low 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 verb ('Upload') and resource ('image to the DevHub media gallery'), making the purpose immediately understandable. It distinguishes from sibling tools like create_blog_post or get_locations by focusing specifically on media uploads rather than content creation or data retrieval. However, it doesn't explicitly differentiate from potential similar upload tools (though none exist in the sibling list).
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. While it mentions supported image formats (webp, jpeg, png), it doesn't explain when you'd choose this over other media handling methods or what prerequisites exist (like authentication requirements or file size limits). There's no mention of when-not-to-use scenarios or comparisons with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes, but get_hours_of_operation and update_hours are closely related and could potentially be confused due to similar naming and overlapping functionality. The other tools target clearly different resources like blog posts, businesses, locations, and images, making them easy to distinguish.
All tools follow a consistent verb_noun naming pattern, such as create_blog_post, get_blog_post, update_blog_post, get_businesses, get_locations, and upload_image. There are no deviations in style or convention, making the set predictable and readable.
With 10 tools, the count is well-scoped for a CMS server covering blog posts, businesses, locations, hours, and media. Each tool serves a clear purpose, and there are no redundant or trivial additions, fitting typical expectations for such a domain.
The toolset covers blog post creation, retrieval, and update, but lacks deletion, which is a notable gap in the CRUD lifecycle. For locations and businesses, retrieval tools are present, but creation, update, and deletion are missing, leaving significant operational gaps that could hinder agent workflows.
Maintenance
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
Manage structured website content in Garchi CMS through MCP.
Create, edit, organize, publish, and configure JustBlogged blogs from MCP clients.
A Model Context Protocol (MCP) server for Selise Blocks Cloud integration
Model Context Protocol server for Studex tools, notifications, and profile integrations
Related MCP Servers
- AlicenseAqualityCmaintenanceAn MCP server for interacting with Contentstack's Content Management API15162TypeScriptMIT
- FlicenseNot gradedqualityFmaintenanceEnables WordPress content management (posts, metadata, taxonomies, Gutenberg blocks) via the Model Context Protocol, demonstrating MCP Adapter integration patterns.
- AlicenseNot gradedqualityFmaintenanceA Django CMS plugin that provides Model Context Protocol (MCP) server functionality, enabling AI assistants like Claude to directly interact with, manage, and create content in your Django CMS installation through natural language.4MIT
- AlicenseNot gradedqualityDmaintenanceEnables WordPress content management via the Model Context Protocol, allowing creation, update, search, and retrieval of posts, as well as fetching block type schemas for generating block-based content.6810ISC
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/devhub/devhub-cms-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server