Skip to main content
Glama

Joomla MCP Server

Connect an AI assistant to your existing Joomla 4 or 5 website so it can read and manage articles, categories, tags and other supported site content.

You configure two places: your Joomla website and the computer running your AI assistant. This Python server runs on your computer and calls Joomla's built-in Web Services API over HTTPS. You do not install this repository as a Joomla extension or upload it to your web host. Your AI app must support local MCP servers using stdio; the example below uses Claude Desktop.

Set up your Joomla website

1. Enable the required plugins

Sign in to your Joomla Administrator as a Super User. Open System → Manage → Plugins (or System → Plugins, depending on your administrator layout). Search for and enable:

Plugin

Needed for

API Authentication - Web Services Joomla Token

Authenticating API requests with your token

User - Joomla API Token

Creating and managing a user's API token

Web Services - Content

Articles, content categories and article fields

Start with these three. If you want additional tools, also enable the corresponding Web Services - Tags, Media, Menus, Modules or Users plugin. Media tools require Joomla 4.1 or later. Custom fields also need Joomla's Fields component and field plugins.

2. Choose the Joomla account the assistant will use

The API token belongs to a Joomla user. Requests have that user's permissions. Use a dedicated account for this connection, rather than your everyday Super User account.

For a dedicated account:

  1. Open Users → Groups → New and create a group such as MCP Content Editors. For a restricted starting point, select Registered as the parent group.

  2. Open System → Global Configuration → Permissions, select your group, and allow Web Services Login (core.login.api). Also allow Administrator Login so this account can open its own profile and copy its token. Check that the calculated permissions show Allowed; leave Super User access unset.

  3. For article management, open Content → Articles → Options → Permissions. Give the group Access Administration Interface for the Articles component, then only the actions it needs: Create for new articles, Edit for updates, and Edit State for publishing, unpublishing and trashing. Category permissions can restrict these operations further. Configure other components' permissions only if you use their tools.

  4. Open Users → Manage → New, create the dedicated account and assign it to that group. Ensure the account is enabled, activated and not blocked.

  5. Return to System → Plugins, open User - Joomla API Token, and add this user's group to Allowed User Groups, then save. The default commonly allows only Super Users; a newly created account may otherwise have no token tab. Do not clear the group restriction just to make every account eligible.

An explicit Denied permission inherited from another group/category cannot be fixed by allowing it in a child group. Ask your Joomla administrator to check the calculated permissions if access is still denied. Creating an API token does not grant additional permissions.

3. Copy that account's API token

Sign in to Joomla as the account whose token you will use. Open your own profile using the user menu in the top-right of Administrator (Edit Account or Profile, depending on the version), and select Joomla API Token.

  • If Joomla says the account has no token yet, save the profile, then reopen it.

  • Set Active to Yes if that control is shown, and save.

  • Copy the value in Token. This is what you will put in BEARER_TOKEN below.

  • Reset → Yes, followed by saving, replaces the token and invalidates the old one.

You can only view your own token. Editing another user's account as a Super User does not let you copy their token. If the tab is missing, check the token plugin and its allowed groups. See Joomla's token plugin settings and profile controls.

Related MCP server: cms-mcp-hub

Set up the server on your computer

4. Install Git and uv, then download this repository

Use the computer on which your MCP-compatible AI app runs. Install Git if git --version does not work.

Install uv, which will manage Python and this server's dependencies. On macOS/Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh

On Windows, use PowerShell:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Reopen your terminal after installation, then run these commands on either platform:

uv --version
git clone https://github.com/nasoma/joomla-mcp-server.git
cd joomla-mcp-server
uv python install 3.14.8
uv sync --locked

If you already cloned this repository, open that folder instead of cloning again. uv sync creates the local .venv and installs the server. You do not need to activate it.

5. Put your website URL and token in a local .env file

In the repository folder, copy .env.example to .env.

macOS/Linux:

cp .env.example .env

Windows PowerShell:

Copy-Item .env.example .env

Open .env in a text editor and replace these values:

JOOMLA_BASE_URL=https://your-joomla-site.com
BEARER_TOKEN=paste-your-own-joomla-api-token-here
JOOMLA_VERSION=5
JOOMLA_READ_ONLY=true

Set JOOMLA_VERSION=4 if your site uses Joomla 4. Leave the other example settings unchanged for the initial connection. Setting JOOMLA_READ_ONLY=true lets you first confirm access without allowing the assistant to change your website.

Use your site's public HTTPS URL. If Joomla is in a subfolder, include it, for example https://example.com/joomla. Do not append /administrator or /api/index.php/v1. The server adds the API path itself. Your host/firewall must permit access to that API.

Keep .env private. It is ignored by Git; do not share it or replace placeholders in this README with a real token. On macOS/Linux, you can restrict access with chmod 600 .env. The server reads environment variables; uv loads this file only when you pass --env-file.

6. Confirm the server can start

From the repository folder, run:

uv run --locked --env-file .env joomla-mcp

A running server normally waits quietly for an MCP client. It does not open a browser, print an article list or start a web page. Press Ctrl+C to stop this manual run. Starting successfully checks local configuration; the first tool request in step 7 checks access to your Joomla website.

Connect your AI assistant

7. Add the server to Claude Desktop

Install and open Claude Desktop on your computer. These settings go in its local configuration file, not in a chat message or the Claude website's connector URL field. Claude Desktop starts the server for you; you do not need to keep step 6 running.

First, open a terminal inside the cloned joomla-mcp-server folder and find the two paths:

Placeholder in the JSON below

macOS/Linux command

Windows PowerShell command

{{PATH_TO_UV}}

which uv

(Get-Command uv).Source

{{PATH_TO_PROJECT}}

pwd

(Get-Location).Path

Copy each command's output. For example, which uv might return /Users/you/.local/bin/uv, and pwd might return /Users/you/joomla-mcp-server. Use your own output, including the complete path. Do not use ~ or leave placeholders unchanged.

Open the configuration file:

  1. On macOS, choose Claude → Settings… from the menu bar. On Windows, open Settings in the Claude Desktop app.

  2. Select Developer → Edit Config. This opens claude_desktop_config.json.

  3. If the file is empty, paste the complete JSON below. If it already contains mcpServers, add the Joomla Articles MCP entry inside that object and keep your existing servers.

The file lives here if you need to open it manually:

System

Configuration file

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

On macOS, use Finder Go → Go to Folder… to open ~/Library/Application Support/Claude. On Windows, press Win+R, enter %APPDATA%\Claude, and open the file there. See the official Claude Desktop local MCP guide.

{
  "mcpServers": {
    "Joomla Articles MCP": {
      "command": "{{PATH_TO_UV}}",
      "args": [
        "--directory",
        "{{PATH_TO_PROJECT}}",
        "run",
        "--locked",
        "--env-file",
        "{{PATH_TO_PROJECT}}/.env",
        "joomla-mcp"
      ]
    }
  }
}

Replace {{PATH_TO_UV}} with the uv path and replace both occurrences of {{PATH_TO_PROJECT}} with the repository path. Keep /.env on the second occurrence; it points to the file you created in step 5. The JSON must contain no comments.

On Windows, use the full uv.exe path. Use forward slashes, such as C:/Users/you/joomla-mcp-server, or double each backslash in JSON, such as C:\\Users\\you\\joomla-mcp-server. No token needs to be copied into this JSON; uv loads it from your local .env file.

Save the file, fully quit Claude Desktop, then reopen it. In a conversation, open Add files, connectors, and more → Connectors → Manage connectors and check that Joomla Articles MCP is available. Then ask:

Use get_joomla_articles to list the first five articles on my Joomla website. Do not change anything.

Approve the read request if Claude asks. A successful response contains article IDs/titles, or an empty list if the account can see no articles. An empty list is different from an API error.

For another MCP app, put the same command and arguments in its local/stdio server configuration. This server does not provide an HTTP MCP URL for a remote connector.

8. Enable content changes when you are ready

After the read request succeeds, change this line in .env:

JOOMLA_READ_ONLY=false

Restart your AI app so it reloads the configuration. The account's Joomla permissions still control which changes are possible. New articles default to unpublished drafts. Updates need the exact existing title; trash operations also need explicit confirmation. For example:

Show my content categories, then create an unpublished draft called “MCP setup check” in the category I choose.

Optional features can be enabled later: use JOOMLA_ENABLE_USERS=true for filtered user reads, and enable the matching Joomla Web Services plugins for other tool families.

Choosing an article category

create_article and update_article accept either category_id or category_name. For example, “Move article 87 to Blog” can use category_name="Blog"; the server resolves an exact, case-insensitive match to the category ID. It checks all available category pages (up to 1,000 categories), so a match on the first page cannot hide a duplicate on a later page.

If no category is supplied when creating an article, no exact name matches, or several categories share the name, the server makes no change and tells your assistant to ask which category ID to use. Ambiguous results include candidate IDs and parent IDs. Supplying both a name and ID requires them to agree. These clarification messages are shown through your assistant's chat; the server does not open a client-specific popup.

Publishing an existing article keeps its current category. To publish in another category, ask the assistant to move it first, then publish it after the move succeeds.

Setup troubleshooting

What you see

What to check

No Joomla API Token tab or a blank token

Enable User - Joomla API Token, include the account's group in Allowed User Groups, sign in as that account, save and reopen its profile.

HTTP 401

Check API Authentication - Web Services Joomla Token, the copied token and its Active setting. If the token was reset, update .env and restart the client.

HTTP 403

Check the account's Web Services Login permission, group eligibility and the component/category permissions for the requested operation.

HTTP 500

The tool includes Joomla JSON error titles/details when available, with credentials and paths redacted. Read the article before retrying a failed write because it may already have saved. If Joomla only reports an internal server error, ask your host for the matching PHP error-log entry; local MCP stderr only shows the HTTP status.

HTTP 404

Check the site root/subfolder URL and the matching Web Services plugin. The host must route /api/index.php/v1/... to Joomla rather than block it.

Network failure or timeout

Check that your computer can reach the site's HTTPS URL and that the host/firewall permits API requests.

Invalid Joomla response / expected JSON

A login page, hosting error or firewall challenge may have been returned instead of API JSON. Check the API route with your host.

Configuration error about URL/token

Confirm .env contains both values and the client command includes the correct absolute --env-file path.

Server missing from your AI app

Check JSON syntax, absolute paths and uv --version; fully restart the app and inspect its MCP error logs.

Server waits silently in the terminal

This is expected for stdio; connect your AI app as described in step 7.

Writes are disabled

Change JOOMLA_READ_ONLY to false in .env, then restart the app.

Joomla's Web Services guide explains the API and account prerequisites. Never post your token when asking for setup help.

Tools

Area

Tools

Articles

get_joomla_articles, get_joomla_article, create_article, update_article, manage_article_state, move_article_to_trash

Categories

get_joomla_categories, get_joomla_category, create_category, update_category, delete_category

Tags

get_joomla_tags, get_joomla_tag, create_tag, update_tag, delete_tag; article tag assignment through update_article(tags=[IDs])

Fields

get_joomla_fields, get_joomla_field, create_field, update_field, delete_field, get_joomla_field_groups, get_joomla_field_group, create_field_group, update_field_group, delete_field_group, get_article_fields, update_article_fields

Media

get_joomla_media, get_joomla_media_file, upload_media, update_article_images

Site menus

get_joomla_menus, get_joomla_menu, create_menu, update_menu, delete_menu, get_joomla_menu_items, get_joomla_menu_item, create_menu_item, update_menu_item, delete_menu_item

Site modules

get_joomla_modules, get_joomla_module, create_custom_module, update_module, delete_module

Users (opt-in)

get_joomla_users, get_joomla_user; read-only

Tool input schemas contain types, bounds and descriptions. IDs must be positive integers; booleans and numeric strings are rejected. Lists default to 20 rows and allow at most 100. For articles, use search/category_id/state/tag_id filters and follow pagination.next_offset. Article list content is omitted by default; request include_content=true or detail lookup. Media directories are byte-bounded and sliced locally because Joomla does not paginate them.

Success results are structured objects with ok: true, normalized data, and optional pagination, updated_fields or changed. Resource IDs in results are strings; supply IDs as integers when calling a tool. Errors are MCP tool errors (is_error=true), with safe, bounded messages. API bodies, credentials and raw network exceptions are not returned.

Configuration

Variable

Default

Meaning

JOOMLA_BASE_URL, BEARER_TOKEN

Required

HTTPS site root and secret token

JOOMLA_VERSION

5

Supported major version, 4 or 5; tools use their common API contract

JOOMLA_READ_ONLY

false

Reject mutations

JOOMLA_ALLOW_TRUSTED_HTML

false

Permit explicitly selected trusted HTML

JOOMLA_ENABLE_USERS

false

Register filtered user read tools

JOOMLA_ALLOW_LOCAL_HTTP

false

Loopback development exception

JOOMLA_TIMEOUT

20

Per-request timeout, seconds (maximum 120)

JOOMLA_READ_RETRIES

2

Extra safe-read attempts (0–3); writes never retry

JOOMLA_MAX_RESPONSE_BYTES

2000000

Maximum decoded API response bytes

JOOMLA_MAX_UPLOAD_BYTES

5000000

Maximum decoded image upload bytes

Boolean values accept true/false or 1/0. Redirects and proxy environment lookup are disabled. Read Retry-After values over five seconds return a failure so the caller can reschedule.

License

MIT; see LICENSE.

Available Tools

6 tools
create_articleC

Create a new article on the Joomla website.

ParametersJSON Schema
NameRequiredDescriptionDefault
article_textYes
titleNo
category_idNo
convert_plain_textNo
publishedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 the tool creates an article but fails to mention critical aspects like whether this is a write operation (implied but not explicit), what permissions are needed, how errors are handled, or the effect of default parameters like 'published: true'. This leaves significant gaps in understanding the tool's 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 a single, direct sentence with no wasted words, making it highly concise and front-loaded. It efficiently communicates the core action without unnecessary elaboration, which is appropriate for a basic tool 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?

Given the tool has 5 parameters with 0% schema coverage, no annotations, and an output schema (which reduces the need to describe return values), the description is incomplete. It covers the basic purpose but misses parameter explanations, usage context, and behavioral details, making it minimally adequate but with clear gaps for a creation tool in a CMS environment.

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

Parameters2/5

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

Schema description coverage is 0%, meaning parameter titles provide minimal semantic context. The description adds no information about parameters beyond the tool's name, such as explaining what 'convert_plain_text' does, how 'category_id' relates to existing categories, or the implications of 'published'. This fails to compensate for the low schema coverage, leaving parameters largely unexplained.

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 ('new article on the Joomla website'), making the purpose immediately understandable. However, it doesn't distinguish this tool from its sibling 'update_article' beyond the basic create vs. update difference, missing an opportunity to clarify scope or uniqueness.

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 'update_article' or 'manage_article_state'. It also lacks information about prerequisites, such as whether the category must exist or if authentication is required, leaving the agent without context for decision-making.

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

get_joomla_articlesB

Retrieve all articles from the Joomla website.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 full burden for behavioral disclosure. It states 'retrieve all articles' but doesn't specify whether this returns all articles at once or uses pagination, what authentication is required, rate limits, or what happens with large datasets. For a read operation with zero annotation coverage, this leaves significant behavioral questions unanswered.

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

Conciseness5/5

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

The description is a single, efficient sentence that directly states what the tool does without any wasted words. It's appropriately sized for a simple retrieval tool and front-loads the essential information.

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 zero parameters, 100% schema coverage, and an output schema exists, the description's job is simplified. However, for a retrieval operation with no annotations, it should ideally mention something about the return format or data scope. The current description is minimally adequate but could provide more context about what 'all articles' entails.

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 tool has zero parameters with 100% schema description coverage, so the schema already fully documents the parameter situation. The description appropriately doesn't discuss parameters since none exist, maintaining focus on the tool's purpose without unnecessary detail.

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

Purpose4/5

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

The description clearly states the action ('retrieve') and resource ('all articles from the Joomla website'), making the tool's purpose immediately understandable. It doesn't explicitly differentiate from siblings like 'get_joomla_categories', but the resource specificity provides adequate distinction for a read operation.

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_joomla_categories' or 'create_article'. It doesn't mention prerequisites, limitations, or appropriate contexts for selecting this retrieval method over other options.

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

get_joomla_categoriesB

Retrieve all categories from the Joomla website.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 action ('retrieve') but doesn't mention any behavioral traits like whether it's read-only, if it requires authentication, rate limits, or what the output format is. This leaves significant gaps for a tool that interacts with a website.

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

Conciseness5/5

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

The description is a single, efficient sentence that directly states the tool's purpose without any wasted words. It is appropriately sized and front-loaded, making it easy to understand at a glance.

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 0 parameters, 100% schema coverage, and an output schema exists, the description is minimally adequate. However, it lacks behavioral context (e.g., authentication needs, rate limits) and doesn't explain when to use it relative to siblings, which are gaps considering the complexity of interacting with a Joomla website.

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 tool has 0 parameters, and the schema description coverage is 100%, so there are no parameters to document. The description doesn't need to add parameter semantics, and it appropriately avoids unnecessary details, earning a baseline score of 4 for this context.

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 ('retrieve') and resource ('all categories from the Joomla website'), making the purpose unambiguous. However, it doesn't explicitly differentiate from sibling tools like 'get_joomla_articles', which retrieves articles rather than categories, though this distinction is implied by the resource name.

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, such as whether it should be used for listing categories before creating articles or how it relates to sibling tools like 'get_joomla_articles'. It lacks explicit context or exclusions, leaving usage unclear beyond the basic purpose.

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

manage_article_stateC

Manage the state of an existing article on the Joomla website (published, unpublished, archived, trashed)

ParametersJSON Schema
NameRequiredDescriptionDefault
article_idYes
target_stateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/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 full burden. It implies a mutation operation ('manage the state') but doesn't disclose behavioral traits such as required permissions, whether changes are reversible, rate limits, or what happens to the article in each state. The description is minimal and lacks critical context for safe usage.

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

Conciseness4/5

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

The description is a single, efficient sentence that front-loads the purpose. It avoids unnecessary words, though it could be more structured (e.g., separating usage notes). Every part earns its place by specifying the action and states.

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 complexity (state mutation tool), no annotations, and an output schema (which reduces need to explain returns), the description is incomplete. It covers the basic purpose but lacks usage guidelines, parameter details, and behavioral transparency, making it minimally adequate but with clear gaps for a mutation tool.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It mentions 'target_state' with examples (published, unpublished, archived, trashed) but doesn't explain the mapping to integer values or provide details on 'article_id' (e.g., format, sourcing). This adds some meaning but is insufficient for the two undocumented parameters.

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 ('manage') and resource ('existing article on the Joomla website') with specific states listed (published, unpublished, archived, trashed). It distinguishes from siblings like 'create_article' (creation vs. state management) and 'move_article_to_trash' (specific state vs. general management), though it doesn't explicitly name alternatives.

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 'move_article_to_trash' or 'update_article'. It mentions managing states but doesn't clarify prerequisites (e.g., article must exist) or exclusions (e.g., not for new articles).

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

move_article_to_trashA

Delete an article by moving to the trashed state on the Joomla website, allowing recovery.

ParametersJSON Schema
NameRequiredDescriptionDefault
article_idYes
expected_titleNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/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 of behavioral disclosure. It effectively describes the action as moving to a trashed state with recovery, which clarifies it's a soft delete. However, it lacks details on permissions, side effects, or error handling, leaving gaps in behavioral understanding.

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

Conciseness5/5

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

The description is a single, efficient sentence that front-loads the key action and includes essential context ('allowing recovery') without any wasted words, making it highly concise and well-structured.

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

Completeness4/5

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

Given the tool's complexity (soft deletion with 2 parameters) and the presence of an output schema (which handles return values), the description is mostly complete. It covers the core purpose and behavioral trait (recovery), but lacks parameter explanations and detailed usage guidelines, slightly reducing completeness.

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?

Schema description coverage is 0%, so the description must compensate for undocumented parameters. It doesn't mention any parameters, failing to explain 'article_id' or 'expected_title' beyond what the schema provides. Baseline is 3 due to the schema doing the heavy lifting, but no additional semantic value is added.

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 ('Delete an article by moving to the trashed state') and resource ('on the Joomla website'), distinguishing it from siblings like 'create_article' or 'update_article' by focusing on deletion with recovery capability.

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 implies usage context by mentioning 'allowing recovery,' which suggests this is for soft deletion rather than permanent removal. However, it doesn't explicitly state when to use this versus alternatives like 'manage_article_state' or other deletion methods, leaving some ambiguity.

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

update_articleC

Update an existing article on the Joomla website.

ParametersJSON Schema
NameRequiredDescriptionDefault
article_idYes
titleNo
introtextNo
fulltextNo
metadescNo
convert_plain_textNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/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 but only states it's an update operation without disclosing behavioral traits. It doesn't mention authentication needs, rate limits, whether changes are reversible, what happens to unspecified fields, or the response format. This is inadequate 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.

Conciseness5/5

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

The description is a single, clear sentence with no wasted words. It's front-loaded with the core purpose, making it efficient and easy to parse, though this conciseness comes at the cost of detail in other dimensions.

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 complexity (6 parameters, mutation operation, no annotations) and the presence of an output schema, the description is incomplete. It doesn't compensate for the lack of annotations or low schema coverage, failing to provide necessary context for safe and effective use, despite the output schema potentially covering return values.

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

Parameters1/5

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

The description adds no meaning beyond what the input schema provides. With 0% schema description coverage and 6 parameters (including complex ones like 'introtext' and 'convert_plain_text'), the description fails to explain what these parameters do, their formats, or how they affect the update. This leaves parameters largely undocumented.

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

Purpose4/5

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

The description clearly states the action ('Update') and resource ('an existing article on the Joomla website'), making the purpose immediately understandable. However, it doesn't distinguish this tool from its sibling 'manage_article_state' which might also modify articles, nor does it specify what aspects of an article can be updated beyond the general concept.

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 'manage_article_state' for state changes or 'create_article' for new articles. It mentions 'existing article' which implies a prerequisite of article existence but doesn't explicitly state this or reference sibling tools for checking or creating articles.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv1.0.0
    • Changedcreate_article1 field changed
      • addedInput schema / title
        Added value: +"create_articleArguments"
    • Changedget_joomla_articles1 field changed
      • addedInput schema / title
        Added value: +"get_joomla_articlesArguments"
    • Changedget_joomla_categories1 field changed
      • addedInput schema / title
        Added value: +"get_joomla_categoriesArguments"
    • Changedmanage_article_state1 field changed
      • addedInput schema / title
        Added value: +"manage_article_stateArguments"
    • Changedmove_article_to_trash1 field changed
      • addedInput schema / title
        Added value: +"move_article_to_trashArguments"
    • Changedupdate_article1 field changed
      • addedInput schema / title
        Added value: +"update_articleArguments"
  2. 6 tool updates
    • First observedcreate_article
    • First observedget_joomla_articles
    • First observedget_joomla_categories
    • First observedmanage_article_state
    • First observedmove_article_to_trash
    • First observedupdate_article

TDQS

B3.2/5.0

Scored across 6 tools

Disambiguation4/5

Most tools have distinct purposes, but there is some overlap between 'manage_article_state' and 'move_article_to_trash' since moving to trash is a specific state change. The descriptions clarify this, but an agent might initially confuse them as both handle article states. Other tools like create, get, and update are clearly differentiated.

Naming Consistency3/5

The naming is mixed: some tools use verb_noun (e.g., create_article, update_article), while others include 'joomla' prefix (e.g., get_joomla_articles, get_joomla_categories) and one uses a different verb style (manage_article_state). This inconsistency reduces predictability, though the names remain readable and understandable.

Tool Count5/5

With 6 tools, the count is well-scoped for managing articles and categories in a Joomla context. Each tool serves a specific function, and there are no extraneous tools, making it appropriate for the server's purpose without being overwhelming or insufficient.

Completeness4/5

The tool set covers core CRUD operations for articles (create, get, update, delete via trash) and includes category retrieval, which is essential for Joomla content management. A minor gap exists in lacking direct category management tools (e.g., create or update categories), but agents can still perform basic workflows with the provided tools.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A comprehensive MCP server for WordPress automation that enables users to manage content, themes, and site configurations using AI-driven workflows and the WordPress REST API. It provides a wide array of tools for site planning, management, and optimization compatible with tools like Cursor and Claude.
    67 npm
    1
    ISC
  • F
    license
    Not graded
    quality
    D
    maintenance
    A universal connector hub that proxies Claude.ai tool calls to any CMS that runs an MCP server, enabling natural language interactions with Drupal, Joomla, WordPress, and more through a single endpoint.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for WordPress content management that provides a secure interface for AI assistants to interact with WordPress sites, enabling content creation, editing, and media management without destructive operations.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for WordPress content management via REST API, supporting posts, pages, media, comments, and terms through natural language interfaces like Cursor, ChatGPT, Codex, and Claude.
    16 npm
    MIT