Python Client for all Alfresco Content Services REST APIs, with Pydantic v2 Models, and Event Support
Project description
Python-Alfresco-API v1.1
A Complete Python client package for developing python code and apps for Alfresco. Great for doing AI development with Python based LangChain, LlamaIndex, neo4j-graphrag, etc. Also great for creating MCP servers (see python-alfresco-mcp-server).
Note this uses the remote Alfresco REST APIs. Not for in-process development in Alfresco.
A modern, type-safe Python client library for Alfresco Content Services REST APIs with dual model architecture (attrs + Pydantic) and async support.
๐ Features
- Complete API Coverage: All 7 Alfresco REST APIs (Auth, Core, Discovery, Search, Workflow, Model, Search SQL)
- 328+ Complete Domain Models: attrs-based raw client models with separate Pydantic models available for AI integration
- Model Conversion Utilities: Bridge utilities for attrs โ Pydantic transformation when needed
- Async/Sync Support: Both synchronous and asynchronous API calls
- Modular Architecture: Individual client design for scalability
- AI/LLM Ready: Pydantic models available for AI integration, MCP servers, and tool interfaces
- Event System: ActiveMQ and Event Gateway support for Python apps to handle change events
- Docker Compatible: Works with Alfresco running in separate Docker Compose setups
- Comprehensive Testing: Extensive unit and live Alfresco integration tests
๐ Documentation & Examples
- ๐๏ธ Architecture Overview and Diagram - V1.1 hierarchical architecture with visual diagram
- ๐ Complete Documentation - Comprehensive guides and API documentation
- ๐ฏ Working Examples - Live code examples and usage patterns
- ๐งช Test Suite - Complete test coverage and integration examples
๐ค MCP Server / LLM Integration
See python-alfresco-mcp-server
This is a MCP Server that uses Python Alfresco API
๐ฆ Installation
Quick Install from PyPI
pip install python-alfresco-api
- Requres: Python: 3.10+
- All features included - No optional dependencies needed! Includes event system, async support, and all 7 Alfresco APIs.
Virtual Environment Setup (Recommended)
Best Practice: Always use a virtual environment to avoid dependency conflicts
Windows
# Clone the repository
git clone https://github.com/stevereiner/python-alfresco-api.git
cd python-alfresco-api
# Create virtual environment
python -m venv venv
# Activate virtual environment
venv\Scripts\activate
# Verify activation (should show venv path)
where python
# Install dependencies
pip install -r requirements.txt
# Deactivate when done
deactivate
Linux / MacOS
# Clone the repository
git clone https://github.com/stevereiner/python-alfresco-api.git
cd python-alfresco-api
# Create virtual environment
python3 -m venv venv
# Activate virtual environment
source venv/bin/activate
# Verify activation (should show venv path)
which python
# Install dependencies
pip install -r requirements.txt
# Deactivate when done
deactivate
Package Installation
Install the package form PyPI use:
pip install python-alfresco-api
Development with source
For development of your project using python-alfresco-api to have debugging with source:
# After setting up virtual environment above
git clone https://github.com/your-org/python-alfresco-api.git
cd python-alfresco-api
# Activate your virtual environment first
# Windows: venv\Scripts\activate
# Linux/macOS: source venv/bin/activate
# Install in development mode
pip install -e .
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
Start Alfresco with Docker Compose
cd acs-deployment/docker-compose
Note: you will likely need to comment out activemq ports other than 8161 in community-compose.yaml
ports:
- "8161:8161" # Web Console
#- "5672:5672" # AMQP
#- "61616:61616" # OpenWire
#- "61613:61613" # STOMP
docker-compose -f community-compose.yaml up
๐ฏ Environment Setup
Environment Configuration (Recommended)
For easy configuration, copy the sample environment file:
# Windows
copy sample-dot-env.txt .env
# Mac and Linux
cp sample-dot-env.txt .env
# Edit .env and your Alfresco settings
Factory Pattern
The factory pattern provides shared authentication and centralized configuration:
from python_alfresco_api import ClientFactory
# Automatic configuration (loads from .env file or environment variables)
factory = ClientFactory() # Uses ALFRESCO_URL, ALFRESCO_USERNAME, etc.
# Or explicit configuration
factory = ClientFactory(
base_url="http://localhost:8080",
username="admin",
password="admin"
)
Note 1: the priority order of ClientFactory parameters: 1. in auth_util passed in, 2. in other parameters passed into ClientFactory, 3. in enviroment .env, etc.
Note 2. For timeout, if not in 1-3, no default will be used. The settings for tickets or your system will be used.
# Create individual clients (all share same authentication session)
auth_client = factory.create_auth_client()
core_client = factory.create_core_client()
search_client = factory.create_search_client()
workflow_client = factory.create_workflow_client()
discovery_client = factory.create_discovery_client()
model_client = factory.create_model_client()
search_sql_client = factory.create_search_sql_client() # SOLR admin only
# Can also use a master client like setup with all clients initialized
master_client = factory.create_master_client()
Authentication
For standard Alfresco authentication (recommended):
from python_alfresco_api import AuthUtil, ClientFactory
# Primary authentication pattern - Basic Auth with Alfresco
auth_util = AuthUtil(
base_url="http://localhost:8080",
username="admin",
password="admin"
)
Note 1: the priority order of ClientFactory parameters: 1. in auth_util passed in, 2. in other parameters passed into ClientFactory, 3. in enviroment .env, etc.
Note 2. For timeout, if not in 1-3, no default will be used. The settings for tickets or your system will be used.
# Use with factory for shared authentication
factory = ClientFactory(auth_util=auth_util)
clients = factory.create_all_clients()
Alternative Authentication:
OAuth2AuthUtilis available for enterprise OAuth2-based authentication but has not been live tested
Sync and Async Usage
import asyncio
from python_alfresco_api import ClientFactory
async def main():
factory = ClientFactory(
base_url="http://localhost:8080",
username="admin",
password="admin"
)
# Create core client for node operations
core_client = factory.create_core_client()
# Sync node operation
sync_node = core_client.get_node("-my-")
print(f"Sync: User folder '{sync_node.entry.name}'")
# Async node operation
async_node = await core_client.get_node_async("-my-")
print(f"Async: User folder '{async_node.entry.name}'")
# Run the async example
asyncio.run(main())
๐ฏ Key Operations & Examples
Essential Operation Samples
Quick examples of the most common operations. ๐ For complete coverage, see ๐ Essential Operations Guide
Basic Setup
from python_alfresco_api import ClientFactory
from python_alfresco_api.utils import content_utils_highlevel
factory = ClientFactory(base_url="http://localhost:8080", username="admin", password="admin")
core_client = factory.create_core_client()
Create Folder & Upload Document
# Create folder (High-Level Utility)
folder_result = content_utils_highlevel.create_folder_highlevel(
core_client=core_client,
name="My Project Folder",
parent_id="-my-"
)
# Upload document with auto-versioning
document_result = content_utils_highlevel.create_and_upload_file_highlevel(
core_client=core_client,
file_path="/path/to/document.pdf",
parent_id=folder_result['id']
)
Search Content
from python_alfresco_api.utils import search_utils
search_client = factory.create_search_client()
# Simple text search (already optimized!)
results = search_utils.simple_search(
search_client=search_client,
query_str="finance AND reports",
max_items=25
)
Download Document
# Download document content
content_response = core_client.nodes.get_content(node_id=document_id)
# Save to file
with open("downloaded_document.pdf", "wb") as file:
file.write(content_response.content)
Get & Set Properties
from python_alfresco_api.utils import content_utils_highlevel
# Get node properties and details
node_info = content_utils_highlevel.get_node_info_highlevel(
core_client=core_client,
node_id=document_id
)
print(f"Title: {node_info.get('properties', {}).get('cm:title', 'No title')}")
# Update node properties
update_request = {
"properties": {
"cm:title": "Updated Document Title",
"cm:description": "Updated via Python API"
}
}
updated_node = core_client.nodes.update(node_id=document_id, request=update_request)
Document Versioning - Checkout & Checkin
from python_alfresco_api.utils import version_utils_highlevel
# Checkout document (lock for editing)
checkout_result = version_utils_highlevel.checkout_document_highlevel(
core_client=core_client,
node_id=document_id
)
# Later: Checkin with updated content (create new version)
checkin_result = version_utils_highlevel.checkin_document_highlevel(
core_client=core_client,
node_id=document_id,
content="Updated document content",
comment="Fixed formatting and added new section"
)
๐ Complete Documentation & Examples
| Resource | Purpose | What You'll Find |
|---|---|---|
| ๐ Essential Operations Guide | Complete operation coverage | All operations with both high-level utilities and V1.1 APIs |
| ๐ examples/operations/ | Copy-paste examples | Windows-compatible, production-ready code |
| ๐งช tests/test_mcp_v11_true_high_level_apis_fixed.py | MCP Server patterns | 15 operations with sync/async patterns |
| ๐งช tests/test_highlevel_utils.py | High-level utilities testing | Real Alfresco integration examples |
๐ฏ Production-Ready Examples (examples/operations/)
| Example File | Key Operations |
|---|---|
| upload_document.py | Document upload, automatic versioning, batch uploads |
| versioning_workflow.py | Checkout โ Edit โ Checkin workflow, version history |
| basic_operations.py | Folder creation, CRUD operations, browsing, deletion |
| search_operations.py | Content search, metadata queries, advanced search |
๐ Model Architecture & Conversion (V1.1)
V1.1 implements a dual model system with conversion utilities:
| Component | Model Type | Purpose |
|---|---|---|
| Raw Client Models | @_attrs_define |
Complete OpenAPI domain models (RepositoryInfo, NodeEntry, etc.) |
| Pydantic Models | BaseModel |
AI/LLM integration, validation, type safety |
| Conversion Utils | Bridge utilities | Transformation between attrs โ Pydantic |
For detailed guidance, see ๐ Pydantic Models Guide and ๐ Conversion Utilities Design.
# โ
V1.1: Two model systems with conversion utilities
from python_alfresco_api.models.alfresco_core_models import NodeBodyCreate # Pydantic
from python_alfresco_api.raw_clients.alfresco_core_client.models import NodeBodyCreate as AttrsNodeBodyCreate # attrs
from python_alfresco_api.clients.conversion_utils import pydantic_to_attrs_dict
# 1. Use Pydantic for validation and AI integration
pydantic_model = NodeBodyCreate(name="document.pdf", nodeType="cm:content")
# 2. Convert for raw client usage
factory = ClientFactory()
core_client = factory.create_core_client()
# Option A: Manual conversion via model_dump()
result = core_client.create_node(pydantic_model.model_dump())
# Option B: Conversion utilities (V1.1)
attrs_dict = pydantic_to_attrs_dict(pydantic_model, target_class_name="NodeBodyCreate")
result = core_client.create_node(attrs_dict)
# 3. Raw clients return attrs-based domain models
repository_info = discovery_client.get_repository_information() # Returns attrs RepositoryInfo
# Convert to dict for further processing
repo_dict = repository_info.to_dict()
V1.2 Roadmap: Unified Pydantic Architecture
V1.2 will migrate raw client models from attrs to Pydantic v2:
# ๐ฏ V1.2 Target: Single Pydantic model system
from python_alfresco_api.raw_clients.alfresco_core_client.models import NodeBodyCreate # Will be Pydantic!
# No conversion needed - everything is Pydantic BaseModel
pydantic_model = NodeBodyCreate(name="document.pdf", nodeType="cm:content")
result = core_client.create_node(pydantic_model) # Direct usage!
Notes
- V1.1: Dual system with conversion utilities
- Pydantic models: Available for AI/LLM integration and validation
- Raw client models: attrs-based with 328+ complete domain models
- V1.2: Will unify to Pydantic v2 throughout
๐ Event System
ActiveMQ Integration (Community Edition)
from python_alfresco_api.activemq_events import AlfrescoActiveMQEventClient
# Create event client
event_client = AlfrescoActiveMQEventClient(
activemq_host="localhost",
activemq_port=61616,
username="admin",
password="admin"
)
# Register event handler
async def node_created_handler(notification):
print(f"Node created: {notification.nodeId}")
event_client.register_event_handler("alfresco.node.created", node_created_handler)
# Start listening
await event_client.connect()
await event_client.start_listening()
Event Gateway (Enterprise Edition)
from python_alfresco_api.event_client import AlfrescoEventClient
# Unified event client (auto-detects available systems)
event_client = AlfrescoEventClient()
# Works with both Community (ActiveMQ) and Enterprise (Event Gateway)
await event_client.create_subscription("node-events")
await event_client.start_listening()
๐ง For Developing the Python Alfresco API Package
For complete development documentation including the 3-step generation process (Pydantic models โ HTTP clients โ High-level APIs), see ๐ Package Developers Guide.
๐งช Development and Testing
Development Setup
For development, testing, and contributing:
pip install -r requirements-dev.txt
For most development work on python-alfresco-api, you can develop directly without regenerating code:
git clone https://github.com/stevereiner/python-alfresco-api.git
cd python-alfresco-api
# Install in development mode
pip install -e .
Note: For proper pytest execution, work from the source directory with
pip install -e .rather than testing from separate directories. This avoids import path conflicts.
Run Tests
cd python-alfresco-api
# Simple - just run all tests pytest
pytest
# Run all tests with coverage
pytest --cov=python_alfresco_api --cov-report=html
# Custom test runner with additional features
python run_tests.py
# Features:
# - Environment validation (venv, dependencies)
# - Colored output with progress tracking
# - Test selection for 44%+ coverage baseline
# - Performance metrics (client creation speed)
# - Live Alfresco server detection
# - HTML coverage reports (htmlcov/index.html)
# - Test summary with next steps
Live Integration Tests
To run tests against a live Alfresco server (Note: This package was developed and tested with Community Edition)
# Run one test (test live with Alfresco)
pytest tests/test_mcp_v11_true_high_level_apis_fixed.py -v
๐ Project Structure
python-alfresco-api/
โโโ python_alfresco_api/
โ โโโ __init__.py # Main exports
โ โโโ auth_util.py # Authentication utility
โ โโโ client_factory.py # Client factory pattern
โ โโโ clients/ # Individual API clients + utilities
โ โ โโโ auth_client.py
โ โ โโโ core_client.py
โ โ โโโ discovery_client.py
โ โ โโโ search_client.py
โ โ โโโ workflow_client.py
โ โ โโโ model_client.py
โ โ โโโ search_sql_client.py
โ โ โโโ conversion_utils.py # Pydantic โ attrs conversion utilities
โ โโโ models/ # Pydantic v2 models (available for separate use)
โ โ โโโ alfresco_auth_models.py
โ โ โโโ alfresco_core_models.py
โ โ โโโ alfresco_discovery_models.py
โ โ โโโ alfresco_search_models.py
โ โ โโโ alfresco_workflow_models.py
โ โ โโโ alfresco_model_models.py
โ โ โโโ alfresco_search_sql_models.py
โ โโโ raw_clients/ # Generated HTTP clients
โ โโโ utils/ # Utility functions
โ โ โโโ content_utils.py
โ โ โโโ node_utils.py
โ โ โโโ search_utils.py
โ โ โโโ version_utils.py
โ โ โโโ mcp_formatters.py
โ โโโ events/ # Event system (Community + Enterprise)
โ โโโ __init__.py # Event exports
โ โโโ event_client.py # Unified event client (AlfrescoEventClient)
โ โโโ models.py # Event models (EventSubscription, EventNotification)
โโโ config/ # Code generation configurations
โ โโโ auth.yaml # Auth API config โ auth_client
โ โโโ core.yaml # Core API config โ core_client
โ โโโ discovery.yaml # Discovery API config โ discovery_client
โ โโโ search.yaml # Search API config โ search_client
โ โโโ workflow.yaml # Workflow API config โ workflow_client
โ โโโ model.yaml # Model API config โ model_client
โ โโโ search_sql.yaml # Search SQL API config โ search_sql_client
โ โโโ general.yaml # Unified config โ alfresco_client
โ โโโ README.md # Configuration documentation
โโโ openapi/ # OpenAPI specifications (checked in)
โ โโโ openapi2/ # Original OpenAPI 2.0 specs
โ โโโ openapi2-processed/ # Cleaned OpenAPI 2.0 specs
โ โโโ openapi3/ # Converted OpenAPI 3.0 specs
โโโ tests/ # Comprehensive test suite
โโโ scripts/ # Generation scripts
โโโ docs/ # Comprehensive documentation
โ โโโ PYDANTIC_MODELS_GUIDE.md # Complete Pydantic models guide
โ โโโ CLIENT_TYPES_GUIDE.md # Client architecture guide
โ โโโ CONVERSION_UTILITIES_DESIGN.md # Model conversion utilities
โ โโโ REQUEST_TYPES_GUIDE.md # Node & Search request documentation
โ โโโ API_DOCUMENTATION_INDEX.md # Complete API reference
โโโ examples/ # Working usage examples
โโโ requirements.txt # Runtime dependencies
โโโ requirements-dev.txt # Development dependencies
โโโ run_tests.py # Test runner with nice display
โโโ README.md # This file
๐ Requirements
Runtime Requirements
- Python: 3.10+
- pydantic: >=2.0.0,<3.0.0
- requests: >=2.31.0
- httpx: >=0.24.0 (for async support)
- aiohttp: >=3.8.0 (for async HTTP)
Optional Dependencies
- stomp.py: >=8.1.0 (for ActiveMQ events)
- ujson: >=5.7.0 (faster JSON parsing)
- requests-oauthlib: >=1.3.0 (OAuth support)
๐ ๏ธ Contributing
For development workflows, code generation, testing, and contribution guidelines, see ๐ Package Developers Guide.
๐ค Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Run tests:
pytest - Submit a pull request
๐ License
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
๐ Support
- Issues: GitHub Issues
- Documentation: Project Documentation
- Examples: Usage Examples
๐ Related Projects
- Model Context Protocol (MCP): MCP Documentation - Standard for AI-data source and function integration
- Alfresco Community Edition: Community Documentation
- Alfresco Enterprise Edition: Enterprise Documentation
- Pydantic: Type validation library
- Datamodel-code-generator: Pydantic model generator
- Openapi-python-client: HTTP client generator
- MCP Server based on Python Alfresco API: python-alfresco-mcp-server
โญ Star History
If this project helps you, please consider giving it a star! โญ
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file python_alfresco_api-1.1.5.tar.gz.
File metadata
- Download URL: python_alfresco_api-1.1.5.tar.gz
- Upload date:
- Size: 817.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d980834f2ae946af939e1901746abfaed7ca4ae05d44363f6f7924bb02c1c83
|
|
| MD5 |
27e87518809d0309871b47169acc2b64
|
|
| BLAKE2b-256 |
b34b0a438388202d0a1e1bc7c9c90207d5aba42cba9e22507c0e3d5e2a14d69f
|
File details
Details for the file python_alfresco_api-1.1.5-py3-none-any.whl.
File metadata
- Download URL: python_alfresco_api-1.1.5-py3-none-any.whl
- Upload date:
- Size: 936.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
28b7098b30a6d3318f66d9892893676e668e655519b0e72587834511452bbc3f
|
|
| MD5 |
f815a02e4946421b7268842b1ee3385f
|
|
| BLAKE2b-256 |
88dd93311ca4e4cfc2f14f4b113a29c37154c5868e5c54a987b6d6449cd3ca53
|