This is page 4 of 4. Use http://codebase.md/stevereiner/python-alfresco-mcp-server?lines=true&page={x} to view the full context. # Directory Structure ``` ├── .gitattributes ├── .gitignore ├── .vscode │ ├── mcp.json │ └── settings.json ├── alfresco_mcp_server │ ├── __init__.py │ ├── config.py │ ├── fastmcp_server.py │ ├── prompts │ │ ├── __init__.py │ │ └── search_and_analyze.py │ ├── resources │ │ ├── __init__.py │ │ └── repository_resources.py │ ├── tools │ │ ├── __init__.py │ │ ├── core │ │ │ ├── __init__.py │ │ │ ├── browse_repository.py │ │ │ ├── cancel_checkout.py │ │ │ ├── checkin_document.py │ │ │ ├── checkout_document.py │ │ │ ├── create_folder.py │ │ │ ├── delete_node.py │ │ │ ├── download_document.py │ │ │ ├── get_node_properties.py │ │ │ ├── update_node_properties.py │ │ │ └── upload_document.py │ │ └── search │ │ ├── __init__.py │ │ ├── advanced_search.py │ │ ├── cmis_search.py │ │ ├── search_by_metadata.py │ │ └── search_content.py │ └── utils │ ├── __init__.py │ ├── connection.py │ ├── file_type_analysis.py │ └── json_utils.py ├── CHANGELOG.md ├── claude-desktop-config-pipx-macos.json ├── claude-desktop-config-pipx-windows.json ├── claude-desktop-config-uv-macos.json ├── claude-desktop-config-uv-windows.json ├── claude-desktop-config-uvx-macos.json ├── claude-desktop-config-uvx-windows.json ├── config.yaml ├── docs │ ├── api_reference.md │ ├── claude_desktop_setup.md │ ├── client_configurations.md │ ├── configuration_guide.md │ ├── install_with_pip_pipx.md │ ├── mcp_inspector_setup.md │ ├── quick_start_guide.md │ ├── README.md │ ├── testing_guide.md │ └── troubleshooting.md ├── examples │ ├── batch_operations.py │ ├── document_lifecycle.py │ ├── error_handling.py │ ├── examples_summary.md │ ├── quick_start.py │ ├── README.md │ └── transport_examples.py ├── LICENSE ├── MANIFEST.in ├── mcp-inspector-http-pipx-config.json ├── mcp-inspector-http-uv-config.json ├── mcp-inspector-http-uvx-config.json ├── mcp-inspector-stdio-pipx-config.json ├── mcp-inspector-stdio-uv-config.json ├── mcp-inspector-stdio-uvx-config.json ├── prompts-for-claude.md ├── pyproject.toml ├── pytest.ini ├── README.md ├── run_server.py ├── sample-dot-env.txt ├── scripts │ ├── run_tests.py │ └── test.bat ├── tests │ ├── __init__.py │ ├── conftest.py │ ├── mcp_specific │ │ ├── MCP_INSPECTOR_CONNECTION.md │ │ ├── mcp_testing_guide.md │ │ ├── START_HTTP_SERVER.md │ │ ├── START_MCP_INSPECTOR.md │ │ ├── test_http_server.ps1 │ │ ├── test_with_mcp_inspector.md │ │ └── TESTING_INSTRUCTIONS.md │ ├── README.md │ ├── test_coverage.py │ ├── test_fastmcp_2_0.py │ ├── test_integration.py │ └── test_unit_tools.py ├── tests-debug │ └── README.md └── uv.lock ``` # Files -------------------------------------------------------------------------------- /docs/api_reference.md: -------------------------------------------------------------------------------- ```markdown 1 | # API Reference 2 | 3 | Complete reference for all Alfresco MCP Server tools, resources, and prompts. This document provides detailed information about parameters, responses, and usage examples for our modular FastMCP 2.0 architecture. 4 | 5 | ## 📋 Overview 6 | 7 | The Alfresco MCP Server provides 15 tools for document management, 1 repository resource, and 1 AI-powered prompt for analysis. 8 | 9 | ### Quick Reference 10 | 11 | **🔍 Search Tools (4)** 12 | | Tool | Purpose | Input | Output | 13 | |------|---------|-------|--------| 14 | | [`search_content`](#search_content) | Search documents/folders | query, max_results, node_type | Search results with nodes | 15 | | [`advanced_search`](#advanced_search) | Advanced search with filters | query, content_type, created_after, etc. | Filtered search results | 16 | | [`search_by_metadata`](#search_by_metadata) | Search by metadata properties | property_name, property_value, comparison | Property-based results | 17 | | [`cmis_search`](#cmis_search) | CMIS SQL queries | cmis_query, preset, max_results | SQL query results | 18 | 19 | **🛠️ Core Tools (11)** 20 | | Tool | Purpose | Input | Output | 21 | |------|---------|-------|--------| 22 | | [`browse_repository`](#browse_repository) | Browse repository folders | node_id | Folder contents | 23 | | [`repository_info`](#repository_info) | Get repository information | None | Repository status/info | 24 | | [`upload_document`](#upload_document) | Upload new document | filename, content_base64, parent_id | Upload status | 25 | | [`download_document`](#download_document) | Download document content | node_id, save_to_disk | Base64 encoded content | 26 | | [`create_folder`](#create_folder) | Create new folder | folder_name, parent_id, description | Creation status | 27 | | [`get_node_properties`](#get_node_properties) | Get node metadata | node_id | Properties object | 28 | | [`update_node_properties`](#update_node_properties) | Update metadata | node_id, name, title, description, author | Update status | 29 | | [`delete_node`](#delete_node) | Delete document/folder | node_id, permanent | Deletion status | 30 | | [`checkout_document`](#checkout_document) | Lock document for editing | node_id, download_for_editing | Checkout status | 31 | | [`checkin_document`](#checkin_document) | Save new version | node_id, comment, major_version, file_path | Checkin status | 32 | | [`cancel_checkout`](#cancel_checkout) | Cancel checkout/unlock | node_id | Cancel status | 33 | 34 | **📄 Resources (1)** 35 | | Resource | Purpose | URI | Output | 36 | |----------|---------|-----|--------| 37 | | [`repository_info`](#repository_info_resource) | Repository status and configuration | alfresco://repository/info | Repository details | 38 | 39 | ## 🔍 Search Tools 40 | 41 | ### `search_content` 42 | 43 | Search for documents and folders in the Alfresco repository. 44 | 45 | **Parameters:** 46 | ```json 47 | { 48 | "query": "string", // Search query (required) 49 | "max_results": "integer" // Maximum results to return (optional, default: 25) 50 | } 51 | ``` 52 | 53 | **Response:** 54 | ```json 55 | { 56 | "results": [ 57 | { 58 | "id": "node-id", 59 | "name": "document.pdf", 60 | "nodeType": "cm:content", 61 | "isFile": true, 62 | "isFolder": false, 63 | "properties": { 64 | "cm:title": "Document Title", 65 | "cm:description": "Document description", 66 | "cm:created": "2024-01-15T10:30:00.000Z", 67 | "cm:modified": "2024-01-15T15:45:00.000Z", 68 | "cm:creator": "admin", 69 | "cm:modifier": "user1" 70 | }, 71 | "path": "/Company Home/Sites/example/documentLibrary/document.pdf" 72 | } 73 | ], 74 | "totalCount": 1 75 | } 76 | ``` 77 | 78 | **Example:** 79 | ```python 80 | # Basic search 81 | result = await client.call_tool("search_content", { 82 | "query": "financial report", 83 | "max_results": 10 84 | }) 85 | 86 | # Wildcard search 87 | result = await client.call_tool("search_content", { 88 | "query": "*", 89 | "max_results": 5 90 | }) 91 | 92 | # Specific term search 93 | result = await client.call_tool("search_content", { 94 | "query": "budget 2024" 95 | }) 96 | ``` 97 | 98 | ### `advanced_search` 99 | 100 | Advanced search with filters, sorting, and AFTS query language support. 101 | 102 | **Parameters:** 103 | ```json 104 | { 105 | "query": "string", // AFTS query (required) 106 | "content_type": "string", // Content type filter (optional) 107 | "created_after": "string", // Date filter YYYY-MM-DD (optional) 108 | "created_before": "string", // Date filter YYYY-MM-DD (optional) 109 | "sort_field": "string", // Sort field (optional, default: "score") 110 | "sort_order": "string", // Sort order "ASC" or "DESC" (optional) 111 | "max_results": "integer" // Maximum results (optional, default: 25) 112 | } 113 | ``` 114 | 115 | **Example:** 116 | ```python 117 | # Advanced search with filters 118 | result = await client.call_tool("advanced_search", { 119 | "query": "TYPE:cm:content AND cm:title:financial", 120 | "content_type": "pdf", 121 | "created_after": "2024-01-01", 122 | "sort_field": "cm:modified", 123 | "sort_order": "DESC", 124 | "max_results": 20 125 | }) 126 | ``` 127 | 128 | ### `search_by_metadata` 129 | 130 | Search by specific metadata properties with comparison operators. 131 | 132 | **Parameters:** 133 | ```json 134 | { 135 | "property_name": "string", // Property name (required) e.g., "cm:title" 136 | "property_value": "string", // Property value to search for (required) 137 | "comparison": "string", // Comparison operator (optional, default: "equals") 138 | "max_results": "integer" // Maximum results (optional, default: 25) 139 | } 140 | ``` 141 | 142 | **Comparison operators:** `equals`, `contains`, `starts_with`, `ends_with`, `greater_than`, `less_than` 143 | 144 | **Example:** 145 | ```python 146 | # Search by title containing text 147 | result = await client.call_tool("search_by_metadata", { 148 | "property_name": "cm:title", 149 | "property_value": "Annual Report", 150 | "comparison": "contains", 151 | "max_results": 15 152 | }) 153 | 154 | # Search by creation date 155 | result = await client.call_tool("search_by_metadata", { 156 | "property_name": "cm:created", 157 | "property_value": "2024-01-01", 158 | "comparison": "greater_than" 159 | }) 160 | ``` 161 | 162 | ### `cmis_search` 163 | 164 | Execute CMIS SQL queries for complex content discovery. 165 | 166 | **Parameters:** 167 | ```json 168 | { 169 | "cmis_query": "string", // CMIS SQL query (required) 170 | "preset": "string", // Preset query type (optional) 171 | "max_results": "integer" // Maximum results (optional, default: 25) 172 | } 173 | ``` 174 | 175 | **Preset options:** `all_documents`, `all_folders`, `recent_content` 176 | 177 | **Example:** 178 | ```python 179 | # CMIS SQL query 180 | result = await client.call_tool("cmis_search", { 181 | "cmis_query": "SELECT * FROM cmis:document WHERE cmis:name LIKE '%report%'", 182 | "max_results": 30 183 | }) 184 | 185 | # Using preset 186 | result = await client.call_tool("cmis_search", { 187 | "preset": "recent_content", 188 | "max_results": 10 189 | }) 190 | ``` 191 | 192 | ## 🗂️ Repository Operations 193 | 194 | ### `browse_repository` 195 | 196 | Browse repository folders and their contents. 197 | 198 | **Parameters:** 199 | ```json 200 | { 201 | "node_id": "string" // Folder node ID (optional, default: "-root-") 202 | } 203 | ``` 204 | 205 | **Example:** 206 | ```python 207 | # Browse root folder 208 | result = await client.call_tool("browse_repository", { 209 | "node_id": "-root-" 210 | }) 211 | 212 | # Browse specific folder 213 | result = await client.call_tool("browse_repository", { 214 | "node_id": "folder-abc123-def456" 215 | }) 216 | ``` 217 | 218 | ### `repository_info` 219 | 220 | Get repository information, version, and configuration details. 221 | 222 | **Parameters:** None 223 | 224 | **Example:** 225 | ```python 226 | # Get repository information 227 | result = await client.call_tool("repository_info", {}) 228 | ``` 229 | 230 | ## 📤 Document Upload 231 | 232 | ### `upload_document` 233 | 234 | Upload a new document to the Alfresco repository. 235 | 236 | **Parameters:** 237 | ```json 238 | { 239 | "filename": "string", // Document filename (required) 240 | "content_base64": "string", // Base64 encoded content (required) 241 | "parent_id": "string", // Parent folder ID (optional, default: "-root-") 242 | "description": "string" // Document description (optional) 243 | } 244 | ``` 245 | 246 | **Response:** 247 | ```json 248 | { 249 | "success": true, 250 | "nodeId": "abc123-def456-ghi789", 251 | "filename": "document.pdf", 252 | "parentId": "-root-", 253 | "path": "/Company Home/document.pdf" 254 | } 255 | ``` 256 | 257 | **Example:** 258 | ```python 259 | import base64 260 | 261 | # Prepare content 262 | content = "This is my document content" 263 | content_b64 = base64.b64encode(content.encode()).decode() 264 | 265 | # Upload to root 266 | result = await client.call_tool("upload_document", { 267 | "filename": "my_document.txt", 268 | "content_base64": content_b64, 269 | "parent_id": "-root-", 270 | "description": "My first document" 271 | }) 272 | 273 | # Upload to specific folder 274 | result = await client.call_tool("upload_document", { 275 | "filename": "report.pdf", 276 | "content_base64": pdf_content_b64, 277 | "parent_id": "folder-node-id", 278 | "description": "Monthly report" 279 | }) 280 | ``` 281 | 282 | ## 📥 Document Download 283 | 284 | ### `download_document` 285 | 286 | Download the content of a document from the repository. 287 | 288 | **Parameters:** 289 | ```json 290 | { 291 | "node_id": "string" // Document node ID (required) 292 | } 293 | ``` 294 | 295 | **Response:** 296 | ```json 297 | { 298 | "success": true, 299 | "nodeId": "abc123-def456-ghi789", 300 | "filename": "document.pdf", 301 | "mimeType": "application/pdf", 302 | "size": 1024, 303 | "content_base64": "JVBERi0xLjQKJ..." 304 | } 305 | ``` 306 | 307 | **Example:** 308 | ```python 309 | # Download document 310 | result = await client.call_tool("download_document", { 311 | "node_id": "abc123-def456-ghi789" 312 | }) 313 | 314 | # Decode content 315 | import base64 316 | content = base64.b64decode(result.content_base64).decode() 317 | print(content) 318 | ``` 319 | 320 | ## 🔄 Version Control 321 | 322 | ### `checkout_document` 323 | 324 | Check out a document for editing (locks the document). 325 | 326 | **Parameters:** 327 | ```json 328 | { 329 | "node_id": "string" // Document node ID (required) 330 | } 331 | ``` 332 | 333 | **Response:** 334 | ```json 335 | { 336 | "success": true, 337 | "nodeId": "abc123-def456-ghi789", 338 | "workingCopyId": "abc123-def456-ghi789-wc", 339 | "status": "checked_out" 340 | } 341 | ``` 342 | 343 | ### `checkin_document` 344 | 345 | Check in a document with a new version. 346 | 347 | **Parameters:** 348 | ```json 349 | { 350 | "node_id": "string", // Document node ID (required) 351 | "comment": "string", // Version comment (optional) 352 | "major_version": "boolean" // Major version increment (optional, default: false) 353 | } 354 | ``` 355 | 356 | **Response:** 357 | ```json 358 | { 359 | "success": true, 360 | "nodeId": "abc123-def456-ghi789", 361 | "version": "1.1", 362 | "comment": "Updated content", 363 | "isMajorVersion": false 364 | } 365 | ``` 366 | 367 | **Example:** 368 | ```python 369 | # Checkout document 370 | checkout_result = await client.call_tool("checkout_document", { 371 | "node_id": "doc-node-id" 372 | }) 373 | 374 | # Make changes (simulated) 375 | # ... edit the document ... 376 | 377 | # Checkin as minor version 378 | checkin_result = await client.call_tool("checkin_document", { 379 | "node_id": "doc-node-id", 380 | "comment": "Fixed typos and updated content", 381 | "major_version": False 382 | }) 383 | 384 | # Checkin as major version 385 | major_checkin = await client.call_tool("checkin_document", { 386 | "node_id": "doc-node-id", 387 | "comment": "Major content overhaul", 388 | "major_version": True 389 | }) 390 | ``` 391 | 392 | ### `cancel_checkout` 393 | 394 | Cancel the checkout of a document, unlocking it without saving changes. 395 | 396 | **Parameters:** 397 | ```json 398 | { 399 | "node_id": "string" // Document node ID (required) 400 | } 401 | ``` 402 | 403 | **Response:** 404 | ```json 405 | { 406 | "success": true, 407 | "nodeId": "doc-node-id", 408 | "message": "Checkout cancelled successfully", 409 | "unlocked": true 410 | } 411 | ``` 412 | 413 | **Example:** 414 | ```python 415 | # Cancel checkout (unlock without saving) 416 | cancel_result = await client.call_tool("cancel_checkout", { 417 | "node_id": "doc-node-id" 418 | }) 419 | 420 | # Typical workflow: checkout -> cancel if needed 421 | checkout_result = await client.call_tool("checkout_document", { 422 | "node_id": "doc-node-id" 423 | }) 424 | 425 | # If you decide not to make changes 426 | cancel_result = await client.call_tool("cancel_checkout", { 427 | "node_id": "doc-node-id" 428 | }) 429 | ``` 430 | 431 | ## 🗑️ Node Deletion 432 | 433 | ### `delete_node` 434 | 435 | Delete a document or folder from the repository. 436 | 437 | **Parameters:** 438 | ```json 439 | { 440 | "node_id": "string", // Node ID to delete (required) 441 | "permanent": "boolean" // Permanent deletion (optional, default: false) 442 | } 443 | ``` 444 | 445 | **Response:** 446 | ```json 447 | { 448 | "success": true, 449 | "nodeId": "abc123-def456-ghi789", 450 | "permanent": false, 451 | "status": "moved_to_trash" 452 | } 453 | ``` 454 | 455 | **Example:** 456 | ```python 457 | # Move to trash (soft delete) 458 | result = await client.call_tool("delete_node", { 459 | "node_id": "node-to-delete", 460 | "permanent": False 461 | }) 462 | 463 | # Permanent deletion 464 | result = await client.call_tool("delete_node", { 465 | "node_id": "node-to-delete", 466 | "permanent": True 467 | }) 468 | ``` 469 | 470 | ## ⚙️ Property Management 471 | 472 | ### `get_node_properties` 473 | 474 | Retrieve all properties and metadata for a node. 475 | 476 | **Parameters:** 477 | ```json 478 | { 479 | "node_id": "string" // Node ID (required) 480 | } 481 | ``` 482 | 483 | **Response:** 484 | ```json 485 | { 486 | "success": true, 487 | "nodeId": "abc123-def456-ghi789", 488 | "properties": { 489 | "cm:name": "document.pdf", 490 | "cm:title": "Important Document", 491 | "cm:description": "This is an important document", 492 | "cm:created": "2024-01-15T10:30:00.000Z", 493 | "cm:modified": "2024-01-15T15:45:00.000Z", 494 | "cm:creator": "admin", 495 | "cm:modifier": "user1", 496 | "cm:owner": "admin", 497 | "sys:node-uuid": "abc123-def456-ghi789", 498 | "sys:store-protocol": "workspace", 499 | "sys:store-identifier": "SpacesStore" 500 | } 501 | } 502 | ``` 503 | 504 | ### `update_node_properties` 505 | 506 | Update properties and metadata for a node. 507 | 508 | **Parameters:** 509 | ```json 510 | { 511 | "node_id": "string", // Node ID (required) 512 | "properties": "object" // Properties to update (required) 513 | } 514 | ``` 515 | 516 | **Response:** 517 | ```json 518 | { 519 | "success": true, 520 | "nodeId": "abc123-def456-ghi789", 521 | "updatedProperties": { 522 | "cm:title": "Updated Title", 523 | "cm:description": "Updated description" 524 | } 525 | } 526 | ``` 527 | 528 | **Example:** 529 | ```python 530 | # Get current properties 531 | props_result = await client.call_tool("get_node_properties", { 532 | "node_id": "abc123-def456-ghi789" 533 | }) 534 | 535 | print("Current properties:", props_result[0].text) 536 | 537 | # Update properties 538 | update_result = await client.call_tool("update_node_properties", { 539 | "node_id": "abc123-def456-ghi789", 540 | "properties": { 541 | "cm:title": "Updated Document Title", 542 | "cm:description": "This document has been updated", 543 | "custom:project": "Project Alpha", 544 | "custom:status": "approved" 545 | } 546 | }) 547 | ``` 548 | 549 | ## 📁 Folder Operations 550 | 551 | ### `create_folder` 552 | 553 | Create a new folder in the repository. 554 | 555 | **Parameters:** 556 | ```json 557 | { 558 | "folder_name": "string", // Folder name (required) 559 | "parent_id": "string", // Parent folder ID (optional, default: "-root-") 560 | "description": "string" // Folder description (optional) 561 | } 562 | ``` 563 | 564 | **Response:** 565 | ```json 566 | { 567 | "success": true, 568 | "nodeId": "folder-abc123-def456", 569 | "folderName": "New Folder", 570 | "parentId": "-root-", 571 | "path": "/Company Home/New Folder" 572 | } 573 | ``` 574 | 575 | **Example:** 576 | ```python 577 | # Create folder in root 578 | result = await client.call_tool("create_folder", { 579 | "folder_name": "Project Documents", 580 | "parent_id": "-root-", 581 | "description": "Documents for the current project" 582 | }) 583 | 584 | # Create nested folder 585 | result = await client.call_tool("create_folder", { 586 | "folder_name": "Reports", 587 | "parent_id": "parent-folder-id", 588 | "description": "Monthly and quarterly reports" 589 | }) 590 | ``` 591 | 592 | ## 📚 Resources 593 | 594 | ### Repository Resources 595 | 596 | Access repository information and status: 597 | 598 | ```python 599 | # Repository information 600 | info = await client.read_resource("alfresco://repository/info") 601 | 602 | # Repository health status 603 | health = await client.read_resource("alfresco://repository/health") 604 | 605 | # Repository statistics 606 | stats = await client.read_resource("alfresco://repository/stats") 607 | 608 | # Repository configuration 609 | config = await client.read_resource("alfresco://repository/config") 610 | ``` 611 | 612 | **Resource Responses:** 613 | ```json 614 | { 615 | "repository": { 616 | "edition": "Community", 617 | "version": "7.4.0", 618 | "status": "healthy", 619 | "modules": ["content-services", "search-services"] 620 | } 621 | } 622 | ``` 623 | 624 | ## 💭 Prompts 625 | 626 | ### `search_and_analyze` 627 | 628 | Generate AI-powered analysis prompts for search results. 629 | 630 | **Parameters:** 631 | ```json 632 | { 633 | "query": "string", // Search query (required) 634 | "analysis_type": "string" // Analysis type: summary, detailed, trends, compliance (required) 635 | } 636 | ``` 637 | 638 | **Response:** 639 | ```json 640 | { 641 | "messages": [ 642 | { 643 | "role": "user", 644 | "content": { 645 | "type": "text", 646 | "text": "Based on the Alfresco search results for 'financial reports', provide a detailed analysis..." 647 | } 648 | } 649 | ] 650 | } 651 | ``` 652 | 653 | **Example:** 654 | ```python 655 | # Generate analysis prompt 656 | prompt_result = await client.get_prompt("search_and_analyze", { 657 | "query": "quarterly reports 2024", 658 | "analysis_type": "summary" 659 | }) 660 | 661 | print("Generated prompt:") 662 | print(prompt_result.messages[0].content.text) 663 | ``` 664 | 665 | ## 🔍 Error Handling 666 | 667 | All tools return consistent error responses: 668 | 669 | ```json 670 | { 671 | "success": false, 672 | "error": { 673 | "code": "ALFRESCO_ERROR", 674 | "message": "Authentication failed", 675 | "details": "Invalid username or password" 676 | } 677 | } 678 | ``` 679 | 680 | Common error codes: 681 | - `AUTHENTICATION_ERROR`: Invalid credentials 682 | - `NODE_NOT_FOUND`: Specified node doesn't exist 683 | - `PERMISSION_DENIED`: Insufficient permissions 684 | - `INVALID_PARAMETER`: Missing or invalid parameters 685 | - `CONNECTION_ERROR`: Cannot connect to Alfresco server 686 | 687 | ## 📄 Resources 688 | 689 | Resources provide access to repository information and metadata without modifying content. 690 | 691 | ### `repository_info` (Resource) {#repository_info_resource} 692 | 693 | Get comprehensive repository information including version, license, and configuration. 694 | 695 | **URI:** `alfresco://repository/info` 696 | 697 | **Response:** 698 | ```json 699 | { 700 | "repository": { 701 | "id": "alfresco-community-2023.2", 702 | "edition": "Community", 703 | "version": { 704 | "major": "23", 705 | "minor": "2", 706 | "patch": "0", 707 | "hotfix": "0", 708 | "schema": "14005", 709 | "label": "r135432-b14", 710 | "display": "Community v23.2.0 (r135432-b14) schema 14005" 711 | }, 712 | "status": { 713 | "readOnly": false, 714 | "auditEnabled": true, 715 | "quickShareEnabled": true, 716 | "thumbnailGenerationEnabled": true 717 | }, 718 | "license": { 719 | "issuedAt": "2024-01-01T00:00:00.000Z", 720 | "expiresAt": "2024-12-31T23:59:59.000Z", 721 | "remainingDays": 365, 722 | "holder": "Community Edition", 723 | "mode": "ENTERPRISE", 724 | "entitlements": { 725 | "maxUsers": 0, 726 | "maxDocs": 0 727 | } 728 | }, 729 | "modules": [ 730 | { 731 | "id": "alfresco-share-services", 732 | "title": "Alfresco Share Services", 733 | "version": "23.2.0", 734 | "installState": "INSTALLED", 735 | "installDate": "2024-01-15T10:30:00.000Z" 736 | } 737 | ] 738 | } 739 | } 740 | ``` 741 | 742 | **Example:** 743 | ```python 744 | # Read repository information 745 | info = await client.read_resource("alfresco://repository/info") 746 | print(info[0].text) 747 | 748 | # Repository info is also available as a tool 749 | tool_result = await client.call_tool("repository_info", {}) 750 | ``` 751 | 752 | **Use Cases:** 753 | - Health checks and monitoring 754 | - Version compatibility verification 755 | - License compliance checking 756 | - System status reporting 757 | - Administrative dashboards 758 | 759 | ## 📊 Rate Limits and Performance 760 | 761 | - **Default timeout**: 30 seconds per operation 762 | - **Concurrent operations**: Up to 10 simultaneous requests 763 | - **File size limits**: 100MB per upload 764 | - **Search limits**: Maximum 1000 results per search 765 | 766 | ## 🔐 Security Considerations 767 | 768 | - All communications use HTTPS when available 769 | - Credentials are passed securely via environment variables 770 | - Base64 encoding for document content transfer 771 | - Node IDs are validated before operations 772 | 773 | --- 774 | 775 | **📝 Note**: This API reference covers version 1.1.0 of the Alfresco MCP Server. This release includes all 15 tools with FastMCP 2.0 implementation. ```