Skip to main content
Glama
devhub

DevHub CMS MCP

Official
by devhub

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-mcp

Installing via Smithery

To install DevHub CMS MCP for Claude Desktop automatically via Smithery:

npx -y @smithery/cli install @devhub/devhub-cms-mcp --client claude

Related MCP server: MCP Adapter Implementation Example

Local development

Clone the repo (or your fork)

git clone git@github.com:devhub/devhub-cms-mcp.git

Manual 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.py

Available 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 pytest

For more detailed output and test coverage information:

uv run pytest -v --cov=devhub_cms_mcp

Test Structure

  • tests/devhub_cms_mcp/test_mcp_integration.py: Tests for MCP integration endpoints

Available Tools

10 tools
create_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+
ParametersJSON Schema
NameRequiredDescriptionDefault
site_idYes
titleYes
contentYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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
ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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
ParametersJSON Schema
NameRequiredDescriptionDefault
location_idYes
hours_typeNoprimary

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/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. 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.

Purpose5/5

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.

Usage Guidelines2/5

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
ParametersJSON Schema
NameRequiredDescriptionDefault
business_idYes

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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
ParametersJSON Schema
NameRequiredDescriptionDefault
business_idYes
latitudeYes
longitudeYes

TDQS

B3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

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 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
ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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+
ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes
titleNo
contentNo

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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
ParametersJSON Schema
NameRequiredDescriptionDefault
location_idYes
new_hoursYes
hours_typeNoprimary

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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
ParametersJSON Schema
NameRequiredDescriptionDefault
base64_image_contentYes
filenameYes

TDQS

B3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

A3.5/5.0
Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityInactive
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

Appeared in Searches

Latest Blog Posts

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