Browse the file manager ("Dateien") as a filesystem
Many teachers never use topics or boards; their material sits in the course's file area, and the tools answered "0 files" for courses holding dozens of worksheets — 21 of 26 courses on the live account. Persönliche, Kurs-, Team- and Geteilte Dateien live in the legacy file store, not in files-storage, and its service is not in the public ingress. The only way in is the legacy client: HTML listings, and GET /files/signedurl for a pre-signed download. core/legacy-files.ts turns that into one path tree — /my, /courses/<course>, /teams/<team>, /shared — resolving names that contain "/", ids anywhere in a path, and wrong or ambiguous names with a message saying what is there. A listing that does not parse throws; it never reads as an empty folder. Some of the legacy client's GET routes write (GET /files/share/ mints a share token), so getFileManagerPage allows only the listing routes, by pattern. Signed URLs are fetched with no credentials and must be https. - MCP: fs_list, fs_tree, fs_find and fs_read; get_course lists course files. - CLI: schulcloud fs ls, tree, find and get, recursive and resumable. - API: /api/fs/list, tree, find and file. - Index: the crawl walks the file manager (INDEX_FILE_MANAGER, on by default), so search covers the text inside those files and sync mirrors them under <course>/Kurs-Dateien. The local instance gains a fixture for all four areas. It needed a loopback, so signed URLs open from the host, and a pre-created bucket, since MinIO does not implement PutBucketCors. 135 tests. Smoke 55/55 live; 57/57 and 55/55 on the local instance. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
14
README.md
14
README.md
@@ -17,7 +17,7 @@ instance, not inferred from the upstream source.
|
||||
> *"Find the material about Verschlüsselung and explain the Caesar cipher worksheet."*
|
||||
> *"Summarise the routing lesson from the LF10 course."*
|
||||
|
||||
Twenty tools, all read-only:
|
||||
Twenty-four tools, all read-only:
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
@@ -30,8 +30,12 @@ Twenty tools, all read-only:
|
||||
| `list_tasks` | homework across all courses, by due date |
|
||||
| `get_task` | one task: description, due date, attachments, **and your submission** |
|
||||
| `list_submissions` | what you handed in, and what is still ungraded |
|
||||
| `list_files` | files attached to any entity |
|
||||
| `download_file` | fetch a file and extract its text, or view an image |
|
||||
| `list_files` | files attached to a board element, topic, task or submission |
|
||||
| `download_file` | fetch such an attachment and extract its text, or view an image |
|
||||
| `fs_list` | list a folder of the file manager — Persönliche, Kurs-, Team-, Geteilte Dateien |
|
||||
| `fs_tree` | everything below a file-manager folder, as a tree |
|
||||
| `fs_find` | find file-manager files and folders by name |
|
||||
| `fs_read` | read a file-manager file, extracted like `download_file` |
|
||||
| `search` | keyword search across everything — **including the text inside PDFs and Office files** |
|
||||
| `refresh_index` | re-read Schulcloud now, per course or in full |
|
||||
| `what_changed` | what appeared, changed or vanished since a date |
|
||||
@@ -54,6 +58,8 @@ schulcloud login --server https://mcp.example.org --token <token>
|
||||
schulcloud sync --dry-run # see what would be mirrored
|
||||
schulcloud sync # mirror coursework to ~/Schulcloud
|
||||
schulcloud refresh --course <id>
|
||||
schulcloud fs tree /courses # browse the file manager ("Dateien")
|
||||
schulcloud fs get "/courses/<course>/<folder>"
|
||||
```
|
||||
|
||||
It talks only to the Pi and holds no Schulcloud credential — see
|
||||
@@ -151,7 +157,7 @@ npm run typecheck
|
||||
```
|
||||
|
||||
`npm run smoke` starts the HTTP server, connects a real MCP client over
|
||||
Streamable HTTP and exercises every tool against the live account — 30 checks
|
||||
Streamable HTTP and exercises every tool against the live account — 55 checks (57 with the index)
|
||||
covering the auth gate, the protocol handshake, every content chain, file
|
||||
extraction, `api_get`'s guard rails and error handling.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user