# Test Results — nextcloud-mcp Date: 2026-05-11 ## Test Environment - Server: cloud.beatrice.wtf - User: astro_bea - Test folder: `/__ncmcp_test__/` (created and cleaned up) ## Tool Tests ### Browsing & Discovery (5 tools) | # | Tool | Test | Result | Notes | |---|------|------|--------|-------| | 1 | `list_files` | Root `/` | ✅ | Returns array of files/folders | | 2 | `list_files` | Empty folder | ✅ | Returns `[]` | | 3 | `list_files` | Non-existent folder | ✅ | Returns 404 error | | 4 | `list_files` | `depth=infinity` | ✅ | Recursive listing works | | 5 | `get_file_info` | Existing file | ✅ | Returns extended metadata (owner, hasPreview) | | 6 | `get_file_info` | Non-existent file | ✅ | Returns 404 error | | 7 | `search_files` | By name | ✅ | Found "hello.txt" in test folder | | 8 | `search_files` | By mimeType | ✅ | Found text/plain files | | 9 | `search_files` | No results | ✅ | Returns `[]` | | 10 | `list_favorites` | After set_favorite | ✅ | Shows favorited files | | 11 | `get_quota` | Standard | ✅ | Returns used/available | ### Read & Download (3 tools) | # | Tool | Test | Result | Notes | |---|------|------|--------|-------| | 12 | `read_file` | UTF-8 text | ✅ | Returns content with encoding=utf8 | | 13 | `read_file` | Binary (base64) | ✅ | Auto-detects binary, returns base64 | | 14 | `download_file` | With metadata | ✅ | Returns downloadUrl + metadata | | 15 | `download_file` | Without metadata | ✅ | Returns downloadUrl only | | 16 | `download_folder` | ZIP format | ✅ | Returns base64-encoded ZIP | ### Write & Upload (3 tools) | # | Tool | Test | Result | Notes | |---|------|------|--------|-------| | 17 | `upload_file` | UTF-8 content | ✅ | Creates file, returns metadata | | 18 | `upload_file` | Base64 binary | ✅ | Decodes base64, uploads correctly | | 19 | `upload_file` | Overwrite | ✅ | Overwrites existing file | | 20 | `create_folder` | New folder | ✅ | Creates folder, returns metadata | | 21 | `create_folder` | Already exists | ✅ | Returns "Folder already exists" error | | 22 | `create_folder` | Parent missing (409) | ✅ | Returns clear error message | | 23 | `bulk_upload` | Multiple files | ⚠️ | Server returns 400 — endpoint may not be supported on this Nextcloud version | ### Chunked Upload (3 tools) | # | Tool | Test | Result | Notes | |---|------|------|--------|-------| | 24 | `chunked_upload_start` | Start session | ✅ | Returns uploadId, totalChunks | | 25 | `chunked_upload_chunk` | Upload chunk | ✅ | Returns success, uploadedSize | | 26 | `chunked_upload_finish` | Assemble file | ✅ | Returns file metadata, content verified | ### Move, Copy, Delete (3 tools) | # | Tool | Test | Result | Notes | |---|------|------|--------|-------| | 27 | `move_file` | Move to subfolder | ✅ | File moved, metadata returned | | 28 | `copy_file` | Copy file | ✅ | New file created with new fileId | | 29 | `move_file` | Destination exists (no overwrite) | ✅ | Returns "Destination already exists" error | | 30 | `move_file` | Overwrite=true | ✅ | Overwrites destination | | 31 | `delete_file` | Delete file | ✅ | Returns success, file goes to trash | ### Trashbin (4 tools) | # | Tool | Test | Result | Notes | |---|------|------|--------|-------| | 32 | `trash_list` | List trash | ✅ | Returns TrashedFile[] with originalName, originalLocation, deletionTime | | 33 | `trash_restore` | Restore item | ✅ | Restores to original location | | 34 | `trash_delete` | Permanent delete | ✅ | Item removed from trash | | 35 | `trash_empty` | NOT TESTED | ⏭️ | Skipped — would empty entire trashbin | ### Favorites & Versions (3 tools) | # | Tool | Test | Result | Notes | |---|------|------|--------|-------| | 36 | `set_favorite` | Add favorite | ✅ | favorite=true in metadata | | 37 | `set_favorite` | Remove favorite | ✅ | favorite=false in metadata | | 38 | `get_file_versions` | List versions | ✅ | Returns version list | ### Edge Cases | # | Test | Result | Notes | |---|------|--------|-------| | 39 | Path with spaces | ✅ | `folder with spaces/file with spaces.txt` works | | 40 | Special characters (éàü) | ✅ | `file_éàü.txt` works | | 41 | Empty folder listing | ✅ | Returns `[]` | | 42 | File overwrite | ✅ | PUT overwrites silently | | 43 | Depth=0 (single item) | ✅ | Returns single-item array | ## Summary - **35 tests passed** ✅ - **1 test skipped** (trash_empty — destructive) - **1 test failed** (bulk_upload — server-side limitation) - **3 bugs found and fixed during testing** (search parsing, trashbin paths, trash restore) ## Notes - Chunked upload requires all steps in the same process (in-memory session map). The CLI wrapper spawns a new process per call, so chunked upload must be tested via programmatic API or within a single MCP session. - `bulk_upload` depends on Nextcloud's `/remote.php/dav/bulk` endpoint which may not be available on all server versions. - The `search_files` PROPFIND fallback with `depth: infinity` on large directories (e.g., root `/`) may be slow. The WebDAV SEARCH endpoint (when available) is much faster.