#
tokens: 7584/50000 1/85 files (page 4/4)
lines: on (toggle) GitHub
raw markdown copy reset
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. 
```
Page 4/4FirstPrevNextLast