"""
Repository resources for Alfresco MCP Server.
Self-contained resources for repository information, health, stats, and configuration.
Returns data or indicates when unavailable.
"""
import json
import logging
import os
from python_alfresco_api.client_factory import ClientFactory
from ..utils.connection import ensure_connection, get_client_factory
from ..utils.json_utils import safe_format_output
logger = logging.getLogger(__name__)
async def get_repository_info_impl() -> str:
"""Get Alfresco repository information using Discovery API.
Returns comprehensive repository details or connection status.
"""
try:
await ensure_connection()
client_factory: ClientFactory = await get_client_factory()
logger.info("Getting repository information via Discovery API")
# Use the working pattern from test script - high-level API
discovery_client = client_factory.create_discovery_client()
# Check if discovery client has the discovery attribute (working pattern from test)
if not hasattr(discovery_client, 'discovery'):
logger.warning("Discovery client does not have discovery attribute")
return safe_format_output(f"""β οΈ **Repository Information - Discovery Client Unavailable**
**Status**: Discovery client initialization failed
**Available Information**:
π **Server**: {os.getenv('ALFRESCO_URL', 'http://localhost:8080')}
π€ **Connected as**: {os.getenv('ALFRESCO_USERNAME', 'admin')}
β **Discovery API**: Client not available
**Note**: This could indicate:
- Authentication issues
- Network connectivity problems
- Server configuration issues
**Recommendation**: Check connection settings and server status.""")
# Get repository information using high-level Discovery API (working pattern from test)
repo_info = discovery_client.discovery.get_repository_information()
# Handle None response (HTTP 501 - Discovery API disabled)
if repo_info is None:
logger.warning("Discovery API is disabled on this Alfresco instance (returned None)")
return safe_format_output(f"""β οΈ **Repository Information - Discovery API Disabled**
**Status**: Discovery API is disabled on this Alfresco instance (HTTP 501)
**Available Information**:
π **Server**: {os.getenv('ALFRESCO_URL', 'http://localhost:8080')}
π€ **Connected as**: {os.getenv('ALFRESCO_USERNAME', 'admin')}
β
**Core API**: Available (connection successful)
β **Discovery API**: Disabled by administrator
**Note**: The Discovery API provides detailed repository information including:
- Version and edition details
- License information and entitlements
- Installed modules and their versions
- Repository status and capabilities
**Administrator Action Required**: To enable Discovery API, the Alfresco administrator needs to:
1. Enable the Discovery API in the repository configuration
2. Restart the Alfresco service
3. Ensure proper permissions are configured
**Alternative**: Use Core API tools for basic repository operations.""")
if repo_info and hasattr(repo_info, 'entry'):
entry = repo_info.entry
repository = getattr(entry, 'repository', {})
# Build comprehensive repository information
result = "π’ **Alfresco Repository Information**\n\n"
# Repository ID and Edition
repo_id = getattr(repository, 'id', 'Unknown')
edition = getattr(repository, 'edition', 'Unknown')
logger.info(f"β
Retrieved repository info: {edition} edition")
result += f"π **Repository ID**: {repo_id}\n"
result += f"π·οΈ **Edition**: {edition}\n\n"
# Version Information
version_info = getattr(repository, 'version', {})
if hasattr(version_info, 'major'):
result += "π¦ **Version Details**:\n"
result += f" β’ Major: {getattr(version_info, 'major', 'Unknown')}\n"
result += f" β’ Minor: {getattr(version_info, 'minor', 'Unknown')}\n"
result += f" β’ Patch: {getattr(version_info, 'patch', 'Unknown')}\n"
result += f" β’ Hotfix: {getattr(version_info, 'hotfix', 'Unknown')}\n"
result += f" β’ Schema: {getattr(version_info, 'schema', 'Unknown')}\n"
result += f" β’ Label: {getattr(version_info, 'label', 'Unknown')}\n"
result += f" β’ Display: {getattr(version_info, 'display', 'Unknown')}\n\n"
# Repository Status
status_info = getattr(repository, 'status', {})
if hasattr(status_info, 'is_read_only'):
result += "STATUS **Repository Status**:\n"
result += f" β’ Read Only: {'Yes' if getattr(status_info, 'is_read_only', False) else 'No'}\n"
result += f" β’ Audit Enabled: {'Yes' if getattr(status_info, 'is_audit_enabled', False) else 'No'}\n"
result += f" β’ Quick Share Enabled: {'Yes' if getattr(status_info, 'is_quick_share_enabled', False) else 'No'}\n"
result += f" β’ Thumbnail Generation: {'Yes' if getattr(status_info, 'is_thumbnail_generation_enabled', False) else 'No'}\n\n"
# License Information
license_info = getattr(repository, 'license', {})
if hasattr(license_info, 'issued_at'):
result += "π **License Information**:\n"
result += f" β’ Issued At: {getattr(license_info, 'issued_at', 'Unknown')}\n"
result += f" β’ Expires At: {getattr(license_info, 'expires_at', 'Unknown')}\n"
result += f" β’ Remaining Days: {getattr(license_info, 'remaining_days', 'Unknown')}\n"
result += f" β’ Holder: {getattr(license_info, 'holder', 'Unknown')}\n"
result += f" β’ Mode: {getattr(license_info, 'mode', 'Unknown')}\n"
# License Entitlements
entitlements = getattr(license_info, 'entitlements', {})
if hasattr(entitlements, 'max_users'):
result += f" β’ Max Users: {getattr(entitlements, 'max_users', 'Unknown')}\n"
result += f" β’ Max Documents: {getattr(entitlements, 'max_docs', 'Unknown')}\n"
result += f" β’ Cluster Enabled: {'Yes' if getattr(entitlements, 'is_cluster_enabled', False) else 'No'}\n"
result += f" β’ Cryptodoc Enabled: {'Yes' if getattr(entitlements, 'is_cryptodoc_enabled', False) else 'No'}\n"
result += "\n"
# Modules Information
modules = getattr(repository, 'modules', [])
if modules and len(modules) > 0:
result += f"π§© **Installed Modules** ({len(modules)} total):\n"
for i, module in enumerate(modules[:10], 1): # Show first 10 modules
module_id = getattr(module, 'id', 'Unknown')
module_title = getattr(module, 'title', 'Unknown')
module_version = getattr(module, 'version', 'Unknown')
module_state = getattr(module, 'install_state', 'Unknown')
result += f" {i}. **{module_title}** (ID: {module_id})\n"
result += f" β’ Version: {module_version}\n"
result += f" β’ State: {module_state}\n"
install_date = getattr(module, 'install_date', None)
if install_date:
result += f" β’ Installed: {install_date}\n"
result += "\n"
if len(modules) > 10:
result += f" *... and {len(modules) - 10} more modules*\n\n"
# Connection Details
result += "π **Connection Details**:\n"
result += f" β’ Server: {os.getenv('ALFRESCO_URL', 'http://localhost:8080')}\n"
result += f" β’ Connected as: {os.getenv('ALFRESCO_USERNAME', 'admin')}\n"
result += f" β’ Data Source: Discovery API (High-Level)\n"
return safe_format_output(result)
except Exception as discovery_error:
error_str = str(discovery_error)
# Check if Discovery API is disabled (501 error)
if "501" in error_str or "Discovery is disabled" in error_str:
logger.warning("Discovery API is disabled on this Alfresco instance")
return safe_format_output(f"""WARNING: **Repository Information - Discovery API Disabled**
**Status**: Discovery API is disabled on this Alfresco instance (HTTP 501)
**Available Information**:
π **Server**: {os.getenv('ALFRESCO_URL', 'http://localhost:8080')}
π€ **Connected as**: {os.getenv('ALFRESCO_USERNAME', 'admin')}
β
**Core API**: Available (connection successful)
β **Discovery API**: Disabled by administrator
**Note**: The Discovery API provides detailed repository information including:
- Version and edition details
- License information and entitlements
- Installed modules and their versions
- Repository status and capabilities
**Administrator Action Required**: To enable Discovery API, the Alfresco administrator needs to:
1. Enable the Discovery API in the repository configuration
2. Restart the Alfresco service
3. Ensure proper permissions are configured
**Alternative**: Use Core API tools for basic repository operations.""")
else:
# Other Discovery API errors
logger.error(f"Discovery API failed: {error_str}")
return safe_format_output(f"""ERROR: **Repository Information Unavailable**
**Error**: Discovery API failed
**Details**: {error_str}
π **Server**: {os.getenv('ALFRESCO_URL', 'http://localhost:8080')}
π€ **Connected as**: {os.getenv('ALFRESCO_USERNAME', 'admin')}
**Possible Causes**:
- Discovery API endpoint not available
- Insufficient permissions
- Network connectivity issues
- Repository service issues
**Recommendation**: Check server logs and verify Discovery API availability.""")