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
parent_idNo-my-
max_itemsNo

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 'browse' but does not explain key traits: whether it's read-only (implied but not explicit), how it handles permissions, pagination behavior (hinted by 'max_items' but not described), or error conditions. This leaves significant gaps for a tool that interacts with a repository structure.

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 unnecessary words. It is front-loaded and appropriately sized for a basic tool, making it easy to parse quickly. Every word earns its place, avoiding redundancy or fluff.

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

Completeness3/5

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

Given the tool's moderate complexity (2 parameters, no annotations, but has an output schema), the description is minimally adequate. The output schema likely covers return values, reducing the need for description details. However, it lacks context on usage, parameters, and behavioral traits, making it incomplete for safe and effective use without additional 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%, so the description must compensate for undocumented parameters. It mentions 'repository structure' but adds no meaning to 'parent_id' (e.g., starting point for browsing) or 'max_items' (e.g., pagination limit). Without this, users may not understand how to use these parameters effectively, failing to compensate for the schema gap.

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 the tool's purpose as 'Browse the Alfresco repository structure,' which clearly indicates it navigates or lists items in a repository. However, it lacks specificity about what 'browse' entails (e.g., listing folders/files) and does not differentiate from siblings like 'search_content' or 'get_node_properties,' which might offer similar functionality. It avoids tautology but remains vague on the exact action.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, context for browsing (e.g., initial exploration vs. targeted search), or exclusions. Given siblings like 'search_content' and 'cmis_search,' users might be confused about when browsing is preferred over searching, leading to potential misuse.

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.5/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 mentions 'discarding any working copy,' which indicates a destructive action, but does not cover other critical aspects like permissions required, whether the action is reversible, error conditions, or response behavior. 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, efficient sentence that front-loads the core action and effect without unnecessary words. Every part of the sentence contributes directly to understanding the tool's purpose, making it appropriately concise and well-structured.

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 that there is an output schema (which may cover return values), the description does not need to explain outputs. However, for a destructive tool with no annotations and minimal parameter guidance, the description is incompleteโ€”it lacks details on behavioral implications, error handling, and usage context, which are crucial for safe and effective tool invocation.

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 input schema has one parameter ('node_id') with 0% description coverage, and the tool description does not add any parameter-specific information. With a single parameter, the baseline is higher, but the description fails to explain what 'node_id' represents (e.g., document identifier) or its format, leaving semantics unclear beyond the schema's basic structure.

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

Purpose5/5

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

The description clearly states the action ('Cancel checkout') and the resource ('a document'), specifying the effect ('discarding any working copy'). It distinguishes from sibling tools like 'checkout_document' and 'checkin_document' by focusing on cancellation rather than initiation or completion of checkout.

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

Usage Guidelines3/5

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

The description implies usage when a checkout needs to be canceled, but does not explicitly state when to use this tool versus alternatives like 'checkin_document' or other document management tools. It lacks guidance on prerequisites (e.g., must have an active checkout) or exclusions, leaving usage context partially inferred.

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
node_idYes
commentNo
major_versionNo
file_pathNo
new_nameNo

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 states the tool performs a check-in operation, implying a write/mutation action, but doesn't disclose behavioral traits such as required permissions, whether it creates new versions, what happens to the checked-out state, or error conditions. The mention of 'Alfresco REST API' adds some context but is insufficient for a mutation 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, efficient sentence that front-loads the core purpose ('Check in a document') and adds necessary context ('after editing using Alfresco REST API'). There is no wasted verbiage or redundancy, making it appropriately concise for the tool's complexity.

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 (5 parameters, mutation operation, no annotations) and the presence of an output schema (which might cover return values), the description is incomplete. It lacks critical details like parameter meanings, usage constraints, and behavioral transparency needed for safe and effective invocation, especially for a write tool with multiple inputs.

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 but adds no parameter information. It doesn't explain what 'node_id' refers to, the purpose of 'comment' or 'major_version', or how 'file_path' and 'new_name' interact with the check-in process. With 5 parameters undocumented in both schema and description, this is a significant gap.

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 ('Check in') and resource ('a document') with the specific context 'after editing using Alfresco REST API.' It distinguishes from siblings like 'cancel_checkout' and 'checkout_document' by focusing on the check-in operation. However, it doesn't explicitly differentiate from all siblings, such as 'update_node_properties' which might also modify documents.

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 minimal guidance with 'after editing,' implying usage post-modification, but lacks explicit when-to-use rules, prerequisites (e.g., document must be checked out first), or alternatives. No mention of when not to use this tool or comparisons to siblings like 'update_node_properties' for non-versioned changes.

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?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool checks out a document for editing, implying a mutation that likely locks the document, but doesn't describe effects (e.g., locks document, prevents others from editing), permissions required, or error conditions. 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, efficient sentence with zero waste. It front-loads the core purpose ('Check out a document for editing') and adds necessary context ('using Alfresco REST API'). Every word earns its place, making it appropriately sized and well-structured.

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 an output schema (which handles return values), no annotations, and low schema coverage, the description is minimally complete. It states the basic action but lacks details on behavior, parameters, and usage context. For a mutation tool with siblings, it should do more to guide the agent, but the output schema mitigates some gaps.

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 schema provides no parameter details. The description adds no information about parameters beyond what the schema names imply. It doesn't explain what 'node_id' represents or how 'download_for_editing' affects behavior. The description fails to compensate for the low schema coverage.

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

Purpose4/5

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

The description clearly states the action ('check out') and resource ('a document') with the specific method ('using Alfresco REST API'). It distinguishes from siblings like 'checkin_document' and 'cancel_checkout' by focusing on the checkout operation, though it doesn't explicitly contrast with them. The purpose is specific but lacks explicit sibling 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?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., document must be checked in), exclusions (e.g., not for folders), or compare with siblings like 'download_document' or 'checkin_document'. Usage is implied only by the tool name, with no explicit context.

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

create_folderB

Create a new folder in Alfresco.

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_nameYes
parent_idNo-shared-
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/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 the tool creates a folder but doesn't mention any behavioral traits: no information about required permissions, whether the operation is idempotent, what happens on conflicts, rate limits, or what the output contains. The description is minimal and lacks crucial context for a mutation operation.

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

Conciseness5/5

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

The description is extremely conciseโ€”a single sentence with no wasted words. It's front-loaded with the core action and resource, making it easy to parse quickly. Every word earns its place by conveying essential purpose.

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 an output schema (which handles return values) and no annotations, the description is minimally complete for stating what it does. However, for a mutation tool with 3 parameters and no annotation coverage, it should provide more context about behavior, usage, and parameters to be fully helpful to an agent.

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

Parameters3/5

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

The description adds no parameter semantics beyond what the input schema provides. With 0% schema description coverage, the schema titles ('Folder Name', 'Parent Id', 'Description') give basic hints, but the description doesn't explain what these parameters mean (e.g., what 'parent_id' format is, what '-shared-' default implies). Baseline is 3 since schema coverage is low but description doesn't compensate.

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 ('Create') and resource ('a new folder in Alfresco'), making the purpose immediately understandable. It distinguishes this as a creation tool among siblings that include deletion, download, search, and update operations, though it doesn't explicitly differentiate from similar creation tools like 'upload_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?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing parent folder permissions), when not to use it (e.g., for creating documents instead of folders), or direct alternatives among the sibling tools like 'upload_document' for files.

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.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. While 'Delete' implies a destructive operation, it doesn't specify whether this requires special permissions, what happens to linked content, if deletion can be undone, or what the output contains. The 'permanent' parameter hints at behavioral nuance, but the description doesn't explain 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, clear sentence with no wasted words. It's front-loaded with the core action and resource, making it efficient for quick understanding.

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

Completeness2/5

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

For a destructive tool with 2 parameters (one with behavioral implications like 'permanent'), 0% schema coverage, no annotations, and multiple sibling tools, the description is inadequate. It doesn't address permissions, consequences, alternatives, or parameter meanings, leaving significant gaps despite the existence of an output schema.

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?

With 0% schema description coverage for both parameters, the description adds no parameter information beyond what's inferred from the tool name. It doesn't explain what 'node_id' represents, how to obtain it, or what 'permanent' means in context (e.g., vs. moving to trash).

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 ('Delete') and the resource ('a document or folder from Alfresco'), making the purpose immediately understandable. However, it doesn't differentiate this tool from potential alternatives like 'cancel_checkout' or 'checkin_document' that might also remove content in different ways.

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. With siblings like 'cancel_checkout' and 'checkin_document' that might handle document lifecycle states, there's no indication of whether this tool is for permanent deletion, version management, or specific document states.

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_idYes
save_to_diskNo
attachmentNo

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 provided, so the description carries the full burden of behavioral disclosure. While 'Download' implies a read operation, it doesn't specify whether this requires authentication, what happens with the downloaded file (e.g., where it's saved), or if there are rate limits. The description is too minimal to adequately inform the agent about the tool's behavior 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 extremely concise - a single sentence that directly states the tool's purpose without any unnecessary words. It's front-loaded with the core action and resource, making it efficient for quick understanding.

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 that there's an output schema (which should document return values) and no annotations, the description minimally covers the basic purpose. However, for a download operation with 3 parameters that are completely undocumented, the description should provide more context about how the tool works and what the parameters mean to be truly complete.

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?

With 0% schema description coverage and 3 parameters, the description provides no information about what 'node_id', 'save_to_disk', or 'attachment' mean or how they affect the download. The description doesn't compensate for the complete lack of parameter documentation in the schema, leaving the agent with no semantic understanding of the inputs.

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 ('Download') and resource ('a document from Alfresco repository'), making the purpose immediately understandable. However, it doesn't distinguish this tool from potential alternatives among its siblings, such as 'get_node_properties' which might also retrieve document information but not the file content itself.

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. With siblings like 'get_node_properties' or 'search_content' that might provide document metadata, there's no indication that this tool is specifically for retrieving the actual file content for download rather than just document information.

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

get_node_propertiesB

Get metadata and properties of a document or folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action ('Get metadata and properties') but doesn't mention permissions, rate limits, response format, or whether it's a read-only operation. This leaves significant gaps in understanding how the tool behaves beyond its basic function.

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 that efficiently conveys the core purpose without unnecessary words. It's front-loaded and appropriately sized for a simple retrieval tool, making it easy to parse quickly.

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

Completeness3/5

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

Given the tool's low complexity (1 parameter) and the presence of an output schema, the description is minimally adequate. However, with no annotations and multiple sibling tools, it lacks context on usage and behavioral traits, making it incomplete for optimal agent understanding.

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 input schema has 1 parameter with 0% description coverage, and the tool description doesn't add any details about the 'node_id' parameter, such as format or examples. Since schema coverage is low, the description fails to compensate, but with only one parameter, the baseline is slightly higher than minimal.

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

Purpose4/5

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

The description clearly states the verb ('Get') and resource ('metadata and properties of a document or folder'), making the purpose understandable. However, it doesn't distinguish this tool from similar siblings like 'get_repository_info_tool' or 'update_node_properties', which might also involve node properties, so it misses full 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?

The description provides no guidance on when to use this tool versus alternatives. With siblings like 'search_by_metadata', 'browse_repository', and 'get_repository_info_tool', there's no indication of when this specific retrieval method is preferred, leaving usage context unclear.

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

get_repository_info_toolB

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/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 this is a 'get' operation which implies read-only behavior, but doesn't specify authentication requirements, rate limits, error conditions, or what specific repository information is returned. The mention of Discovery Client adds some implementation context but doesn't sufficiently describe operational behavior for a tool with no annotation coverage.

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

Conciseness4/5

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

The description is appropriately concise at one sentence that directly states the tool's purpose and implementation approach. It's front-loaded with the core functionality ('Get Alfresco repository information') and adds useful context about the Discovery Client. There's no wasted verbiage, though it could be slightly more structured for better readability.

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, as a read operation among many repository tools with no annotations, it should better explain what distinguishes it from siblings and what specific information is returned. The presence of an output schema reduces the need to describe return values, but the description could provide more context about when this tool is the appropriate choice.

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, and schema description coverage is 100%. The description appropriately doesn't waste space discussing non-existent parameters. A baseline of 4 is appropriate for parameterless tools where the schema fully documents the empty parameter set, and the description focuses on the tool's purpose rather than parameter details.

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

Purpose4/5

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

The description clearly states the tool's purpose: 'Get Alfresco repository information' specifies both the verb (get) and resource (repository information). It distinguishes from siblings by mentioning the Discovery Client approach, though it doesn't explicitly differentiate from similar read operations like get_node_properties. The purpose is clear but could better highlight uniqueness among sibling tools.

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 minimal usage guidance. It mentions using 'Discovery Client (as tool instead of resource)' which hints at architectural context, but doesn't specify when to use this tool versus alternatives like browse_repository or get_node_properties. No explicit when/when-not scenarios or prerequisites are provided, leaving the agent with little guidance on appropriate usage contexts.

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
content_typeNo
max_resultsNo

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 mentions searching by metadata fields but does not cover critical aspects like whether this is a read-only operation, potential rate limits, authentication requirements, or what happens on errors. For a search tool with no annotations, this is a significant gap in transparency.

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 function without unnecessary words. It is appropriately sized and front-loaded, making it easy to parse quickly. Every word earns its place, achieving optimal conciseness.

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 an output schema (which reduces the need to describe return values), but no annotations and 0% schema description coverage for 4 parameters, the description is incomplete. It covers the basic purpose but lacks details on parameter usage, behavioral traits, and differentiation from siblings. This makes it minimally viable but with clear gaps for effective agent use.

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 parameters are undocumented in the schema. The description only vaguely mentions 'metadata fields' without explaining what parameters like 'term', 'creator', 'content_type', or 'max_results' mean or how they should be used. This fails to compensate for the lack of schema documentation, leaving parameters ambiguous.

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 the tool's purpose as searching for content in Alfresco by metadata fields, which is clear but vague. It specifies the resource (content in Alfresco) and method (search by metadata fields), but lacks specificity on what metadata fields are available or how it differs from sibling tools like 'search_content' or 'cmis_search'. This makes it minimally adequate but not distinctive.

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. With sibling tools such as 'search_content', 'advanced_search', and 'cmis_search' available, there is no indication of what makes this tool unique or when it should be preferred. This leaves the agent without clear usage context.

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

search_contentC

Search for content in Alfresco using AFTS query language.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
max_resultsNo
node_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 full burden. It mentions 'AFTS query language' which hints at syntax requirements, but lacks critical behavioral details: whether this is read-only, pagination behavior (implied by max_results but not explained), rate limits, authentication needs, or what 'content' includes (documents, folders, etc.).

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 with no wasted words. It's appropriately sized for a search tool, though it could be more front-loaded with key differentiators given the sibling context.

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?

With 3 parameters (1 required), 0% schema coverage, no annotations, but an output schema exists, the description is minimally adequate. The output schema likely covers return values, but the description lacks context on search scope, AFTS syntax examples, and differentiation from siblings, leaving gaps for effective use.

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 only mentions 'AFTS query language' for the query parameter, but provides no context for max_results (default 25 but no range/limits) or node_type (no examples or valid values). The description adds minimal value beyond the bare schema.

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 the action ('Search for content') and target ('in Alfresco'), but is vague about scope and differentiation. It mentions 'AFTS query language' which adds specificity, but doesn't clarify what 'content' encompasses or how this differs from sibling tools like 'search_by_metadata' or 'cmis_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?

No guidance is provided on when to use this tool versus alternatives. With multiple search-related siblings (advanced_search, cmis_search, search_by_metadata), the description offers no context about use cases, prerequisites, or exclusions, leaving the agent to guess based on tool 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
node_idYes
nameNo
titleNo
descriptionNo
authorNo

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 full burden but only states it 'updates' without clarifying behavioral aspects like permissions needed, whether changes are reversible, rate limits, or what the output contains. It mentions 'metadata and properties' but doesn't detail scope or constraints.

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?

Single sentence is efficient and front-loaded with the core action. However, it could be more structured by explicitly listing updatable fields or adding brief context without becoming verbose.

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 complexity (mutation tool with 5 params, no annotations) and an output schema (which reduces need to describe returns), the description is minimally adequate but lacks details on error conditions, idempotency, or example use cases. It covers the basic purpose but leaves gaps for safe invocation.

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 but only vaguely references 'metadata and properties'. It doesn't explain parameter meanings (e.g., 'node_id' identifies the target, 'name' vs 'title' differences) or usage context. Baseline is 3 due to moderate parameter count (5) but lack of detailed compensation.

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 target ('metadata and properties of a document or folder'), which distinguishes it from siblings like 'delete_node' or 'get_node_properties'. However, it doesn't specify what types of metadata/properties are updatable beyond what's implied by the input schema.

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 explicit guidance on when to use this tool versus alternatives like 'checkin_document' or 'create_folder'. The description implies it's for modifying existing nodes, but doesn't mention prerequisites (e.g., node must exist), exclusions, or comparisons to sibling tools.

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
base64_contentNo
parent_idNo-shared-
descriptionNo

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 full burden for behavioral disclosure. It states this is an upload operation (implying a write/mutation) but doesn't mention authentication requirements, file size limits, supported formats, error conditions, or what happens on success. This leaves significant gaps for a mutation 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, efficient sentence with no wasted words. It's appropriately sized for a basic tool description and gets straight to the point without unnecessary elaboration.

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 this is a mutation tool with 4 parameters (0% schema coverage) and no annotations, but with an output schema present, the description is minimally adequate. The output schema will handle return values, but the description should do more to explain parameters and behavioral context for a write operation.

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 but provides zero parameter information. It doesn't explain what 'parent_id' means, the relationship between 'file_path' and 'base64_content', or what 'description' applies to. With 4 undocumented parameters, this is inadequate.

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 ('Upload') and target ('a document to Alfresco'), providing a specific verb+resource combination. However, it doesn't differentiate from sibling tools like 'checkin_document' or 'download_document', which prevents a perfect score.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like 'create_folder' for folders or 'checkin_document' for version control scenarios. There's no mention of prerequisites, constraints, or typical use cases.

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. Dates show when Glama detected each change.

  1. 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

B3.3/5.0
Disambiguation4/5

Most tools have distinct purposes, but there is some overlap between search tools (advanced_search, cmis_search, search_by_metadata, search_content) that could cause confusion about which to use for specific queries. The core document/folder management tools (create, delete, upload, download, checkout, checkin) are clearly differentiated.

Naming Consistency4/5

The naming follows a consistent verb_noun pattern (e.g., create_folder, delete_node, download_document) with one minor deviation: get_repository_info_tool uses 'tool' suffix inconsistently. Otherwise, the naming is predictable and readable.

Tool Count5/5

With 15 tools, this server is well-scoped for Alfresco document management, covering essential operations like CRUD, search, version control, and metadata handling. Each tool appears to serve a specific purpose without bloat.

Completeness5/5

The toolset provides comprehensive coverage for Alfresco repository management, including full CRUD for nodes, version control (checkout/checkin), multiple search methods, metadata operations, and repository info. No obvious gaps are present for core workflows.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

  • 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
    17
    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
    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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/stevereiner/python-alfresco-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server