Skip to main content
Glama
stevereiner
by stevereiner

Python Alfresco MCP Server v1.2 ๐Ÿš€

PyPI version PyPI downloads Python Version License

Model Context Protocol Server for Alfresco Content Services

A full featured MCP server for Alfresco in search and content management areas. It provides the following tools: full text search (content and properties), advanced search, metadata search, CMIS SQL like search, upload, download, checkin, checkout, cancel checkout, create folder, folder browse, delete node, and get/set properties. Also has a tool for getting repository status/config (also a resource). Has one prompt example. Built with FastMCP 3. Features complete documentation, examples, and config for various MCP clients (Claude Desktop, MCP Inspector, references to configuring others).

๐ŸŒŸ What's New in v1.2

  • Alfresco authentication methods: connect via basic, ticket, or OAuth2/OIDC (ALFRESCO_AUTH_METHOD + ALFRESCO_OAUTH2_*, backed by python-alfresco-api 1.2.1) โ€” see Authentication.

  • Optional MCP transport authentication: secure the MCP server itself with an OAuth2 bearer token (MCP_TRANSPORT_AUTH=true), validated against your IdP's JWKS (HTTP/SSE transports; stdio unaffected).

  • FastMCP 3: upgraded to fastmcp>=3.4.5,<4 (transport auth uses JWTVerifier).

  • download_document custom folder: optional destination_dir (default ~/Downloads) โ€” thanks @jeremie-lesage (#1).

  • Packaging: switched to the hatchling build backend.

  • Requires python-alfresco-api โ‰ฅ 1.2.1 (OAuth2/OIDC auth + OAuth2 service-account displayName fix).

Related MCP server: Confluence MCP

๐ŸŒŸ What's New in v1.1

Modular Architecture & Enhanced Testing

  • FastMCP: v1.0 had FastMCP 2.0 implementation that had all tools implementations in the fastmcp_server.py file

  • Code Modularization in v1.1: Split monolithic single file into organized modular structure with separate files

  • Directory Organization: Organized into tools/search/, tools/core/, resources/, prompts/, utils/ directories

  • Enhanced Testing: Complete test suite transformation - 143 tests with 100% pass rate

  • Client Configuration Files: Added dedicated Claude Desktop and MCP Inspector configuration files

  • Live Integration Testing: 21 Alfresco server validation tests for real-world functionality

  • Python-Alfresco-API: python-alfresco-mcp-server v1.2.0 requires python-alfresco-api >= 1.2.1

๐Ÿ“š Complete Documentation

Documentation & Examples

  • ๐Ÿ“š Complete Documentation: 10 guides covering setup to deployment

  • ๐Ÿ’ก Examples: 6 practical examples from quick start to implementation patterns

  • ๐Ÿ”ง Configuration Management: Environment variables, .env files, and command-line configuration

  • **๐Ÿ—๏ธ Setup instruction for use with MCP client

Learning Resources

๐Ÿ“– Guides covering setup, deployment, and usage:

๐Ÿš€ Features

Content Management and Search Tools

  • Search Tools:

    • Full Text Search: Basic content search with wildcard support (search_content)

    • Advanced Search: AFTS query language with date filters, sorting, and field targeting

    • Metadata Search: Property-based queries with operators (equals, contains, date ranges)

    • CMIS Search: SQL like queries for complex content discovery

  • Document Lifecycle: Upload, download, check-in, checkout, cancel checkout

  • Version Management: Create major/minor versions with comments

  • Folder Operations: Create folders, delete folder nodes

  • Property Management: Get and set document/folder properties and names

  • Node Operations: Delete nodes (documents and folders) (trash or permanent)

  • Repository Info: (Tool and Resource) Returns repository status, version and whether Community or Enterprise, and module configuration

MCP Architecture

  • FastMCP 3 Framework: Modern, high-performance MCP server implementation

  • Multiple Transports:

    • STDIO (direct MCP protocol) - Default and fastest

    • HTTP (RESTful API) - Web services and testing

    • SSE (Server-Sent Events) - Real-time streaming updates

  • Authentication: Basic, ticket, or OAuth2/OIDC to Alfresco, plus optional OAuth2 bearer to secure the MCP transport itself โ€” see Authentication

  • Type Safety: Full Pydantic v2 models

  • In-Memory Testing: Client testing with faster execution

  • Configuration: Environment variables, .env files

Alfresco Integration

Works with Alfresco Community (tested) and Enterprise editions

๐Ÿ“‹ Requirements

  • Python 3.10+

  • Alfresco Content Services (Community or Enterprise)

Note: The python-alfresco-api >= 1.2.1 dependency is automatically installed with python-alfresco-mcp-server

๐Ÿ› ๏ธ Installation

Install Python

You need to have Python 3.10+ installed for the sections below. If not, download the latest 3.13.x version from:

Python.org Downloads

UV is a modern Python package manager written in Rust that provides both uv (package manager) and uvx (tool runner). Much faster than pip due to its compiled nature and optimized dependency resolution.

# Install UV (provides both uv and uvx commands)
# Windows
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

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

# Or via pip if you prefer
pip install uv

# Verify installation (both commands should work)
uv --version
uvx --version

UV Reference Links:

UVX is UV's tool runner - similar to pipx but faster and more modern. Automatically handles isolation and global availability:

# Install python-alfresco-mcp-server with uvx (after UV/UVX setup above)
uvx python-alfresco-mcp-server --help

# This tests that installation worked - UVX automatically installs packages on first use!

Why UVX? UVX combines the benefits of pipx (isolated environments + global availability) with UV's Rust-based speed and modern dependency resolution. It automatically installs packages on first use.

UV is a modern Python package manager written in Rust that handles everything automatically. Much faster than pip due to its compiled nature and optimized dependency resolution.

# Install and run from PyPI (fastest for users)
uv tool install python-alfresco-mcp-server
uv tool run python-alfresco-mcp-server --help  # Tests that installation worked

# Or install from source (for development)
git clone https://github.com/stevereiner/python-alfresco-mcp-server.git
cd python-alfresco-mcp-server
uv run python-alfresco-mcp-server --help  # Tests that installation worked

Option C: Traditional Methods (pip and pipx)

For traditional Python package management approaches, see the Installation with pip and pipx.

Note: You still need to configure your MCP client (Claude Desktop, MCP Inspector, etc.) with the appropriate configuration. See the MCP Client Setup and Use section below for client configuration details.

Source Installation (For Development)

For development or access to latest features:

# 1. Clone the repository
git clone https://github.com/stevereiner/python-alfresco-mcp-server.git
cd python-alfresco-mcp-server

# 2. UV handles everything automatically - run immediately!
uv run python-alfresco-mcp-server --help  # Tests that installation worked

# Or install dependencies explicitly for development:
uv sync                    # Basic dependencies
uv sync --extra dev        # With development tools  
uv sync --extra test       # With testing tools
uv sync --extra all        # Everything

# Or an editable install into the active virtual environment (pip-style):
uv pip install -e .

4. Configure Alfresco Connection

The examples below use HTTP Basic auth. Alfresco also supports ticket and OAuth2/OIDC (ALFRESCO_AUTH_METHOD + ALFRESCO_OAUTH2_*), and you can optionally secure the MCP transport with an OAuth2 bearer (MCP_TRANSPORT_AUTH) โ€” see the Authentication section for all methods.

Option 1: Environment Variables

# Linux/Mac
export ALFRESCO_URL="http://localhost:8080"
export ALFRESCO_USERNAME="admin"
export ALFRESCO_PASSWORD="admin"
export ALFRESCO_VERIFY_SSL="false"

# Windows PowerShell
$env:ALFRESCO_URL="http://localhost:8080"
$env:ALFRESCO_USERNAME="admin"
$env:ALFRESCO_PASSWORD="admin"
$env:ALFRESCO_VERIFY_SSL="false"

# Windows Command Prompt
set ALFRESCO_URL=http://localhost:8080
set ALFRESCO_USERNAME=admin
set ALFRESCO_PASSWORD=admin
set ALFRESCO_VERIFY_SSL=false

Option 2: .env file (recommended - cross-platform):

# Copy sample-dot-env.txt to .env and customize
# Linux/macOS
cp sample-dot-env.txt .env

# Windows
copy sample-dot-env.txt .env

# Edit .env file with your settings
ALFRESCO_URL=http://localhost:8080
ALFRESCO_USERNAME=admin
ALFRESCO_PASSWORD=admin
ALFRESCO_VERIFY_SSL=false

Note: The .env file is not checked into git for security. Use sample-dot-env.txt as a template.

๐Ÿ“– See Configuration Guide for complete setup options

Alfresco Installation

If you don't have an Alfresco server installed you can get a docker for the Community version from Github

git clone https://github.com/Alfresco/acs-deployment.git

Move to Docker Compose directory

cd acs-deployment/docker-compose

Edit community-compose.yaml

  • Note: you will likely need to comment out activemq ports other than 8161

   ports:
   - "8161:8161" # Web Console
   #- "5672:5672" # AMQP
   #- "61616:61616" # OpenWire
   #- "61613:61613" # STOMP

Start Alfresco with Docker Compose

docker-compose -f community-compose.yaml up

๐Ÿš€ Usage

MCP Server Startup

With UVX (Recommended - Automatic isolation and global availability):

# Run MCP server with STDIO transport (default)
uvx python-alfresco-mcp-server

# HTTP transport for web services (matches MCP Inspector)
uvx python-alfresco-mcp-server --transport http --host 127.0.0.1 --port 8003

# SSE transport for real-time streaming  
uvx python-alfresco-mcp-server --transport sse --host 127.0.0.1 --port 8001

With UV (For development or source installations):

# Run MCP server with STDIO transport (default)
uv run python-alfresco-mcp-server

# HTTP transport for web services (matches MCP Inspector)
uv run python-alfresco-mcp-server --transport http --host 127.0.0.1 --port 8003

# SSE transport for real-time streaming  
uv run python-alfresco-mcp-server --transport sse --host 127.0.0.1 --port 8001

With Traditional Methods (pip/pipx):

See the Installation with pip and pipx for pip and pipx usage instructions.

MCP Client Setup and Use

Python-Alfresco-MCP-Server was tested with Claude Desktop which is recommended as an end user MCP client. Python-Alfresco-MCP-Server was also tested with MCP Inspector which is recommended for developers to test tools with argument values.

๐Ÿค– Claude Desktop for Windows (tested) and MacOS (not tested)

๐Ÿ“– Complete Setup Guide: Claude Desktop Setup Guide

๐Ÿ“ฅ Download Claude Desktop (Free and Pro versions):

  • Download Claude Desktop - Official Anthropic download page

  • Available for Windows and macOS only (no Linux version)

  • Free tier includes full MCP support and Claude Sonnet 4 access with limits, older Claude models (Claude Opus 4 only in Pro)

๐Ÿ”ง Claude Desktop Configuration by Installation Method:

The Claude Desktop configuration differs based on how you installed the MCP server:

1. UVX (Recommended - Modern tool runner):

{
  "command": "uvx",
  "args": ["python-alfresco-mcp-server", "--transport", "stdio"]
}

2. UV (Development or source installations):

{
  "command": "uv",
  "args": ["run", "python-alfresco-mcp-server", "--transport", "stdio"],
  "cwd": "C:\\path\\to\\python-alfresco-mcp-server"
}

3. Traditional Methods (pipx/pip):

For traditional installation methods, see the Installation with pip and pipx which covers:

๐Ÿ” Tool-by-Tool Permission System: Claude Desktop will prompt you individually for each tool on first use. Since this MCP server has 15 tools, you may see up to 15 permission prompts if you use all features. For each tool, you can choose:

  • "Allow once" - Approve this single tool use only

  • "Always allow" - Approve all future uses of this specific tool automatically (recommended for regular use)

This tool-by-tool security feature ensures you maintain granular control over which external tools can be executed.

๐Ÿ›ก๏ธ Virus Scanner Note: If you have virus checkers like Norton 360, don't worry if you get a "checking" message once for pip, pipx, uv, uvx, or python-alfresco-mcp-server.exe - this is normal security scanning behavior.

Using the Tools:

  • Chat naturally about what you want to do with documents and search

  • Mention "Alfresco" to ensure the MCP server is used (e.g., "In Alfresco...")

  • Use tool-related keywords - mention something close to the tool name

  • Follow-up prompts will know the document from previous context

Example 1: Document Management

  1. Upload a simple text document: "Please create a file called 'claude_test_doc-25 07 25 101 0 AM.txt' in the repository shared folder with this content: 'This is a test document created by Claude via MCP.' description 'Test document uploaded via Claude MCP'"

  2. Update properties: "Set the description property of this document to 'my desc'"

  3. Check out the document

  4. Cancel checkout

  5. Check out again

  6. Check in as a major version

  7. Download the document

  8. Upload a second document from "C:\1 sample files\cmispress.pdf"

Note: Claude will figure out to use base64 encoding for the first upload on a second try

Example 2: Search Operations

"With Alfresco please test all 3 search methods and CMIS query:"

  • Basic search for "txt" documents, return max 10

  • Advanced search for documents created after 2024-01-01, return max 25

  • Metadata search for documents where cm:title contains "test", limit to 50

  • CMIS search to find all txt documents, limit to 50

More Examples: Create Folder, Browse Folders, Get Repository Info

  • "Create a folder called '25 07 25 01 18 am' in shared folder"

  • "List docs and folders in shared folder" (will use -shared-)

  • "Can you show me what's in my Alfresco home directory?" (will use browse_repository -my-)

  • "Get info on Alfresco" (will use repository_info tool)

Chat Box Buttons

  • Use Search and tools button (two horizontal lines with circles icon) in the chat box and choose "python-alfresco-mcp-server" - this allows you to enable/disable all tools or individual tools

  • Click the + Button โ†’ "Add from alfresco" for quick access to resources and prompts

Search and Analyze Prompt:

  • Provides a form with query field for full-text search

  • Analysis types: summary, detailed, trends, or compliance

  • Generates template text to copy/paste into chat for editing

Repository Info Resource (and Tool):

  • Provides status information in text format for viewing or copying

Examples:

๐Ÿ” MCP Inspector (Development/Testing)

๐Ÿ“– Setup Guide: Complete MCP Inspector setup and connection instructions in MCP Inspector Setup Guide

๐Ÿ“ฅ Install MCP Inspector:

  • Prerequisites: Requires Node.js 18+ - Download from nodejs.org

  • Install Command: npm install -g @modelcontextprotocol/inspector

  • Or run directly: npx @modelcontextprotocol/inspector (no global install needed)

  • Purpose: Web-based tool for testing MCP servers and individual tools with custom parameters

Working Method (Recommended):

1. Start MCP Server with HTTP transport:

# With UVX (recommended)
uvx python-alfresco-mcp-server --transport http --port 8003

# With UV (development)
uv run python-alfresco-mcp-server --transport http --port 8003

# Traditional methods - see Traditional Installation Guide

2. Start MCP Inspector with config:

UVX Installation (Recommended) โ€” configs in mcp-inspector-configs/:

# Start with stdio transport
npx @modelcontextprotocol/inspector --config mcp-inspector-configs/mcp-inspector-stdio-uvx-config.json --server python-alfresco-mcp-server

# Start with http transport  
npx @modelcontextprotocol/inspector --config mcp-inspector-configs/mcp-inspector-http-uvx-config.json --server python-alfresco-mcp-server

UV Installation (Development):

# From project directory
npx @modelcontextprotocol/inspector --config mcp-inspector-configs/mcp-inspector-stdio-uv-config.json --server python-alfresco-mcp-server  # stdio transport
npx @modelcontextprotocol/inspector --config mcp-inspector-configs/mcp-inspector-http-uv-config.json --server python-alfresco-mcp-server   # http transport

Traditional Methods (pipx/pip):

See the Installation with pip and pipx for pipx and pip configuration options.

3. Open browser with pre-filled token:

  • Use the URL provided in the output (includes authentication token)

  • Example: http://localhost:6274/?MCP_PROXY_AUTH_TOKEN=<token>

  • This step applies to all installation methods (uv, uvx, pip, pipx)

This approach avoids proxy connection errors and provides direct authentication.

๐Ÿ”ง Other MCP Clients

For Cursor, Claude Code, and other MCP clients:

๐Ÿ“– Complete Setup Guide: Client Configuration Guide

๐Ÿ› ๏ธ Available Tools (15 Total)

๐Ÿ” Search Tools (4)

Tool

Description

Parameters

search_content

Search documents and folders

query (str), max_results (int), node_type (str)

advanced_search

Advanced search with filters

query (str), content_type (str), created_after (str), etc.

search_by_metadata

Search by metadata properties

property_name (str), property_value (str), comparison (str)

cmis_search

CMIS SQL queries

cmis_query (str), preset (str), max_results (int)

๐Ÿ› ๏ธ Core Tools (11)

Tool

Description

Parameters

browse_repository

Browse repository folders

node_id (str)

repository_info

Get repository information

None

upload_document

Upload new document

filename (str), content_base64 (str), parent_id (str), description (str)

download_document

Download document content

node_id (str), save_to_disk (bool), attachment (bool), destination_dir (str, optional)

create_folder

Create new folder

folder_name (str), parent_id (str), description (str)

get_node_properties

Get node metadata

node_id (str)

update_node_properties

Update node metadata

node_id (str), name (str), title (str), description (str), author (str)

delete_node

Delete document/folder

node_id (str), permanent (bool)

checkout_document

Check out for editing

node_id (str), download_for_editing (bool)

checkin_document

Check in after editing

node_id (str), comment (str), major_version (bool), file_path (str)

cancel_checkout

Cancel checkout/unlock

node_id (str)

๐Ÿ“– See API Reference for detailed tool documentation

๐Ÿ“Š Available Resources

Repository Information

Resource

Description

Access Method

repository_info

Get comprehensive repository information including version, edition, license details, installed modules, and system status

Available as both MCP resource and tool

The repository_info resource provides:

  • Repository Details: ID, edition (Community/Enterprise), version information

  • License Information: Issued/expires dates, remaining days, license holder, entitlements

  • System Status: Read-only mode, audit enabled, quick share, thumbnail generation

  • Installed Modules: Up to 10 modules with ID, title, version, and installation state

๐Ÿ“– See API Reference for detailed resource documentation

๐ŸŽฏ Available Prompts

Search and Analyze Prompt

Prompt

Description

Parameters

search_and_analyze

Interactive form for guided content search and analysis

query (search terms), analysis_type (summary/detailed/trends/compliance)

The Search and Analyze Prompt provides:

  • Interactive Form: User-friendly interface with query input field

  • Analysis Options: Choose from summary, detailed analysis, trends, or compliance reporting

  • Template Generation: Creates copyable template text for chat conversations

  • Query Assistance: Helps users structure effective search queries

  • Multiple Search Types: Integrates with all 4 search tools (content, advanced, metadata, CMIS)

๐Ÿ“– See API Reference for detailed prompt documentation

๐Ÿ” Authentication

Set ALFRESCO_AUTH_METHOD to one of basic (default), ticket, or oauth2. All three are handled by the python-alfresco-api auth utilities and passed to ClientFactory.

Basic โ€” HTTP Basic with username/password (simplest; fine for local/testing over HTTPS):

ALFRESCO_AUTH_METHOD=basic
ALFRESCO_USERNAME=admin
ALFRESCO_PASSWORD=admin

Ticket โ€” logs in once to /authentication/versions/1/tickets, then sends the ticket as Authorization: Basic base64(<ticket>) so the password isn't transmitted on every request (the ticket can expire/be revoked):

ALFRESCO_AUTH_METHOD=ticket
ALFRESCO_USERNAME=admin
ALFRESCO_PASSWORD=admin

OAuth2 (Bearer / OIDC) โ€” presents a Bearer token to Alfresco's REST API. Requires Alfresco's built-in identity-service subsystem configured against an OIDC IdP (e.g. Keycloak / Alfresco Identity Service). Alfresco Community 23.2+ ships this subsystem โ€” it's config-only in alfresco-global.properties (no Acosix/AMP needed). Two modes:

client_credentials (service account โ€” the MCP server fetches + refreshes the token):

ALFRESCO_AUTH_METHOD=oauth2
ALFRESCO_OAUTH2_CLIENT_ID=<client-id>
ALFRESCO_OAUTH2_CLIENT_SECRET=<client-secret>
ALFRESCO_OAUTH2_TOKEN_ENDPOINT=https://<keycloak>/realms/<realm>/protocol/openid-connect/token
ALFRESCO_OAUTH2_GRANT_TYPE=client_credentials

pre-obtained token (e.g. a specific user's token โ€” content access follows that user's ACLs):

ALFRESCO_AUTH_METHOD=oauth2
ALFRESCO_OAUTH2_CLIENT_ID=<client-id>
ALFRESCO_OAUTH2_ACCESS_TOKEN=<access-token>
ALFRESCO_OAUTH2_REFRESH_TOKEN=<refresh-token>   # optional; enables auto-refresh

โš ๏ธ Prefer a user token for content operations. client_credentials authenticates as the Keycloak service account (e.g. service-account-<client-id>) โ€” a JIT Alfresco user with no display name and only default ACLs. Alfresco then returns createdByUser/modifiedByUser without the (spec-required) displayName, which can break clients that parse node responses. For real content work, use the pre-obtained token mode above with a user's token โ€” obtain one with a password grant and paste it into ALFRESCO_OAUTH2_ACCESS_TOKEN/ALFRESCO_OAUTH2_REFRESH_TOKEN:

curl -X POST <token-endpoint> \
  -d grant_type=password -d client_id=<id> -d client_secret=<secret> \
  -d username=admin -d password=admin

That way responses carry the real display name and the user's actual permissions. (As of python-alfresco-api โ‰ฅ 1.2.x the client also defaults a missing displayName to the user id, so the service-account path no longer crashes โ€” but a user token still gives correct names and ACLs.)

Note: this is data-source auth (how the MCP server authenticates to Alfresco), separate from securing the MCP transport itself. On the Alfresco side, configure identity-service (see the Alfresco docs for identity-service.auth-server-url / .realm / .resource / .credentials.secret); client_credentials authenticates as the service account, while a user's token scopes to that user.

Securing the MCP transport (OAuth2 bearer)

Separately from data-source auth, you can require callers of the MCP server to present an OAuth2 bearer token. This uses FastMCP's JWT verifier and applies to the HTTP/SSE transports only (stdio ignores it). Set MCP_TRANSPORT_AUTH=true; RS256 tokens are validated against your OIDC IdP's JWKS, so only genuine IdP-signed tokens are accepted:

MCP_TRANSPORT_AUTH=true
MCP_AUTH_JWKS_URI=http://host.docker.internal:8091/realms/alfresco/protocol/openid-connect/certs
# MCP_AUTH_ISSUER=https://<your-idp>/realms/<realm>   # optional; the MCP SDK requires HTTPS here
# MCP_AUTH_AUDIENCE=<aud>                              # optional

Run it and the endpoint rejects unauthenticated calls:

MCP_TRANSPORT_AUTH=true python -m alfresco_mcp_server.fastmcp_server --transport http --port 8009
# no token           -> 401
# Authorization: Bearer <valid-keycloak-token>  -> 200

MCP Inspector: run the HTTP inspector config, set the server URL to http://localhost:8009/mcp/, and add an Authorization: Bearer <token> header (obtain the token out-of-band from your IdP โ€” e.g. curl -X POST .../token -d grant_type=client_credentials -d client_id=... -d client_secret=...). Clients must acquire the token themselves; FastMCP validates it but does not issue tokens.

The MCP SDK requires the issuer URL to be HTTPS (localhost excepted). With a local http Keycloak, leave MCP_AUTH_ISSUER unset โ€” the JWKS signature check still gates access; add a strict issuer in production behind HTTPS.

๐Ÿ”ง Configuration Options

Environment Variable

Default

Description

ALFRESCO_URL

http://localhost:8080

Alfresco server URL

ALFRESCO_AUTH_METHOD

basic

Auth method: basic | ticket | oauth2 (see Authentication)

ALFRESCO_USERNAME

admin

Username (basic/ticket)

ALFRESCO_PASSWORD

admin

Password (basic/ticket)

ALFRESCO_OAUTH2_CLIENT_ID

โ€“

OAuth2 client id (oauth2)

ALFRESCO_OAUTH2_CLIENT_SECRET

โ€“

OAuth2 client secret (oauth2)

ALFRESCO_OAUTH2_TOKEN_ENDPOINT

โ€“

OAuth2 token endpoint (oauth2)

ALFRESCO_OAUTH2_GRANT_TYPE

client_credentials

client_credentials | refresh_token

ALFRESCO_OAUTH2_ACCESS_TOKEN

โ€“

Pre-obtained access token (optional, oauth2)

ALFRESCO_OAUTH2_REFRESH_TOKEN

โ€“

Refresh token (optional, oauth2)

ALFRESCO_VERIFY_SSL

false

Verify SSL certificates

ALFRESCO_TIMEOUT

30

Request timeout (seconds)

FASTAPI_HOST

localhost

FastAPI host

FASTAPI_PORT

8000

FastAPI port

MCP_TRANSPORT_AUTH

false

Require OAuth2 bearer to call the MCP server (HTTP/SSE only) โ€” see Securing the MCP transport

MCP_AUTH_JWKS_URI

Keycloak certs

IdP JWKS endpoint used to validate bearer tokens

MCP_AUTH_ISSUER

โ€“

Optional strict issuer check (must be HTTPS)

MCP_AUTH_AUDIENCE

โ€“

Optional audience check

LOG_LEVEL

INFO

Logging level

MAX_FILE_SIZE

100000000

Max upload size (bytes)

โš™๏ธ See Configuration Guide for deployment options

๐Ÿ—๏ธ Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   MCP Clients                       โ”‚
โ”‚  Claude Desktop โ”‚ MCP Inspector โ”‚ Cursor โ”‚ Claude   โ”‚
โ”‚     Code โ”‚ n8n โ”‚ LangFlow โ”‚ Custom MCP Client App   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚ stdio/HTTP/SSE
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚             FastMCP 2.0 MCP Server                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚ MCP Tools   โ”‚ MCP         โ”‚ HTTP/SSE API    โ”‚    โ”‚
โ”‚  โ”‚ (15 total)  โ”‚ Resources   โ”‚                 โ”‚    โ”‚
โ”‚  โ”‚             โ”‚ MCP Prompts โ”‚                 โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚ python-alfresco-api
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚            Alfresco Content Services                โ”‚
โ”‚         (Community/Enterprise Edition)              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿงช Testing & Quality

Test Suite Overview

  • 143 Total Tests: 100% passed - Coverage of all functionality

  • 122 Unit Tests: 100% passed - Core functionality validated with mocking (FastMCP 2.0, tools, coverage)

  • 21 Integration Tests: 100% passed - Live server testing (search, upload, download, document lifecycle)

  • Integration Tests: Automated end-to-end testing covering all core document lifecycle scenarios

  • Performance Validated: Search <1s, concurrent operations, resource access

Coverage Report (Post-Cleanup)

  • Overall Coverage: 51% (1,829 statements tested)

  • FastMCP 2.0 Core: Well tested with comprehensive unit coverage

  • Configuration Module: 93% coverage - Fully tested

  • Package Initialization: 100% coverage (5/5 lines) - Complete

  • Overall Project: 51% coverage of comprehensive codebase

Run Tests

# Run full test suite
pytest

# Run with coverage report
pytest --cov=alfresco_mcp_server --cov-report=term-missing

# Run specific test categories
pytest -m "unit"           # Unit tests only
pytest -m "fastmcp"        # FastMCP 2.0 tests
pytest -m "integration"    # Integration tests (requires Alfresco)

๐Ÿงช See Testing Guide for detailed testing strategies

๐Ÿงช Test Categories and Execution

The project includes 4 levels of testing:

  1. ๐Ÿ“‹ Unit Tests (122 tests) - Fast, mocked, isolated component testing

  2. ๐Ÿ”— Integration Tests (21 tests) - Live Alfresco server testing

  3. ๐Ÿ“ Comprehensive Tests - Automated core document lifecycle scenarios

  4. ๐Ÿ“Š Coverage Tests - Edge cases and error path coverage

๐Ÿงช Development

Setup Development Environment

git clone <repository>
cd python-alfresco-mcp-server

# UV handles everything automatically - no manual venv setup needed!
uv sync --extra dev        # Install with development tools
uv sync --extra test       # With testing tools
uv sync --extra all        # Everything

# Run immediately to test that installation worked
uv run python-alfresco-mcp-server --help

# Install python-alfresco-api for local development (if needed)
uv add --editable ../python-alfresco-api

Traditional Development Setup:

See the Installation with pip and pipx for pip-based development setup.

๐Ÿ’ก Examples

Real-world implementation patterns from beginner to enterprise:

๐Ÿค Contributing

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/new-feature)

  3. Commit your changes (git commit -m 'Add new feature')

  4. Push to the branch (git push origin feature/new-feature)

  5. Open a Pull Request

๐Ÿ“„ License

This project is licensed under the Apache 2.0 License - see the LICENSE file for details.

๐Ÿ™‹โ€โ™‚๏ธ Support


๐Ÿš€ MCP server built with python-alfresco-api and FastMCP 2.0

Available Tools

15 tools
browse_repositoryC

Browse the Alfresco repository structure.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_itemsNo
parent_idNo-my-

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2/5.0
Behavior1/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 merely says 'browse', a weak indicator of read-only behavior, but does not explicitly state that the tool performs a read operation, what happens with an invalid parent_id, pagination behavior via max_items, or any permission requirements. This is a significant gap.

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

Conciseness3/5

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

The description is extremely concise at six words, with no fluff and the verb front-loaded. However, the brevity comes at the cost of critical context. While it earns its place as a minimal statement, it is under-specified for a tool with parameters and no other documentation.

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?

With an output schema present, explaining return values is unnecessary. However, the description lacks guidance on parameters, usage scenarios, and behavior. For a tool with two optional params and no annotations, the description should cover basics like the default parent_id='-my-' and what 'browse' returns (e.g., child nodes). This is incomplete.

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

Parameters1/5

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

Schema description coverage is 0%, meaning the input schema includes no descriptions for max_items or parent_id. The tool description does not mention these parameters at all, so it adds no semantic clarity. An agent must guess that parent_id refers to a node ID and max_items limits results, but nothing explains their meaning, defaults, or acceptable values.

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

Purpose3/5

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

The description names the verb 'browse' and the resource 'Alfresco repository structure', giving a basic sense of purpose. However, it is vague about what 'browse' returns or how it relates to sibling tools like get_node_properties or search_content. It does not explicitly distinguish itself, so an agent might not know whether this lists child nodes or performs a search.

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?

There is no guidance on when to use this tool versus alternatives. It does not mention that browsing is for navigating the folder tree as opposed to searching, nor does it mention prerequisites like parent_id. No exclusions or alternatives are named, leaving the agent to infer usage context.

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

cancel_checkoutA

Cancel checkout of a document, discarding any working copy.

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/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 does disclose the key behavioral consequenceโ€”discarding the working copyโ€”which is valuable. However, it does not mention reversibility, permissions, or behavior when the document is not checked out, leaving meaningful gaps for a mutating tool.

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 concise sentence with no filler. The action is front-loaded, and the important consequence is included without extra words.

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?

For a tool with one parameter and an output schema, the description adequately covers purpose and effect. However, the absence of annotations and any prerequisite context (e.g., document must be checked out first) leaves a small completeness gap.

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 schema has 0% description coverage, but the single parameter node_id is inferable from the tool name and the phrase 'of a document'. The description does not add explicit parameter-level detail, but the minimal context is enough to guide invocation.

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 states a specific verb ('cancel checkout'), a specific resource ('document'), and a concrete effect ('discarding any working copy'). This clearly distinguishes it from sibling tools like checkout_document and checkin_document.

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 given on when to use this tool versus alternatives. Sibling tools include checkout_document and checkin_document, but the description does not mention them or specify the conditions under which cancellation is appropriate.

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

checkin_documentC

Check in a document after editing using Alfresco REST API.

ParametersJSON Schema
NameRequiredDescriptionDefault
commentNo
node_idYes
new_nameNo
file_pathNo
major_versionNo

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 mentions using the Alfresco REST API, which adds implementation context, but it does not disclose what happens to the checked-out state, whether the document is locked/unlocked, how versioning works, or what the response contains. For a mutation tool, this is a significant gap.

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 concise sentence that is easy to scan and front-loads the action. It earns its place by adding the 'after editing' context and the Alfresco REST API detail, though it could be slightly more informative without becoming verbose.

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 has five parameters, no annotations, and an output schema, the description is too thin. It does not explain the check-in workflow (e.g., that it typically follows checkout_document), the role of file_path, or the meaning of major_version. An agent would need to inspect the schema and output schema to understand basic semantics, which the description should provide.

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 for the five parameters. It does not explain the meaning of node_id, comment, new_name, file_path, or major_version, nor how they interact (e.g., whether file_path is required for content updates). The description adds no parameter-level value beyond the schema's bare names.

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 states a specific verb ('Check in') and resource ('a document'), and the phrase 'after editing' gives the operation's context. It clearly distinguishes from siblings like checkout_document and cancel_checkout, though it doesn't explicitly name them.

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

Usage Guidelines3/5

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

The description implies the tool is used after editing a document, which is a clear usage context. However, it does not explicitly state when not to use it or mention alternatives like cancel_checkout for discarding changes, leaving some inference to the agent.

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

checkout_documentC

Check out a document for editing using Alfresco REST API.

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idYes
download_for_editingNo

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?

No annotations are present, so the description carries the full burden of behavioral disclosure. 'Check out' implies a state-changing mutation, but the description does not disclose that the document becomes locked/checked-out, that a follow-up checkin or cancel_checkout is required, or what effect download_for_editing has on the workflow. This is a significant gap for a mutating operation.

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?

A single front-loaded sentence with the action stated first; every word earns its place except the mild filler tail 'using Alfresco REST API', which adds little for an agent selecting a tool. It is concise without being under-specified to the point of tautology.

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?

Although an output schema exists (so return values need not be explained), the description omits the operational lifecycle: what checkout does to the document state, the purpose of download_for_editing, and the relationship to checkin_document/cancel_checkout. For a state-changing tool with no annotations, this leaves too much to inference.

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%, and the description compensates with nothing. Neither node_id nor the ambiguous download_for_editing boolean is explained; 'for editing' only loosely echoes the parameter name without defining its meaning, default behavior, or why an agent would set it to false.

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 states a specific verb ('Check out') and resource ('a document for editing'), making the core purpose immediately clear. It semantically contrasts with the sibling tools checkin_document and cancel_checkout, though the distinction is implicit rather than named. The 'using Alfresco REST API' clause is implementation detail but does not obscure the purpose.

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 phrase 'for editing' provides clear context for when this tool is appropriate, and the sibling set implies the checkoutโ†’editโ†’checkin/cancel workflow. However, the description never explicitly states when to use this versus checkin_document or cancel_checkout, nor does it mention any prerequisites or exclusions.

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

create_folderC

Create a new folder in Alfresco.

ParametersJSON Schema
NameRequiredDescriptionDefault
parent_idNo-shared-
descriptionNo
folder_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.6/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It states only the basic effect (a folder is created) and gives no information about duplicate handling, whether parent_id is validated, required permissions, or side effects. This is minimal guidance, not meaningful 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 a single, front-loaded sentence with no redundancy or fluff. It is concise, though it is concise at the expense of completenessโ€”a tradeoff reflected in the other dimension scores.

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?

Having an output schema helps with return-value understanding, but the description still omits critical context: how parent_id works, the meaning of the default, whether the folder is created in a shared location, and what errors or conflicts may occur. For a mutating tool with no annotations, this is not complete enough for confident invocation.

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

Parameters1/5

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

Schema description coverage is 0%, and the description does not explain any parameter. In particular, parent_id defaults to '-shared-' but its meaning is never clarified, so an agent cannot reliably know whether it expects a node ID, a path, or a folder name.

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 names the action and resource: creating a new folder in Alfresco. This is enough to distinguish it from sibling tools like upload_document or delete_node, though it does not provide any detail about location or scope beyond 'Alfresco'.

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 given about when to use this tool versus alternatives, or about prerequisites such as authentication, parent folder ownership, or permissions. The only cue is the tool name, which does the work the description should be doing.

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

delete_nodeC

Delete a document or folder from Alfresco.

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idYes
permanentNo

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?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action (delete) but does not disclose consequences such as whether deletion is reversible, what happens to children of a folder, whether the 'permanent' parameter bypasses trash, or any authorization requirements. The description adds minimal behavioral context beyond the tool name.

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, short sentence that is easy to parse and front-loads the core action. It is appropriately concise, though it could add a second sentence about the 'permanent' parameter without becoming bloated.

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 has an output schema and only two parameters, the description is too thin. It lacks critical context about deletion semantics (permanent vs. trash), folder behavior, and any side effects. The output schema exists but the description does not explain what the response contains or when the operation fails. For a destructive operation with no annotations, this is a significant gap.

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%, and the description does not explain the parameters. The schema shows 'node_id' (string) and 'permanent' (boolean, default false), but the description does not clarify what 'permanent' means (e.g., bypass trash vs. trashable) or how node_id should be formatted. With zero schema coverage, the description must compensate, and it does not.

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 states a clear verb ('Delete') and resource ('a document or folder from Alfresco'), which distinguishes it from sibling tools like upload_document, download_document, and create_folder. It is concise and unambiguous, though it doesn't explicitly differentiate from other delete-like operations (none exist among siblings).

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, nor does it mention any prerequisites or conditions (e.g., whether the node must be checked out, permissions required, or whether permanent deletion is appropriate). The sibling list includes checkout/checkin tools, but no exclusions or routing hints are given.

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

download_documentC

Download a document from Alfresco repository.

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idYesThe Alfresco node ID to download
attachmentNoDownload as attachment (default: True)
save_to_diskNoSave file to disk (default: True)
destination_dirNoOptional custom destination folder (default: ~/Downloads)

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?

With no annotations provided, the description carries the full burden of behavioral disclosure, but it only states that it downloads a document. It does not reveal that it can save to disk, whether the download is treated as an attachment, or any side effects on the repository. The behavior is fundamentally opaque beyond the basic action.

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, compact sentence with no filler or redundant phrasing. It is appropriately sized for a simple download action, and the main verb is front-loaded, making it instantly scannable.

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?

Despite having 4 parameters and an output schema, the description omits crucial operational context such as default file save location, handling of existing files, or how the node_id is used. It does not explain return values or error conditions, leaving the agent with significant gaps in how to correctly invoke the tool beyond the schema.

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 100%, so the schema already documents all parameters like node_id, attachment, save_to_disk, and destination_dir. The description adds no additional meaning or context about these parameters, so it neither helps nor hurts beyond the baseline for full 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 states a clear verb ('Download') and resource ('document from Alfresco repository'), making the primary purpose immediately obvious. It distinguishes itself from siblings like upload_document and checkout_document by the action itself, though it does not explicitly name alternatives or scope conditions.

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

Usage Guidelines1/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 any of the sibling tools (e.g., browse_repository, get_node_properties, or upload_document). It does not mention prerequisites, typical scenarios, or exclusions, leaving the agent without context for selection.

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

get_node_propertiesC

Get metadata and properties of a document or folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idYes

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, the description carries the full burden of behavioral disclosure. 'Get' implies a read operation, but the description does not disclose permissions, error behavior for invalid node IDs, access restrictions, or any other behavioral traits an agent should anticipate.

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, front-loaded sentence with no filler or repetition. It is concise and easy to parse, though the brevity comes at the expense of useful detail.

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?

Even though the tool is simple and has an output schema, the definition lacks usage guidance, parameter semantics, and behavioral context. With no annotations, this sparse description is not enough for an agent to invoke the tool reliably in all situations.

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?

The schema provides only 'node_id' as a string, and the description does not explicitly explain what node_id is or how to obtain it. The phrase 'document or folder' gives some clue about the node type, but the parameter format and provenance are left 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 ('Get') and the resource ('metadata and properties of a document or folder'), distinguishing it from mutation tools like update_node_properties and delete_node. It does not explicitly differentiate it from retrieval alternatives like browse_repository or search_content, so it stops short of 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 gives no guidance on when to use this tool versus alternatives. It does not mention how to obtain a node_id, whether to use browse_repository or search first, or any prerequisites for calling this tool.

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

get_repository_info_toolA

Get Alfresco repository information using Discovery Client (as tool instead of resource).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/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 and method but does not reveal whether the operation is read-only, what specific information is returned, any restrictions, or potential side effects. While it is likely a harmless read operation, the description does not explicitly confirm this, leaving the agent to infer it.

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, lean sentence that fronts the action and resource. Every word adds value; there is no fluff or repetition. It is appropriately concise for a tool with no parameters.

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?

The tool has no parameters and an output schema, which reduces the need for descriptive detail about return values. The description fully covers what the tool does, and the output schema presumably details the returned information. The only gap is the lack of usage context relative to siblings, but given the simplicity of the operation, this is a minor omission.

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 is empty with zero parameters, so the description has no parameter meanings to clarify. Per the baseline for 0 parameters, this is a 4. The description correctly omits any parameter discussion, as there is nothing to explain beyond the 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 states a specific action ('Get') and resource ('Alfresco repository information'), and adds the method ('using Discovery Client'). This clearly distinguishes it from siblings like browse_repository or get_node_properties, which focus on browsing or node-level details. The purpose is unambiguous.

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 given on when to use this tool versus alternatives. The phrase 'as tool instead of resource' is a technical note about invocation style, not a usage condition. It does not mention when this is preferable to browse_repository, search, or other repository-level tools.

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

search_by_metadataC

Search for content in Alfresco by metadata fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
termNo
creatorNo
max_resultsNo
content_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.6/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 only says 'Search' and gives no detail about how multiple metadata fields combine, whether term is a partial/fuzzy match, case sensitivity, default behavior, or how results are ordered or limited. The read-only nature is implied but not stated.

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

Conciseness3/5

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

The description is a single sentence with no redundancy, which is structurally clean. However, it is under-specified: it is concise primarily because it omits useful usage and behavior guidance rather than because every sentence is information-dense.

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?

With 4 parameters, 0% schema coverage, no annotations, and multiple sibling search tools, the description is not complete enough for an agent to select and invoke the tool correctly. It lacks parameter semantics, use-case differentiation, and behavioral expectations; the existing output schema partially mitigates but does not compensate.

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%, and the description does not compensate by explaining term, creator, content_type, or max_results. 'By metadata fields' loosely connects the parameters to the search, but it adds little meaning beyond the parameter names and leaves max_results entirely unaddressed.

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 states a clear verb ('Search') and resource ('content in Alfresco') and identifies the mechanism ('by metadata fields'). However, it does not differentiate from sibling search tools like search_content, advanced_search, or cmis_search, so it misses the distinction needed for a 5.

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 gives no guidance on when to use this tool versus alternatives. With four sibling search/browse tools available, an agent gets no signal about whether metadata-field search is preferred for this query or how it differs from full-text or CMIS search.

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

search_contentB

Search for content in Alfresco using AFTS query language.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
node_typeNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description bears the full burden of behavioral disclosure. It only states that the tool searches content; it does not mention that the operation is read-only, how results are ordered or paginated, or whether special permissions or repository context are required.

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 concise sentence with no extraneous words. It gets directly to the point and is easy to parse quickly.

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

Completeness2/5

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

The tool has 3 parameters and no annotations, and the description fails to explain the purpose of the optional parameters or any usage constraints. Although an output schema exists and the search concept is familiar, the missing parameter semantics and lack of behavioral context leave the description incomplete for confident invocation.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It adds meaning only to the 'query' parameter by identifying it as an AFTS query. The 'node_type' and 'max_results' parameters are not described at all, leaving their semantics to be guessed from parameter names.

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 a specific action ('Search for content') and a specific resource ('Alfresco') with a concrete method ('AFTS query language'). This also distinguishes it from sibling tools like cmis_search and search_by_metadata, which use different search mechanisms.

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 when to use the tool via the mention of 'AFTS query language', suggesting it is for AFTS-based queries rather than metadata or CMIS searches. However, it does not explicitly state alternatives or exclusion criteria, so an agent must infer the appropriate choice from sibling names alone.

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

update_node_propertiesC

Update metadata and properties of a document or folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
titleNo
authorNo
node_idYes
descriptionNo

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?

No annotations are present, so the description must disclose behavioral traits, but it only states that it updates metadata and properties. It does not explain whether missing optional fields are overwritten or cleared, whether the update is idempotent, or what permissions are required. For a mutation tool this is a meaningful transparency gap.

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 concise sentence with the core operation front-loaded. It contains no filler, though its brevity means it does little to compensate for the lack of schema descriptions and usage guidance.

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?

For a 5-parameter mutation tool with no annotations and no parameter descriptions, this definition is incomplete. An agent cannot infer partial-update behavior, the effect of empty-string defaults, or when to choose this tool over get_node_properties or delete_node. The output schema may clarify return values but not invocation behavior.

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%, and the description adds no parameter-specific meaning beyond the phrase 'metadata and properties.' While names like node_id and title are somewhat self-explanatory, the description does not clarify relationships between parameters, default-value behavior, or how node_id acts as the identifier.

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

Purpose4/5

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

The description uses a specific verb ('Update') and identifies the resource ('metadata and properties of a document or folder'). This clearly signals a mutation operation and distinguishes it from read-oriented siblings like get_node_properties and browse_repository. It is less explicit, however, in differentiating itself from other mutation tools beyond the 'metadata and properties' scope.

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 given about when to use this tool versus sibling tools. The description does not mention alternatives, exclusions, or preconditions such as needing an existing node, which matters given the 14 sibling tools that include get_node_properties and delete_node.

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

upload_documentC

Upload a document to Alfresco.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_pathNo
parent_idNo-shared-
descriptionNo
base64_contentNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.4/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It only says 'Upload a document' without explaining what happens on upload (e.g., whether it creates a new node, overwrites existing content, requires authentication, or handles versioning). The presence of both file_path and base64_content suggests two possible upload modes, but the description does not clarify their behavior or precedence.

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

Conciseness3/5

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

The description is a single short sentence, which is concise and front-loaded. However, it is under-specified: it earns its place but does not provide enough information to be useful. It is not verbose, but it sacrifices substance for brevity.

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 has 4 parameters, no annotations, and an output schema, the description is incomplete. It does not explain how to provide the document content (file_path vs base64_content), what the parent_id default means, or what the output schema contains. The sibling tools suggest a rich repository context, but this description does not help the agent understand the upload workflow.

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 for the four parameters, but it does not. The description mentions 'document' but does not explain the meaning of file_path, parent_id, description, or base64_content. The parameter names are somewhat self-explanatory, but the description adds no value beyond the schema, and the default values (e.g., '-shared-') are not explained.

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

Purpose3/5

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

The description states a specific verb and resource ('Upload a document to Alfresco'), which is clear at a basic level. However, it does not distinguish this from sibling tools like create_folder or checkin_document, and it doesn't specify what kind of document or how the upload is performed. It is minimally clear but lacks differentiation.

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. The description does not mention prerequisites (e.g., needing a parent folder, using base64_content vs file_path), nor does it exclude cases like updating existing documents or checking in content. The agent is left to infer usage from the tool name and schema.

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. 15 tool updatesv1.2.0
    • Changedadvanced_search7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / sort_ascending / title
        Removed value: -"Sort Ascending"
      • removedInput schema / properties / sort_field / title
        Removed value: -"Sort Field"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changedbrowse_repository5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / max_items / title
        Removed value: -"Max Items"
      • removedInput schema / properties / parent_id / title
        Removed value: -"Parent Id"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changedcancel_checkout4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / node_id / title
        Removed value: -"Node Id"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changedcheckin_document8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / comment / title
        Removed value: -"Comment"
      • removedInput schema / properties / file_path / title
        Removed value: -"File Path"
      • removedInput schema / properties / major_version / title
        Removed value: -"Major Version"
      • removedInput schema / properties / new_name / title
        Removed value: -"New Name"
      • removedInput schema / properties / node_id / title
        Removed value: -"Node Id"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changedcheckout_document5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / download_for_editing / title
        Removed value: -"Download For Editing"
      • removedInput schema / properties / node_id / title
        Removed value: -"Node Id"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changedcmis_search5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / cmis_query / title
        Removed value: -"Cmis Query"
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changedcreate_folder6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / description / title
        Removed value: -"Description"
      • removedInput schema / properties / folder_name / title
        Removed value: -"Folder Name"
      • removedInput schema / properties / parent_id / title
        Removed value: -"Parent Id"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changeddelete_node5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / node_id / title
        Removed value: -"Node Id"
      • removedInput schema / properties / permanent / title
        Removed value: -"Permanent"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changeddownload_document10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / attachment / description
        Added value: +"Download as attachment (default: True)"
      • removedInput schema / properties / attachment / title
        Removed value: -"Attachment"
      • addedInput schema / properties / destination_dir
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional custom destination folder (default: ~/Downloads)"
        +}
      • addedInput schema / properties / node_id / description
        Added value: +"The Alfresco node ID to download"
      • removedInput schema / properties / node_id / title
        Removed value: -"Node Id"
      • addedInput schema / properties / save_to_disk / description
        Added value: +"Save file to disk (default: True)"
      • removedInput schema / properties / save_to_disk / title
        Removed value: -"Save To Disk"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changedget_node_properties4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / node_id / title
        Removed value: -"Node Id"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changedget_repository_info_tool3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changedsearch_by_metadata7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / content_type / title
        Removed value: -"Content Type"
      • removedInput schema / properties / creator / title
        Removed value: -"Creator"
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • removedInput schema / properties / term / title
        Removed value: -"Term"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changedsearch_content6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • removedInput schema / properties / node_type / title
        Removed value: -"Node Type"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changedupdate_node_properties8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / author / title
        Removed value: -"Author"
      • removedInput schema / properties / description / title
        Removed value: -"Description"
      • removedInput schema / properties / name / title
        Removed value: -"Name"
      • removedInput schema / properties / node_id / title
        Removed value: -"Node Id"
      • removedInput schema / properties / title / title
        Removed value: -"Title"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
    • Changedupload_document7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / base64_content / title
        Removed value: -"Base64 Content"
      • removedInput schema / properties / description / title
        Removed value: -"Description"
      • removedInput schema / properties / file_path / title
        Removed value: -"File Path"
      • removedInput schema / properties / parent_id / title
        Removed value: -"Parent Id"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"_WrappedResult"
  2. 15 tool updates
    • First observedadvanced_search
    • First observedbrowse_repository
    • First observedcancel_checkout
    • First observedcheckin_document
    • First observedcheckout_document
    • First observedcmis_search
    • First observedcreate_folder
    • First observeddelete_node
    • First observeddownload_document
    • First observedget_node_properties
    • First observedget_repository_info_tool
    • First observedsearch_by_metadata
    • First observedsearch_content
    • First observedupdate_node_properties
    • First observedupload_document

TDQS

C2.8/5.0

Scored across 15 tools

Disambiguation3/5

Four search tools (search_content, advanced_search, search_by_metadata, cmis_search) have overlapping purposes and an agent could easily misselect between them, especially since advanced_search and search_by_metadata may be subsets of the AFTS search. The remaining content management tools are distinct, but the search cluster creates ambiguity.

Naming Consistency3/5

Most tools follow a verb_noun pattern (upload_document, create_folder, delete_node), but search tools mix conventions: advanced_search is adjective_noun, search_by_metadata uses a preposition, and cmis_search is a noun-qualified verb. Also, get_repository_info_tool has an awkward 'tool' suffix, breaking the pattern.

Tool Count5/5

At 15 tools, the set is within the ideal range for a domain-specific server and each tool addresses a distinct functional need (search, navigation, document operations, repository info). No tools feel redundant or unnecessary, even with multiple search variants.

Completeness4/5

The server covers core CRUD for nodes, search, browse, checkout/checkin, and property management. Missing operations like copy/move, document content update, and version history are minor gaps for an Alfresco integration, but the main workflows are supported without dead ends.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    A Model Context Protocol server that enables AI models to interact with SourceSync.ai's knowledge management platform for managing documents, ingesting content from various sources, and performing semantic searches.
    25
    30 npm
    1
    ISC
  • A
    license
    A
    quality
    D
    maintenance
    A comprehensive Model Context Protocol server that integrates Elasticsearch search with file operations, document validation, and version control to transform AI assistants into powerful knowledge management systems.
    27
    31 PyPI
    27
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Model Context Protocol server that integrates with Atlassian Confluence and Jira, enabling AI assistants to search, create, and update content in these platforms through natural language interactions.
    1
    MIT