@jamestesting888/tum-mcp 0.8.1 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/README.md +56 -163
- package/docs/development.md +32 -3
- package/docs/lecture-notes.md +138 -0
- package/docs/setup.md +46 -4
- package/docs/study.md +42 -6
- package/docs/tum-mcp.md +48 -8
- package/npm/backend/manifest.json +3 -3
- package/npm/backend/requirements.txt +8 -0
- package/npm/backend/tum_mcp-0.9.1-py3-none-any.whl +0 -0
- package/npm/package-manager.mjs +1 -1
- package/npm/tum-mcp.mjs +66 -30
- package/npm/ui.mjs +51 -0
- package/package.json +9 -4
- package/npm/backend/tum_mcp-0.8.1-py3-none-any.whl +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
# Changes
|
|
2
2
|
|
|
3
|
+
## 0.9.1 — 2026-10-27
|
|
4
|
+
|
|
5
|
+
- Make Audio Notes an optional `audio-notes` extension. Keep five base skills,
|
|
6
|
+
preserve existing audio files, and describe all extensions in a compact README table.
|
|
7
|
+
|
|
8
|
+
- Use one compact terminal layout for help, connection status, extensions,
|
|
9
|
+
skills and permissions. Keep automation output available through `--json`.
|
|
10
|
+
- Give setup, install and uninstall matching status-aware pickers. Uninstall
|
|
11
|
+
offers full package removal through All. Keep named commands for scripts and
|
|
12
|
+
show optional workflow state through status, connect and doctor; remove the
|
|
13
|
+
separate extensions command group. Studocu browser sign-in stays unverified.
|
|
14
|
+
- Include TUMonline connection and permission status in doctor. Default checks
|
|
15
|
+
do not read credentials or create policy files; live checks verify identity
|
|
16
|
+
without fetching studies or grades.
|
|
17
|
+
- Make unverified status dots blue, ready/enabled green, action needed amber,
|
|
18
|
+
failures red and inactive states muted. Preserve labels with color disabled.
|
|
19
|
+
|
|
20
|
+
## 0.9.0 — 2026-10-26
|
|
21
|
+
|
|
22
|
+
- Add read-only TUMonline study, public catalog and partial curriculum-position
|
|
23
|
+
tools, with separate account permissions, verified identity and bounded paging.
|
|
24
|
+
- Add optional Studocu search and reviewed personal PDF collection through
|
|
25
|
+
`tum-mcp install studocu`. Preserve originals, course bindings and recovery
|
|
26
|
+
history; supplementary personal-use sources are excluded from publication.
|
|
27
|
+
- Add optional `tum-mcp install lecture` and Prepare Lecture for timestamped
|
|
28
|
+
Lecture Notes in the existing course app. Prefer transcripts and supplied
|
|
29
|
+
materials, skip whole-silent recordings, preserve original-time coverage and
|
|
30
|
+
request only critical video frames. Publication remains an explicit opt-in.
|
|
31
|
+
- Support isolated, pinned CPU recognition on Windows x64, Intel Mac and supported
|
|
32
|
+
Linux/WSL hosts, alongside Apple Silicon MLX acceleration. Keep heavy recognizer
|
|
33
|
+
dependencies optional; captions/imported WebVTT need no recognizer installation.
|
|
34
|
+
- Handle persistent Studocu SSE replies, enforce response IDs/search limits and
|
|
35
|
+
bound TUMonline policy reads and catalog output. Unify extension status/removal
|
|
36
|
+
and verify both optional workflows together. Shorten the getting-started guide.
|
|
37
|
+
- Preserve existing Moodle compatibility tools, sessions, downloads, customized
|
|
38
|
+
skills and existing course layouts during installation and upgrades.
|
|
39
|
+
|
|
3
40
|
## 0.8.1 — 2026-10-26
|
|
4
41
|
|
|
5
42
|
- Give every doctor/update status a dot: yellow for unverified or attention-needed
|
package/README.md
CHANGED
|
@@ -1,196 +1,89 @@
|
|
|
1
1
|
# TUM MCP
|
|
2
2
|
|
|
3
|
-
Connect your coding agent to Moodle, Artemis and
|
|
4
|
-
|
|
3
|
+
Connect your coding agent to **Moodle, Artemis, Zulip and TUMonline**. Read course
|
|
4
|
+
sources with citations and turn them into a private study app. Unofficial and
|
|
5
|
+
independent of TUM.
|
|
5
6
|
|
|
6
|
-
**
|
|
7
|
-
[Release notes](CHANGELOG.md).
|
|
7
|
+
[**npm package**](https://www.npmjs.com/package/@jamestesting888/tum-mcp) ·
|
|
8
|
+
[Release notes](CHANGELOG.md) · [Setup guide](docs/setup.md)
|
|
8
9
|
|
|
9
|
-
##
|
|
10
|
+
## Get started
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
```text
|
|
14
|
-
Install @jamestesting888/tum-mcp on this computer. Check Node.js is 22.14+.
|
|
15
|
-
Run npm install --global @jamestesting888/tum-mcp@latest, then:
|
|
16
|
-
tum-mcp setup --client codex
|
|
17
|
-
Use --client claude, cursor, antigravity, or generic for a different client.
|
|
18
|
-
Preserve existing settings and customized skills. Follow the activation steps.
|
|
19
|
-
Help me run tum-mcp connect in an interactive terminal and choose services.
|
|
20
|
-
I will complete sign-in/MFA in the browser. Never request secrets in chat.
|
|
21
|
-
Run tum-mcp doctor to explain what is available and what still needs setup.
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Connect
|
|
25
|
-
|
|
26
|
-
You need **Node.js 22.14+**, **a Chromium browser**, and your TUM account.
|
|
12
|
+
Requires **Node.js 22.14+**, a Chromium browser and your TUM account.
|
|
27
13
|
|
|
28
14
|
```sh
|
|
29
15
|
npm install --global @jamestesting888/tum-mcp@latest
|
|
30
|
-
tum-mcp setup
|
|
16
|
+
tum-mcp setup
|
|
31
17
|
tum-mcp connect
|
|
32
18
|
tum-mcp doctor
|
|
33
|
-
tum-mcp --help
|
|
34
19
|
```
|
|
35
20
|
|
|
36
|
-
Select
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
Choose a client with `--client`: `codex`, `claude`, `cursor` or `antigravity`.
|
|
42
|
-
Setup configures MCP and installs all six skills; follow any activation or
|
|
43
|
-
restart prompts. Use `generic` for manual MCP setup.
|
|
44
|
-
|
|
45
|
-
For existing Cursor and Antigravity setups, run `tum-mcp update` to add the skills.
|
|
46
|
-
Updates and uninstall preserve customized files and report them for review.
|
|
21
|
+
Select `codex`, `claude`, `cursor`, `antigravity` or `generic`, or pass `--client NAME`.
|
|
22
|
+
Follow the activation/restart instructions. In `connect`, select services with
|
|
23
|
+
**Space**, then **Enter**, and complete sign-in/MFA in the browser. Never paste
|
|
24
|
+
credentials into chat. Setup supplies its own Python runtime; Git, Docker and a
|
|
25
|
+
native keyring are unnecessary.
|
|
47
26
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
Setup supplies a private Python runtime. Connections use encrypted local
|
|
53
|
-
files and need no native keyring, Git or Docker.
|
|
27
|
+
Works on macOS, Windows, glibc Linux x86_64/ARM64 and WSL. For a Windows client
|
|
28
|
+
using a WSL backend, add `--host windows` to setup.
|
|
29
|
+
[Browser and platform details](docs/setup.md).
|
|
54
30
|
|
|
55
31
|
## Read and study
|
|
56
32
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
| Artemis | Lectures, text/online/video units, student slide PDFs, released exercise statements and permitted own feedback |
|
|
61
|
-
| Zulip | Selected course channels, discussion search and cited catch-up |
|
|
62
|
-
|
|
63
|
-
Campus access is read-only. Exercise start, deployment, execution, submission,
|
|
64
|
-
posting and read-state changes are unavailable.
|
|
65
|
-
|
|
66
|
-
### Skills and example requests
|
|
67
|
-
|
|
68
|
-
The package includes six skills. Once you've chosen a course from
|
|
69
|
-
your connections, try requests like these:
|
|
70
|
-
|
|
71
|
-
| Skill | Use it to | Example request |
|
|
72
|
-
| --- | --- | --- |
|
|
73
|
-
| `read-content` | Read and explain course sources with citations | "Can you explain what we covered in last week's lecture?" |
|
|
74
|
-
| `sync-course` | Create or refresh a course project | "Set up a study project for this course." |
|
|
75
|
-
| `prepare-study` | Build lessons, flashcards and practice | "Make me a study website with flashcards and practice questions." |
|
|
76
|
-
| `prepare-exercises` | Prepare optional hints, checks and worked solutions | "Help me work through this week's exercises in the same app." |
|
|
77
|
-
| `publish-course` | Put a prepared website on GitHub Pages | "Put my study site online so I can open it on my phone." |
|
|
78
|
-
| `audio-notes` | Save spoken lessons under `audio/` | "Turn this into audio notes I can listen to on the go." |
|
|
79
|
-
|
|
80
|
-
Useful follow-ups in an existing project:
|
|
81
|
-
|
|
82
|
-
- "Did I miss anything important on Zulip this week?"
|
|
83
|
-
- "There's new course material. Can you update my study site?"
|
|
84
|
-
- "I've left some comments on the site. Can you fix those parts?"
|
|
85
|
-
- "Can you update the audio notes too?"
|
|
86
|
-
|
|
87
|
-
Client setup installs managed copies of the
|
|
88
|
-
[skill sources](src/tum_mcp/bundled/skills/). Develop or review skills in this repository.
|
|
89
|
-
|
|
90
|
-
### Recommended study flow
|
|
91
|
-
|
|
92
|
-
1. **`sync-course`**: Set up a project for your course and collect its material.
|
|
93
|
-
Use it again when new material is available.
|
|
94
|
-
2. **`prepare-study`**: Turn that material into a study website with explanations,
|
|
95
|
-
flashcards and practice questions. Use **`prepare-exercises`** for released sheets
|
|
96
|
-
with prepared interactive guidance. Both workspaces share one app; either can come first.
|
|
97
|
-
3. **`publish-course`** (optional): Put the website online so you can study on your
|
|
98
|
-
phone. Check the [publishing requirements](#publish-for-phone-access-optional) first.
|
|
99
|
-
4. **`audio-notes`** (optional): Turn the prepared content into spoken lessons.
|
|
100
|
-
Use them to revisit prepared topics while walking or commuting.
|
|
101
|
-
|
|
102
|
-
Each project holds one course. To open the website locally, run this from the
|
|
103
|
-
course project folder:
|
|
104
|
-
|
|
105
|
-
```sh
|
|
106
|
-
tum-mcp study
|
|
107
|
-
```
|
|
33
|
+
Ask your agent to explain course material, find announcements or catch up on a
|
|
34
|
+
Zulip channel. Campus access is read-only and follows your account permissions;
|
|
35
|
+
submissions, posting and exercise execution are unavailable.
|
|
108
36
|
|
|
109
|
-
|
|
110
|
-
|
|
37
|
+
| Workflow | Example request |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| `read-content` | “Explain this week's lecture with source citations.” |
|
|
40
|
+
| `sync-course` | “Set up a project for this course and collect its materials.” |
|
|
41
|
+
| `prepare-study` | “Build lessons, flashcards and practice in a study website.” |
|
|
42
|
+
| `prepare-exercises` | “Add guided exercises from this week's released sheet.” |
|
|
43
|
+
| `publish-course` | “Publish my reviewed study site for phone access.” |
|
|
111
44
|
|
|
112
|
-
|
|
45
|
+
Each project holds one course. Run `tum-mcp study` in its folder to open the app.
|
|
46
|
+
Ask the agent to refresh it when sources change or address comments left in the
|
|
47
|
+
app. [Study guide and demo](docs/study.md).
|
|
113
48
|
|
|
114
|
-
|
|
115
|
-
|
|
49
|
+
TUMonline currently provides study names/degrees, public course catalog metadata
|
|
50
|
+
and partial course curriculum positions. The catalog does not show enrollments.
|
|
51
|
+
Grades, exams, progress and full curricula are unavailable. Review its local
|
|
52
|
+
account policy with `tum-mcp manage tumonline`.
|
|
53
|
+
[TUMonline permissions](docs/tum-mcp.md#tumonline-permissions).
|
|
116
54
|
|
|
117
|
-
|
|
118
|
-
gh auth login --hostname github.com
|
|
119
|
-
tum-mcp doctor --live
|
|
120
|
-
```
|
|
55
|
+
## Optional extensions
|
|
121
56
|
|
|
122
|
-
`
|
|
123
|
-
A coding platform's GitHub connector does not sign in the local CLI. No token
|
|
124
|
-
needs to be pasted into the agent or stored by TUM MCP.
|
|
125
|
-
|
|
126
|
-
**The repository is private. The website is public.** Review the lesson text,
|
|
127
|
-
quotations and source links before asking your agent to publish.
|
|
128
|
-
|
|
129
|
-
Later builds update the same site. `tum-mcp study` also prints its hosted URL.
|
|
130
|
-
See [publishing details](docs/study.md#publish-a-study-website).
|
|
131
|
-
|
|
132
|
-
## Sign-in and session privacy
|
|
133
|
-
|
|
134
|
-
Sign-in and MFA happen in a temporary browser window. Only service-owned session
|
|
135
|
-
cookies are retained; identity-provider cookies are discarded when it closes.
|
|
136
|
-
Sessions stay on your computer in encrypted files with owner-restricted keys.
|
|
137
|
-
Configured local clients share those connections and saved preferences.
|
|
138
|
-
|
|
139
|
-
## Your study project
|
|
140
|
-
|
|
141
|
-
The agent keeps each course in its own folder. After preparing the website,
|
|
142
|
-
your project looks like this, with audio added when requested:
|
|
143
|
-
|
|
144
|
-
```text
|
|
145
|
-
my-course/
|
|
146
|
-
├── AGENTS.md Your rules and a short pointer to agent context
|
|
147
|
-
├── materials/
|
|
148
|
-
│ ├── content/ Lectures, slides and reading
|
|
149
|
-
│ ├── exercises/ Exercise sheets and practice material
|
|
150
|
-
│ ├── exams/ Available exam and revision material
|
|
151
|
-
│ └── other/ Announcements and course information
|
|
152
|
-
├── app/
|
|
153
|
-
│ ├── content.json Lessons, flashcards and practice questions
|
|
154
|
-
│ └── index.html Your study website
|
|
155
|
-
├── audio/ Optional audio notes
|
|
156
|
-
│ ├── scripts/ Narration text
|
|
157
|
-
│ └── tracks/ Audio lessons
|
|
158
|
-
└── .tum-mcp/
|
|
159
|
-
├── course.md Cited course orientation, rules and unknowns
|
|
160
|
-
├── state.json Course identity and source versions
|
|
161
|
-
└── comments.json Passage comments, when added
|
|
162
|
-
```
|
|
57
|
+
Run `tum-mcp install` to choose extensions, then reload your client.
|
|
163
58
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
59
|
+
| Extension | Skill added | What it offers |
|
|
60
|
+
| --- | --- | --- |
|
|
61
|
+
| `lecture` | `prepare-lecture` | Lecture Notes with the professor's extra explanations, timestamps and selected critical visuals. Prefers transcripts and slides; local recognition is optional. |
|
|
62
|
+
| `studocu` | `sync-studocu` | Search and collect selected supplementary PDFs saved in your browser. Personal use only; excluded from published sites. |
|
|
63
|
+
| `audio-notes` | `audio-notes` | Turn prepared Study lessons into concise audio tracks, with resumable generation and coverage tracking. Voice setup happens when used. |
|
|
167
64
|
|
|
168
|
-
|
|
65
|
+
Use `tum-mcp status` to see installed workflows and `tum-mcp uninstall` to remove
|
|
66
|
+
them. Named commands also work, such as `tum-mcp install audio-notes` and
|
|
67
|
+
`tum-mcp uninstall lecture`. Existing notes, audio and customizations are retained.
|
|
68
|
+
Audio Notes needs no additional campus sign-in. Studocu uses your own browser.
|
|
169
69
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
```
|
|
70
|
+
[Lecture and recognition](docs/lecture-notes.md) ·
|
|
71
|
+
[Studocu collection](docs/study.md#studocu-materials) · [Setup details](docs/setup.md)
|
|
173
72
|
|
|
174
|
-
|
|
175
|
-
same npm location and refreshes configured clients. It never downgrades a newer
|
|
176
|
-
installation. Use `tum-mcp update --local` to refresh the installed version without checking npm.
|
|
177
|
-
From 0.6.0 or earlier, upgrade the npm package once to obtain this command.
|
|
178
|
-
Sessions, preferences and downloads carry forward. User-edited entries and skills are
|
|
179
|
-
preserved and reported for review. Reload the client; refresh its cached plugin
|
|
180
|
-
if needed. Study sites are updated separately through the study workflows.
|
|
73
|
+
## Privacy, updates and removal
|
|
181
74
|
|
|
182
|
-
|
|
75
|
+
Sessions are encrypted locally. Your agent uses your configured AI provider to
|
|
76
|
+
process selected material. Publishing requires local GitHub CLI authentication
|
|
77
|
+
and an eligible GitHub plan: **the repository is private; the website is public**.
|
|
78
|
+
Review content before publishing. [Publishing details](docs/study.md#publish-a-study-website).
|
|
183
79
|
|
|
184
80
|
```sh
|
|
81
|
+
tum-mcp update # Upgrade the package and refresh managed clients
|
|
185
82
|
tum-mcp uninstall
|
|
186
83
|
```
|
|
187
84
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
`--purge-runtime` to remove generated runtimes or `--forget-credentials` to
|
|
191
|
-
remove saved local credentials. [Removal details](docs/setup.md#update-and-remove).
|
|
192
|
-
Use `--client NAME` to remove just one client, or `--keep-package` to retain npm.
|
|
193
|
-
|
|
194
|
-
[Guide](docs/tum-mcp.md) · [Setup](docs/setup.md) · [Study workflows](docs/study.md) · [Development](docs/development.md)
|
|
85
|
+
Sessions, downloads, course projects and edited skills are preserved. Reload the
|
|
86
|
+
client after updates. [Update and removal options](docs/setup.md#update-and-remove).
|
|
195
87
|
|
|
88
|
+
[Command guide](docs/tum-mcp.md) · [Development](docs/development.md) ·
|
|
196
89
|
[MIT](LICENSE) · [NOTICE](NOTICE) · [Report a problem](https://github.com/jamestesting0/tum-mcp/issues)
|
package/docs/development.md
CHANGED
|
@@ -22,6 +22,9 @@ npm run test:package-lifecycle
|
|
|
22
22
|
|
|
23
23
|
Python 3.13 is the managed runtime. Install Tesseract for OCR tests. Default tests
|
|
24
24
|
use synthetic sources and credentials. No language-server installation is needed.
|
|
25
|
+
Studocu fixtures must likewise use synthetic documents and local transports, never
|
|
26
|
+
browser cookies, personal account details or live downloaded PDFs. The extension
|
|
27
|
+
is off by default; validate both selected and unselected skill packs.
|
|
25
28
|
Set `TUM_MOODLE_SYSTEM_KEYRING=1` for a unique synthetic native-store round trip.
|
|
26
29
|
The ordinary campus runtime uses encrypted local files and owner-restricted keys.
|
|
27
30
|
Set `TUM_MCP_BROWSER_INTEGRATION=1` to include the real HTTP static-export browser
|
|
@@ -37,7 +40,7 @@ Each layer owns a different failure boundary:
|
|
|
37
40
|
| Unit | Parsing, policy, malformed input and failure branches with synthetic collaborators |
|
|
38
41
|
| Integration | Real files, CLI/MCP, transactions, HTTP confinement and isolated project updates |
|
|
39
42
|
| Installed consumer | Actual npm/wheel contents, managed runtime and complete browser workflows |
|
|
40
|
-
| Public upgrade |
|
|
43
|
+
| Public upgrade | Published 0.9.0, repair, ownership conflicts and removal |
|
|
41
44
|
| Native platform | OS credential/ACL behavior; WSL Windows browser transport on both engines |
|
|
42
45
|
|
|
43
46
|
Study integration fixtures build the private rich regression fixture once, then copy it into a fresh
|
|
@@ -56,12 +59,21 @@ CI runs macOS, Windows and Linux, plus both distribution engines on WSL 3.x.
|
|
|
56
59
|
Consumer checks install the actual npm artifact, discover tools, build a study
|
|
57
60
|
site and test available Chromium browsers with temporary profiles and synthetic
|
|
58
61
|
pages. WSL verifies Windows browser transport. No live account is used.
|
|
59
|
-
Upgrade checks
|
|
60
|
-
failed preparation, runtime repair and
|
|
62
|
+
Upgrade checks start from public 0.9.0 and cover all five clients, optional-extension
|
|
63
|
+
retention, customized-file conflicts, failed preparation, runtime repair and
|
|
64
|
+
removal that preserves work/credentials. Earlier releases are outside this matrix.
|
|
61
65
|
The package-lifecycle check uses a local synthetic registry and real isolated
|
|
62
66
|
global npm prefixes to verify downloads, backend validation, replacement,
|
|
63
67
|
failure ordering and one-command removal. It does not publish a test release.
|
|
64
68
|
All five jobs must pass on the exact pushed commit before completion is claimed.
|
|
69
|
+
Desktop jobs additionally install the optional hash-locked CPU recognizer and
|
|
70
|
+
transcribe the synthetic speech fixture; supported Apple Silicon runners also
|
|
71
|
+
exercise MLX. This explicit test downloads public pinned model files, never campus
|
|
72
|
+
recordings. Ordinary test runs skip it unless `TUM_MCP_LECTURE_ASR_INTEGRATION=1`.
|
|
73
|
+
Recognition runs before package lifecycle checks to expose native dependency
|
|
74
|
+
failures early. Windows also runs the affected browser/UTF-8 fixture checks first.
|
|
75
|
+
Its complete job budget is 35 minutes for native ACL and subprocess coverage;
|
|
76
|
+
the macOS and Linux budgets remain 25 minutes.
|
|
65
77
|
|
|
66
78
|
Live Moodle checks are opt-in: `TUM_MOODLE_LIVE=1 uv run pytest tests/live -q`.
|
|
67
79
|
They use the developer's selected course and saved session. Keep them out of CI.
|
|
@@ -129,3 +141,20 @@ Chromium sign-in/MFA, read a PDF and forum, download a file, then restart and ch
|
|
|
129
141
|
session reuse. Automated synthetic sign-in does not certify human SSO on every OS.
|
|
130
142
|
For UI changes, exercise the generated app at narrow/wide widths in both themes;
|
|
131
143
|
check keyboard navigation, reduced motion, source links and retained progress.
|
|
144
|
+
|
|
145
|
+
## Optional Lecture extension
|
|
146
|
+
|
|
147
|
+
Base setup exposes five workflows and no `tum_live_*` tools. `install lecture`
|
|
148
|
+
records explicit selection, refreshes managed clients and provisions the optional
|
|
149
|
+
recognizer only when requested/supported. `--no-asr` keeps captions/imported WebVTT.
|
|
150
|
+
Heavy recognition dependencies and model weights stay outside the base environment
|
|
151
|
+
and package artifacts. `lecture_processing/` owns bounded media/ASR evidence;
|
|
152
|
+
`lecture_content.py`, `lecture_data.py` and `lecture_assets.py` validate the notes
|
|
153
|
+
and figures used by the static app. See [the workflow guide](lecture-notes.md).
|
|
154
|
+
|
|
155
|
+
Use `skills validate --all` to check the packaged optional workflow without installing
|
|
156
|
+
it; default validation checks the selected workflows. Activation statistics remain
|
|
157
|
+
unmeasured until genuine fresh-session trial records exist. Default tests use
|
|
158
|
+
synthetic media and course data. `test:consumer` and `test:upgrade` exercise optional
|
|
159
|
+
install/update/export/removal from an actual local npm artifact. Never publish or
|
|
160
|
+
stage npm as a test.
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Lecture Notes
|
|
2
|
+
|
|
3
|
+
Install the optional extension only when needed:
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
tum-mcp install lecture
|
|
7
|
+
# Captions/imported WebVTT without provisioning recognition:
|
|
8
|
+
tum-mcp install lecture --no-asr
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Restart the coding client to load Prepare Lecture and the three TUM-Live metadata
|
|
12
|
+
tools. Base setup keeps its five skills and existing services. Removing the option
|
|
13
|
+
with `tum-mcp uninstall lecture` preserves course notes, evidence, sessions,
|
|
14
|
+
model caches and customizations. Reinstalling can reuse them.
|
|
15
|
+
|
|
16
|
+
Ask: “Prepare Lecture Notes from this recording and these slides, focusing on
|
|
17
|
+
what the professor explains beyond the material.” It adds Lecture Notes to the
|
|
18
|
+
same course app, alongside Study and Exercises. Notes have coherent explanations,
|
|
19
|
+
examples, important qualifications, formulas, selective source images and direct
|
|
20
|
+
timestamp access. Attribution review stays private, so the reading flow is clean.
|
|
21
|
+
Lecture Notes has no quizzes or flashcards; broader teaching/practice stays in Study.
|
|
22
|
+
|
|
23
|
+
## Processing order and cost
|
|
24
|
+
|
|
25
|
+
1. Validate the selected recording. Whole-recording silence markers make it invalid;
|
|
26
|
+
stop before content, including cached transcripts/images. Missing duration can
|
|
27
|
+
be resolved from bounded playlist metadata. Partial silence/cuts retain the
|
|
28
|
+
original recording clock.
|
|
29
|
+
2. Prefer existing captions or supplied original-time WebVTT. Otherwise the optional
|
|
30
|
+
pinned local recognizer scans retained audio in resumable chunks. It checks all
|
|
31
|
+
channels, preserves coverage gaps and flags uncertain/repetitive recognition.
|
|
32
|
+
Three quiet samples alone cannot invalidate a recording.
|
|
33
|
+
3. Read compact transcript passages, map the full retained lecture and compare with
|
|
34
|
+
verified slides/materials. Select additional reasoning, examples, corrections,
|
|
35
|
+
caveats and advice; do not claim novelty when comparison materials are missing.
|
|
36
|
+
4. Use only a few critical recording frames when text/materials leave a consequential
|
|
37
|
+
visual question unresolved. No default previews or frame-by-frame model calls.
|
|
38
|
+
Captures use measured times and verified image bytes. Supporting diagrams use
|
|
39
|
+
normal content blocks, with private attribution review.
|
|
40
|
+
5. Review the notes, citations and selected figures, then build a coherent batch.
|
|
41
|
+
|
|
42
|
+
Vision cost depends on the chosen model and image size. This workflow reduces
|
|
43
|
+
unnecessary images and model context; it does not promise a fixed price or a
|
|
44
|
+
measured accuracy improvement. In the selected 81-minute retained-audio experiment,
|
|
45
|
+
compact text for 200 passages used 39,412 bytes versus 372,519 with word details,
|
|
46
|
+
with identical text/times. An unchanged preparation reused 12 recognition
|
|
47
|
+
checkpoints with zero inference and fetched about 456 KB of playlist metadata.
|
|
48
|
+
These are observations from that source and cache, not universal benchmarks.
|
|
49
|
+
A direct media playlist offered no separate audio rendition; the processor used
|
|
50
|
+
bounded muxed segments rather than guessing alternative download URLs.
|
|
51
|
+
|
|
52
|
+
## Host commands
|
|
53
|
+
|
|
54
|
+
Use the existing course binding and campus connection. Authentication is separate
|
|
55
|
+
from HTTP media retrieval; do not export cookies or pass signed URLs to download
|
|
56
|
+
commands. Captions and imported original-time WebVTT work without a recognizer.
|
|
57
|
+
Automatic ASR installs separately with hash-locked CPython 3.13 wheels and lazy,
|
|
58
|
+
revision-pinned public model weights; neither is part of the base runtime.
|
|
59
|
+
|
|
60
|
+
| Host | Local recognizer |
|
|
61
|
+
| --- | --- |
|
|
62
|
+
| Apple Silicon macOS 15+ | MLX acceleration by default |
|
|
63
|
+
| Apple Silicon macOS 14 | CPU int8 |
|
|
64
|
+
| Intel macOS 13+ | CPU int8 |
|
|
65
|
+
| Windows x64 | CPU int8; Microsoft Visual C++ runtime required |
|
|
66
|
+
| Linux/WSL x86_64 or ARM64, glibc 2.28+ | CPU int8 |
|
|
67
|
+
|
|
68
|
+
Native Windows ARM64, 32-bit systems and musl Linux have no supported locked
|
|
69
|
+
runtime. Use captions/imported WebVTT there. CPU inference requires compatible
|
|
70
|
+
CTranslate2 instructions (SSE4.1 on x86); installation verifies native imports and
|
|
71
|
+
int8 support before selecting the runtime. See the upstream
|
|
72
|
+
[CTranslate2 requirements](https://opennmt.net/CTranslate2/installation.html).
|
|
73
|
+
Windows, Linux x64 and Apple Silicon recognition have native CI smoke checks;
|
|
74
|
+
Intel Mac and Linux ARM64 compatibility also depends on the published wheels.
|
|
75
|
+
|
|
76
|
+
FFmpeg and ffprobe must be on PATH for recording audio extraction or selected
|
|
77
|
+
video frames. They are unnecessary for imported captions and cached text.
|
|
78
|
+
`lecture runtime status` reports the selected engine and missing prerequisites.
|
|
79
|
+
Use `lecture runtime install` to retry after fixing a prerequisite. Advanced users
|
|
80
|
+
can set `TUM_MCP_LECTURE_ENGINE=cpu` consistently for installation and preparation
|
|
81
|
+
to bypass Metal; the default `auto` retains existing MLX runtimes and model caches.
|
|
82
|
+
An engine switch uses separate caches. No cloud transcription API is configured.
|
|
83
|
+
|
|
84
|
+
CPU decoding uses int8, one worker and at most four threads. It consumes the full
|
|
85
|
+
retained audio, with word timestamps and no VAD retiming. ASR remains fallible,
|
|
86
|
+
especially for names and notation; compare important wording with slides and the
|
|
87
|
+
recording rather than treating confidence scores as proof.
|
|
88
|
+
|
|
89
|
+
```sh
|
|
90
|
+
tum-mcp lecture inspect PROJECT
|
|
91
|
+
tum-mcp lecture runtime status
|
|
92
|
+
tum-mcp lecture prepare PROJECT --recording URL
|
|
93
|
+
# One selected recording with supplied captions:
|
|
94
|
+
tum-mcp lecture prepare PROJECT --recording URL --transcript lecture.vtt
|
|
95
|
+
# Read bounded compact pages; continue with returned next_offset:
|
|
96
|
+
tum-mcp lecture transcript PROJECT --recording KEY --start 0 --end 28800 --limit 200 --offset 0
|
|
97
|
+
# Only after identifying an unresolved visual question:
|
|
98
|
+
tum-mcp lecture prepare PROJECT --recording URL --frame-at SECONDS
|
|
99
|
+
tum-mcp lecture frames PROJECT --recording KEY --start START --end END
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`--words` adds word alignment details to transcript reads. `prepare --previews`
|
|
103
|
+
explicitly requests approximate seek candidates; they are not verified capture
|
|
104
|
+
times. `--language en` is appropriate only for a known English recording.
|
|
105
|
+
|
|
106
|
+
Prepared media, raw transcripts, receipts and review notes stay under `.tum-mcp/`.
|
|
107
|
+
Safe source receipts can be reconciled into the shared inventory:
|
|
108
|
+
|
|
109
|
+
```sh
|
|
110
|
+
tum-mcp lecture export-snapshot PROJECT --output snapshot.json
|
|
111
|
+
tum-mcp study sync PROJECT --snapshot snapshot.json
|
|
112
|
+
tum-mcp study schema lectures
|
|
113
|
+
tum-mcp study build PROJECT --local-only
|
|
114
|
+
tum-mcp study inspect PROJECT
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
The agent authors `app/lectures.json` using real source hashes and coverage; the
|
|
118
|
+
legacy `study/` layout stays supported. Captured images stage in
|
|
119
|
+
`.tum-mcp/lecture-assets/` and copy only when selected. Source freshness and note
|
|
120
|
+
semantic revision are separate, preserving passage comments through harmless
|
|
121
|
+
receipt/image updates. Local comments support `--view lectures --lecture KEY`.
|
|
122
|
+
|
|
123
|
+
Open with `tum-mcp study` from the course folder. For a credential-free synthetic
|
|
124
|
+
preview after installing the extension, use `tum-mcp study demo PROJECT --lectures`.
|
|
125
|
+
The default demo still has only Study and Exercises. Synthetic teaching/timestamps
|
|
126
|
+
exercise the product and do not establish real lecture accuracy.
|
|
127
|
+
|
|
128
|
+
## Publication
|
|
129
|
+
|
|
130
|
+
Lecture Notes is excluded from publication by default, including old saved
|
|
131
|
+
configurations. After reviewing public exposure, use the existing publish-course
|
|
132
|
+
workflow with `--include-lectures`; Exercises has a separate choice. Exclusion
|
|
133
|
+
removes lecture text, lecture-only sources/math and referenced images from exports,
|
|
134
|
+
and removes previously managed remote images while preserving unrelated files.
|
|
135
|
+
Raw media/transcripts, comments and private review metadata are never exported.
|
|
136
|
+
The entire export, including its ownership marker, must fit 16 MiB and 100 files.
|
|
137
|
+
Essential figures are not silently omitted/compressed; a notes-only app excluded
|
|
138
|
+
from publication cannot produce an empty site.
|
package/docs/setup.md
CHANGED
|
@@ -19,24 +19,59 @@ tum-mcp doctor
|
|
|
19
19
|
tum-mcp --help
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Run `tum-mcp setup` to choose clients interactively, or pass `--client claude`,
|
|
23
|
+
`cursor`, `antigravity`, or `generic` directly. Existing registrations have status dots.
|
|
23
24
|
Codex needs the plugin enabled and a restart when prompted. Cursor and
|
|
24
|
-
Antigravity setup installs all
|
|
25
|
+
Antigravity setup installs all five base skills and MCP configuration; restart each
|
|
25
26
|
client afterward. Existing MCP-only setups gain the skills through `tum-mcp update`
|
|
26
27
|
or another setup run. Generic setup writes configuration for manual installation.
|
|
28
|
+
|
|
29
|
+
Studocu is optional: run `tum-mcp install studocu`, then reload the client. The
|
|
30
|
+
extension adds the `sync-studocu` skill and its tools. `tum-mcp status`
|
|
31
|
+
reports the local selection; `tum-mcp uninstall studocu` disables it and
|
|
32
|
+
preserves course materials and customized files. Generic clients use
|
|
33
|
+
`tum-mcp skills export DESTINATION` to install the active pack manually.
|
|
27
34
|
Setup preserves unrelated settings and refuses to
|
|
28
35
|
replace customized entries. It does not authenticate or fetch courses.
|
|
29
36
|
|
|
37
|
+
Audio Notes is optional: use `tum-mcp install audio-notes`. It adds the
|
|
38
|
+
`audio-notes` skill for prepared Study content; synthesis is set up when used.
|
|
39
|
+
Existing course audio is retained when the extension is disabled.
|
|
40
|
+
|
|
41
|
+
## Terminal output
|
|
42
|
+
|
|
43
|
+
`tum-mcp status` shows saved connections and optional workflows;
|
|
44
|
+
`tum-mcp doctor` also checks clients and prerequisites, including TUMonline.
|
|
45
|
+
Green dots mean ready or enabled, blue means not verified, amber means action
|
|
46
|
+
needed, red means failed, and muted dots mean inactive. Every dot has a text
|
|
47
|
+
label. `NO_COLOR` disables color; narrow terminals use stacked rows.
|
|
48
|
+
|
|
49
|
+
Bare `tum-mcp setup`, `tum-mcp install` and `tum-mcp uninstall` share the same
|
|
50
|
+
keyboard controls as connect. Nothing is preselected; Ctrl+C cancels. Uninstall
|
|
51
|
+
also offers **All — TUM MCP**, which removes the package and managed client setup.
|
|
52
|
+
Personal notes, sessions and customized files are retained. Scripts can name one or both:
|
|
53
|
+
`tum-mcp uninstall lecture studocu --json`.
|
|
54
|
+
|
|
55
|
+
Use `--json` for machine-readable status, named extension removal/installation,
|
|
56
|
+
skill listing/validation, lecture runtime status or TUMonline permissions.
|
|
57
|
+
The default human output changed in 0.9.1; scripts that parsed those commands
|
|
58
|
+
must add `--json`. The former `extensions` group is removed; use `status` and
|
|
59
|
+
`uninstall NAME`. Named client/extension arguments remain suitable for scripts.
|
|
60
|
+
Data-oriented course authoring commands retain JSON output.
|
|
61
|
+
|
|
30
62
|
## Connect
|
|
31
63
|
|
|
32
64
|
Run **`tum-mcp connect`**, with no arguments, in an interactive terminal:
|
|
33
65
|
|
|
34
|
-
1. Use up/down to move and Space to select
|
|
66
|
+
1. Use up/down to move and Space to select services. Installed Lecture adds TUM-Live;
|
|
67
|
+
installed Studocu adds Studocu.
|
|
35
68
|
2. Press Enter. If several browsers are installed, choose one and press Enter.
|
|
36
69
|
3. Complete TUM sign-in/MFA in the opened window. Only selected service tabs open.
|
|
37
70
|
4. Return to the terminal for the saved-connection result.
|
|
38
71
|
|
|
39
|
-
|
|
72
|
+
Campus services use temporary-browser sign-in and encrypted session storage.
|
|
73
|
+
Studocu opens your own default browser (the Windows browser from WSL); sign in
|
|
74
|
+
there. Its browser session is neither copied nor claimed as verified.
|
|
40
75
|
No API key or native credential-store prompt is needed. A temporary browser
|
|
41
76
|
profile keeps the connection separate from your everyday browser. Ctrl+C closes it and preserves
|
|
42
77
|
connections that already completed. A dumb terminal uses numbered prompts.
|
|
@@ -51,6 +86,12 @@ After sign-in, Artemis and Zulip can read content available to your campus accou
|
|
|
51
86
|
No local course/channel grants are required. Your agent uses status/discover and
|
|
52
87
|
course metadata to find relevant current-semester material, then makes bounded reads.
|
|
53
88
|
An account ID identifies a saved service connection; it is not your TUM login.
|
|
89
|
+
TUMonline additionally has a local policy: `tum-mcp manage tumonline --show`
|
|
90
|
+
shows it, `tum-mcp manage tumonline` changes the studies and courses permission,
|
|
91
|
+
and `tum-mcp manage tumonline --disconnect` removes its saved local session.
|
|
92
|
+
Use `--account ACCOUNT_ID` if more than one TUMonline account is configured.
|
|
93
|
+
Study names, public course metadata and public course curriculum positions are available by default; full curriculum and
|
|
94
|
+
grades or progress are not yet available. [Details and limitations](tum-mcp.md#tumonline-permissions).
|
|
54
95
|
`tum-mcp --help` lists commands; `tum-mcp study build --help` shows command options.
|
|
55
96
|
|
|
56
97
|
## WSL
|
|
@@ -155,6 +196,7 @@ the npm package and all managed registrations:
|
|
|
155
196
|
|
|
156
197
|
```sh
|
|
157
198
|
tum-mcp uninstall
|
|
199
|
+
# Choose All to remove TUM MCP and its managed client setup.
|
|
158
200
|
```
|
|
159
201
|
|
|
160
202
|
Custom edits and user-added files are preserved. Codex's local source/catalog
|
package/docs/study.md
CHANGED
|
@@ -1,13 +1,46 @@
|
|
|
1
1
|
# Course study projects
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
They run in your local agent, using the connected
|
|
3
|
+
Five base skills cover source reading, course sync, Study preparation, Exercises
|
|
4
|
+
preparation and publishing. They run in your local agent, using the connected
|
|
5
5
|
MCP tools to read course sources. The CLI validates and stores the resulting local
|
|
6
6
|
files; it does not run an AI model.
|
|
7
|
+
The optional `prepare-lecture` skill adds a Lecture Notes workspace; install it with
|
|
8
|
+
`tum-mcp install lecture`. See [Lecture Notes](lecture-notes.md).
|
|
9
|
+
The optional `sync-studocu` skill collects selected student-uploaded material separately.
|
|
10
|
+
The optional `audio-notes` skill turns prepared lessons into spoken tracks; install
|
|
11
|
+
it with `tum-mcp install audio-notes`.
|
|
12
|
+
|
|
13
|
+
## Studocu materials
|
|
14
|
+
|
|
15
|
+
Install the optional extension with `tum-mcp install studocu` and reload your
|
|
16
|
+
client. Ask `sync-studocu` to collect materials for a course project. It can
|
|
17
|
+
initialize a Studocu-only project with a verified course and semester.
|
|
18
|
+
Search is anonymous and bounded; a limited result set is not a complete inventory.
|
|
19
|
+
`tum-mcp studocu connect` explains how to sign in to Studocu in your own browser.
|
|
20
|
+
The extension cannot infer account entitlement or download original files through
|
|
21
|
+
the public MCP. Save an original that your account permits in the browser.
|
|
22
|
+
|
|
23
|
+
The skill records a reviewed selection with `tum-mcp studocu plan PROJECT
|
|
24
|
+
--selection FILE` and tracks it with `tum-mcp studocu status PROJECT --json`.
|
|
25
|
+
Import a selected original with `tum-mcp studocu import PROJECT --document-id ID
|
|
26
|
+
--file FILE`. The document-to-file association is user-selected. Originals go to
|
|
27
|
+
`materials/studocu/summaries`, `materials/studocu/exams` (including mocks and
|
|
28
|
+
solutions), or `materials/studocu/other`. Files remain local and retain their
|
|
29
|
+
original bytes. Consult the skill's collection reference for the selection schema.
|
|
30
|
+
Exact matches in the same group, type and known year share one original through
|
|
31
|
+
a private alias. Each selected document retains its own source identity and URL.
|
|
32
|
+
Changing a document's classification or refreshing its original separates aliases
|
|
33
|
+
when they no longer match; previous versions remain in private history.
|
|
34
|
+
When an existing selection is planned again, unchanged duplicate originals are
|
|
35
|
+
consolidated. Edited or missing files are preserved for review.
|
|
36
|
+
|
|
37
|
+
Local study material can cite student uploads. Publishing rejects included
|
|
38
|
+
Studocu-backed sources; this source check cannot identify uncited copied text or
|
|
39
|
+
replace a review of the published content.
|
|
7
40
|
|
|
8
41
|
## Publish a study website
|
|
9
42
|
|
|
10
|
-
The
|
|
43
|
+
The `publish-course` skill makes a prepared site accessible from a phone
|
|
11
44
|
or another computer. Its GitHub repository is private; the Pages website is
|
|
12
45
|
public. An eligible paid GitHub plan is required for Pages from private repositories.
|
|
13
46
|
This workflow does not provide private website access. Review lesson text,
|
|
@@ -35,8 +68,10 @@ failed setup retries the same saved repository rather than creating duplicates.
|
|
|
35
68
|
Study is the default hosted workspace, including for old settings. Exercise
|
|
36
69
|
statements, hints and full solutions need explicit `--include-exercises` on the
|
|
37
70
|
publish command after reviewing their public exposure. `--exclude-exercises`
|
|
38
|
-
|
|
39
|
-
Exercises-only site also requires explicit inclusion.
|
|
71
|
+
removes Exercises from subsequent eligible exports, using the same repository and URL. An
|
|
72
|
+
Exercises-only site also requires explicit inclusion. Lecture Notes separately requires
|
|
73
|
+
`--include-lectures`; old settings default to exclusion. `--exclude-lectures` also removes
|
|
74
|
+
previously managed lecture images. A notes-only export with notes excluded is refused.
|
|
40
75
|
|
|
41
76
|
Only the selected generated website renderer and data are uploaded. Downloaded
|
|
42
77
|
originals, credentials, AGENTS.md, study inventory, passage comments, progress,
|
|
@@ -96,7 +131,7 @@ pse-ws26/
|
|
|
96
131
|
course.md Cited course structure, logistics, rules and unknowns
|
|
97
132
|
state.json Course binding, source versions and coverage
|
|
98
133
|
notes/ Detailed course/agent notes when needed
|
|
99
|
-
app/ Shared Study and
|
|
134
|
+
app/ Shared Study, Exercises and optional Lecture Notes website
|
|
100
135
|
content.json Optional source-backed Study content
|
|
101
136
|
exercises.json Optional prepared exercise guidance
|
|
102
137
|
audio/ Optional category audio derived from the prepared website
|
|
@@ -279,6 +314,7 @@ is a no-op. Do not create `app/` alongside an existing `study/` by hand.
|
|
|
279
314
|
|
|
280
315
|
## Create and maintain audio notes
|
|
281
316
|
|
|
317
|
+
Install the optional workflow with `tum-mcp install audio-notes`.
|
|
282
318
|
Use `prepare-study` to author the interactive course, then ask `audio-notes` to
|
|
283
319
|
convert that prepared content into spoken lessons. For example:
|
|
284
320
|
|
package/docs/tum-mcp.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Package: `@jamestesting888/tum-mcp`, CLI: `tum-mcp`, backend: Python 3.13.
|
|
4
4
|
The package combines read-only course retrieval, managed client installation and
|
|
5
|
-
|
|
5
|
+
five base course workflows and three optional extensions.
|
|
6
6
|
|
|
7
7
|
## Current capabilities
|
|
8
8
|
|
|
@@ -107,7 +107,7 @@ tum-mcp study build --help
|
|
|
107
107
|
`connect` takes no arguments or connection options. Move with up/down, toggle
|
|
108
108
|
services with Space, and press Enter. Choose a browser when more than one is
|
|
109
109
|
installed. Only selected tabs open in one temporary browser context. Moodle,
|
|
110
|
-
Artemis and
|
|
110
|
+
Artemis, Zulip and TUMonline all follow this flow.
|
|
111
111
|
Sign-in/MFA stays in the browser. `TERM=dumb` uses numbered prompts. Ctrl+C
|
|
112
112
|
cancels and retains completed connections.
|
|
113
113
|
|
|
@@ -121,15 +121,53 @@ when the temporary browser closes. Existing browser profiles are never imported.
|
|
|
121
121
|
Zulip uses its read-only `/json/` routes with the browser session; no API key is
|
|
122
122
|
required. Reconnect through the same selector when a session expires.
|
|
123
123
|
See [Zulip's dispatcher](https://github.com/zulip/zulip/blob/12.0/zerver/lib/rest.py).
|
|
124
|
-
|
|
124
|
+
For Moodle, Artemis and Zulip, read access follows the authenticated account's server permissions. No local course,
|
|
125
125
|
channel, private-channel or personal-feedback grant is required. Older saved grant
|
|
126
126
|
fields remain readable for compatibility and do not restrict read access. Agents
|
|
127
127
|
prefer relevant current-semester courses and channels, inspect metadata first, and
|
|
128
128
|
page through only the content needed for the request. Explicit older-course requests
|
|
129
129
|
remain supported. Server-denied content, staff-only material and remote writes stay unavailable.
|
|
130
130
|
|
|
131
|
+
### TUMonline permissions
|
|
132
|
+
|
|
133
|
+
TUMonline has a separate, account-specific policy. New connections allow study
|
|
134
|
+
names and degrees, public course catalog metadata and public curriculum positions
|
|
135
|
+
for a selected course by default. The position endpoint is anonymous: no student
|
|
136
|
+
session or identifier is sent. These positions are a partial view, not a full
|
|
137
|
+
program curriculum or personal enrollment list; page order can change upstream.
|
|
138
|
+
Course catalog searches accept a title or course number using 2–80 letters,
|
|
139
|
+
numbers, spaces, dots, underscores, plus signs, slashes or hyphens; continue pages
|
|
140
|
+
with the same query.
|
|
141
|
+
Full curriculum structure is unavailable because its public API requires a separate
|
|
142
|
+
service account. Grades and progress need
|
|
143
|
+
separate consent, but their readers are not yet available; exams, admission,
|
|
144
|
+
account, other IT and miscellaneous readers are also unavailable. No campus write
|
|
145
|
+
operations are provided.
|
|
146
|
+
|
|
147
|
+
Run `tum-mcp manage tumonline --show` to inspect the policy and
|
|
148
|
+
`tum-mcp manage tumonline` in a terminal to select permissions with Space and
|
|
149
|
+
save with Enter. Studies and courses can be allowed or revoked; the remaining
|
|
150
|
+
categories are shown as unavailable and cannot be selected. On basic terminals,
|
|
151
|
+
the command offers a numbered text prompt instead.
|
|
152
|
+
When multiple accounts exist, add `--account ACCOUNT_ID`. Reconnecting preserves
|
|
153
|
+
the policy. `tum-mcp manage tumonline --disconnect` removes the local TUMonline
|
|
154
|
+
credential and retains the policy; it does not revoke remote sessions. An expired
|
|
155
|
+
session requires `tum-mcp connect` again. If the policy is missing or corrupt, use
|
|
156
|
+
`tum-mcp manage tumonline --account ACCOUNT_ID --disconnect` to remove that saved
|
|
157
|
+
session without resetting permissions or affecting other providers.
|
|
158
|
+
|
|
159
|
+
The policy governs what these TUMonline tools return to all MCP clients sharing
|
|
160
|
+
the same local configuration. A local program running as the same user can access
|
|
161
|
+
local files independently, and this policy does not govern other providers' tools,
|
|
162
|
+
including Moodle's own grades tools. Study names are personal and permitted results
|
|
163
|
+
may be transmitted to your configured agent or its AI provider. TUMonline's study
|
|
164
|
+
chooser can contain extra personal fields in its upstream response; the integration
|
|
165
|
+
holds that bounded response only in memory, projects the permitted fields, and does
|
|
166
|
+
not save the response body. Revoking a permission prevents subsequent reads, but
|
|
167
|
+
cannot recall a response already delivered to a client.
|
|
168
|
+
|
|
131
169
|
Settings live outside the installed package in `TUMMCP/config/preferences.json`.
|
|
132
|
-
Moodle sessions live under `TUMMoodle/local-session/`; Artemis and
|
|
170
|
+
Moodle sessions live under `TUMMoodle/local-session/`; Artemis, Zulip and TUMonline credentials
|
|
133
171
|
live under `TUMMCP/credentials/local/`. Each directory has an independent `session.key`.
|
|
134
172
|
Encrypted records and keys have owner-only permissions: 0700 directories / 0600
|
|
135
173
|
keys on POSIX; protected current-user DACLs on Windows through PowerShell. No
|
|
@@ -187,9 +225,11 @@ writing files with activation.
|
|
|
187
225
|
|
|
188
226
|
The Codex adapter uses a contained Node launcher to pin the managed Python in
|
|
189
227
|
isolated mode; portable stdio manifests require a bare or contained executable.
|
|
190
|
-
The
|
|
191
|
-
`prepare-study`, `prepare-exercises
|
|
192
|
-
|
|
228
|
+
The base pack contains five skills: `read-content`, `sync-course`,
|
|
229
|
+
`prepare-study`, `prepare-exercises` and `publish-course`. Optional extensions add
|
|
230
|
+
`prepare-lecture`, `sync-studocu` and `audio-notes`; choose them with `tum-mcp install`.
|
|
231
|
+
Website-specific retrieval guidance is loaded from references within read-content.
|
|
232
|
+
Teaching, schema and design contracts live
|
|
193
233
|
with prepare-study; the renderer and synthetic example ship as reusable assets.
|
|
194
234
|
Audio Notes converts prepared content into category tracks and maintains coverage,
|
|
195
235
|
scripts, voice settings, candidates and archives under the course's `audio/` root.
|
|
@@ -208,7 +248,7 @@ routing quality is a separate evaluation from structural and discovery checks.
|
|
|
208
248
|
Claude's invocation metadata follows each workflow's selected policy; automatic
|
|
209
249
|
selection is enabled by default and never grants permission for a mutation.
|
|
210
250
|
|
|
211
|
-
`setup --client cursor` writes `~/.cursor/mcp.json` and installs
|
|
251
|
+
`setup --client cursor` writes `~/.cursor/mcp.json` and installs the active skills
|
|
212
252
|
under `~/.cursor/skills/`.
|
|
213
253
|
`setup --client antigravity` installs the same skills under `~/.gemini/config/skills/`
|
|
214
254
|
and writes `~/.gemini/config/mcp_config.json`; an existing
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"wheel": "tum_mcp-0.
|
|
3
|
-
"wheelSha256": "
|
|
4
|
-
"requirementsSha256": "
|
|
2
|
+
"wheel": "tum_mcp-0.9.1-py3-none-any.whl",
|
|
3
|
+
"wheelSha256": "69d65afa35c27518f03c95e47ddfc23cc77a3d442853804fcb58c2e78b539fe0",
|
|
4
|
+
"requirementsSha256": "39a401b6e606d3292eb91b8fe9ef60367d4852f203eb409dc52f38b76e513ccf"
|
|
5
5
|
}
|
|
@@ -342,6 +342,10 @@ latex2mathml==3.81.1 \
|
|
|
342
342
|
--hash=sha256:c337668441b71c819b6733905a8058ba9a9d767bae11a0c5fdacb3aff31361bd \
|
|
343
343
|
--hash=sha256:c95add0c0fcdecad2d70567e0643050d5ea1149fb2e98a5d5792fb1c8eea2ed5
|
|
344
344
|
# via tum-mcp
|
|
345
|
+
m3u8==6.0.0 \
|
|
346
|
+
--hash=sha256:566d0748739c552dad10f8c87150078de6a0ec25071fa48e6968e96fc6dcba5d \
|
|
347
|
+
--hash=sha256:7ade990a1667d7a653bcaf9413b16c3eb5cd618982ff46aaff57fe6d9fa9c0fd
|
|
348
|
+
# via tum-mcp
|
|
345
349
|
markdown-it-py==4.2.0 \
|
|
346
350
|
--hash=sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49 \
|
|
347
351
|
--hash=sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a
|
|
@@ -368,6 +372,10 @@ opentelemetry-api==1.45.1 \
|
|
|
368
372
|
--hash=sha256:aa38ed19bcc084ba42782a73255b3582283eced7ad6dddbd6695189e69adfb75 \
|
|
369
373
|
--hash=sha256:b31553efa588ae44bc306f863c785c5333a9ecc091248c6ee68b4b6c87fdedfb
|
|
370
374
|
# via mcp
|
|
375
|
+
packaging==26.3 \
|
|
376
|
+
--hash=sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79 \
|
|
377
|
+
--hash=sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c
|
|
378
|
+
# via tum-mcp
|
|
371
379
|
pillow==12.3.0 \
|
|
372
380
|
--hash=sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59 \
|
|
373
381
|
--hash=sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45 \
|
|
Binary file
|
package/npm/package-manager.mjs
CHANGED
|
@@ -72,7 +72,7 @@ async function operate(job) {
|
|
|
72
72
|
const staging = join(job.temporary, 'prepared');
|
|
73
73
|
runNpm(job.npm, ['install', '--prefix', staging, '--global=false', archive], true);
|
|
74
74
|
const prepared = join(staging, 'node_modules', packageName);
|
|
75
|
-
runLauncher(prepared, ['setup'], true);
|
|
75
|
+
runLauncher(prepared, ['setup', '--runtime-only'], true);
|
|
76
76
|
// Only a healthy prepared release may replace the user's npm installation.
|
|
77
77
|
runNpm(job.npm, ['install', ...scope, job.target.global ? archive : `${packageName}@${latest}`]);
|
|
78
78
|
if (JSON.parse(readFileSync(join(job.root, 'package.json'), 'utf8')).version !== latest) throw new Error('npm did not install the selected version; client activation was stopped.');
|
package/npm/tum-mcp.mjs
CHANGED
|
@@ -4,71 +4,107 @@ import { readFileSync } from 'node:fs';
|
|
|
4
4
|
import { parseArgs } from 'node:util';
|
|
5
5
|
import { acquireSetupLock, currentPython, dataRoot, ensureRuntime, removeRuntimeFiles } from './runtime.mjs';
|
|
6
6
|
import { managePackage } from './package-manager.mjs';
|
|
7
|
+
import { printHelp } from './ui.mjs';
|
|
7
8
|
|
|
8
9
|
let args = process.argv.slice(2);
|
|
9
10
|
const version = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
|
|
10
11
|
try {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
12
|
+
const wantsHelp = args.length === 0 || args.some(arg => ['--help', '-h'].includes(arg));
|
|
13
|
+
const helpPython = wantsHelp ? currentPython() : null;
|
|
14
|
+
if (helpPython) {
|
|
15
|
+
const forwarded = args.length ? args.filter(arg => !['--local', '--keep-package'].includes(arg)) : ['--help'];
|
|
16
|
+
const env = { ...process.env }; delete env.PYTHONPATH; delete env.PYTHONHOME;
|
|
17
|
+
const child = spawnSync(helpPython, ['-I', '-m', 'tum_mcp', ...forwarded], { env, stdio: 'inherit', shell: false });
|
|
18
|
+
if (child.error) throw new Error('Managed backend could not start; run setup again.');
|
|
19
|
+
process.exitCode = child.status ?? 1;
|
|
20
|
+
} else if (args.length === 0 || (args.length === 1 && ['--help', '-h'].includes(args[0]))) {
|
|
21
|
+
printHelp(version, 'Campus tools and local study workflows.', 'tum-mcp [OPTIONS] COMMAND [ARGS]...', [
|
|
22
|
+
['Options', [['--version', 'Show the installed version.'], ['-h, --help', 'Show this help.']]],
|
|
23
|
+
['Commands', [
|
|
24
|
+
['setup', 'Configure your coding client and managed runtime.'],
|
|
25
|
+
['connect', 'Sign in to selected campus services.'],
|
|
26
|
+
['status', 'Show saved connections and optional workflows.'],
|
|
27
|
+
['doctor', 'Check installation and authentication.'],
|
|
28
|
+
['install', 'Choose optional Lecture, Studocu or Audio Notes workflows.'],
|
|
29
|
+
['uninstall', 'Choose extensions or All to remove TUM MCP.'],
|
|
30
|
+
['manage', 'Manage TUMonline permissions.'],
|
|
31
|
+
['skills', 'Inspect and validate workflow skills.'],
|
|
32
|
+
['study', 'Prepare, preview and publish a course app.'],
|
|
33
|
+
['lecture', 'Prepare lecture recording evidence (optional extension).'],
|
|
34
|
+
['studocu', 'Collect selected supplementary materials (optional extension).'],
|
|
35
|
+
['discover', 'List accessible courses or channels.'],
|
|
36
|
+
['update', 'Update the package and configured clients.'],
|
|
37
|
+
['logout', 'Remove one saved connection.'],
|
|
38
|
+
['serve', 'Run the MCP server over stdio.'],
|
|
39
|
+
['version', 'Show the installed version.'],
|
|
40
|
+
]],
|
|
41
|
+
['Get started', [['tum-mcp setup --client codex', 'Prepare the backend and a client.'], ['tum-mcp connect', 'Choose services and sign in.']]],
|
|
42
|
+
]);
|
|
31
43
|
} else if (['--version', 'version'].includes(args[0])) {
|
|
32
44
|
console.log(version);
|
|
45
|
+
} else if (args[0] === 'install' && args.some(arg => ['--help', '-h'].includes(arg))) {
|
|
46
|
+
printHelp(version, 'Choose optional workflows to install, or provide their names.', 'tum-mcp install [lecture|studocu|audio-notes]... [OPTIONS]', [
|
|
47
|
+
['Options', [['--asr / --no-asr', 'Provision isolated lecture recognition; models load on demand.'], ['--json', 'Print machine-readable results.'], ['-h, --help', 'Show this help.']]],
|
|
48
|
+
]);
|
|
33
49
|
} else if (['setup', 'update', 'uninstall'].includes(args[0]) && args.some(arg => ['--help', '-h'].includes(arg))) {
|
|
34
50
|
const help = {
|
|
35
|
-
update:
|
|
36
|
-
|
|
37
|
-
|
|
51
|
+
update: {
|
|
52
|
+
description: 'Install the latest npm release and refresh configured clients.',
|
|
53
|
+
usage: 'tum-mcp update [OPTIONS]',
|
|
54
|
+
options: [['--local', 'Refresh the installed version without contacting npm.']],
|
|
55
|
+
},
|
|
56
|
+
setup: {
|
|
57
|
+
description: 'Prepare the runtime and choose coding clients to configure.',
|
|
58
|
+
usage: 'tum-mcp setup [OPTIONS]',
|
|
59
|
+
options: [['--client NAME', 'Choose codex, claude, cursor, antigravity or generic; repeat as needed.'], ['--host local|windows', 'Choose the client host; windows is for WSL registrations.']],
|
|
60
|
+
},
|
|
61
|
+
uninstall: {
|
|
62
|
+
description: 'Remove managed setup while retaining saved user data by default.',
|
|
63
|
+
usage: 'tum-mcp uninstall [lecture|studocu|audio-notes]... [OPTIONS]',
|
|
64
|
+
options: [['(no arguments)', 'Choose extensions or All in the interactive picker.'], ['--client NAME', 'Remove one client registration.'], ['--host local|windows', 'Choose the client host.'], ['--purge-runtime', 'Remove verified runtimes when All is selected.'], ['--forget-credentials', 'Forget saved credentials when All is selected.']],
|
|
65
|
+
},
|
|
38
66
|
};
|
|
39
|
-
|
|
67
|
+
const selected = help[args[0]];
|
|
68
|
+
printHelp(version, selected.description, selected.usage, [
|
|
69
|
+
['Options', [...selected.options, ['-h, --help', 'Show this help.']]],
|
|
70
|
+
]);
|
|
40
71
|
} else {
|
|
72
|
+
const hasExtension = args.slice(1).some(arg => ['lecture', 'studocu', 'audio-notes'].includes(arg));
|
|
41
73
|
let packageAction = args[0] === 'update';
|
|
42
74
|
if (args[0] === 'update') {
|
|
43
75
|
if (args.length > 2 || (args.length === 2 && args[1] !== '--local')) throw new Error('Usage: tum-mcp update [--local]. Use --help for details.');
|
|
44
76
|
if (args[1] === '--local') { packageAction = false; args = ['update']; }
|
|
45
77
|
}
|
|
46
|
-
if (args[0] === 'uninstall') {
|
|
78
|
+
if (args[0] === 'uninstall' && !hasExtension) {
|
|
47
79
|
const { values } = parseArgs({ args: args.slice(1), options: {
|
|
48
80
|
all: { type: 'boolean' }, client: { type: 'string' }, host: { type: 'string' },
|
|
49
|
-
'keep-package': { type: 'boolean' }, 'purge-runtime': { type: 'boolean' }, 'forget-credentials': { type: 'boolean' },
|
|
81
|
+
'keep-package': { type: 'boolean' }, 'purge-runtime': { type: 'boolean' }, 'forget-credentials': { type: 'boolean' }, json: { type: 'boolean' },
|
|
50
82
|
} });
|
|
51
83
|
if (values.host && !['local', 'windows'].includes(values.host)) throw new Error('Choose --host local or windows.');
|
|
52
84
|
if (values.client !== undefined && !['codex', 'claude', 'cursor', 'antigravity', 'generic'].includes(values.client)) throw new Error('Choose a supported --client name.');
|
|
53
85
|
if (values.client && (values.all || values['purge-runtime'] || values['forget-credentials'])) throw new Error('Client-only removal cannot use --all or data/runtime cleanup options.');
|
|
54
|
-
if (
|
|
55
|
-
|
|
86
|
+
if (values.all && values.json) throw new Error('--json requires named extensions.');
|
|
87
|
+
if (values['keep-package'] && !values.all && !values.client) throw new Error('Use --client for registration-only removal.');
|
|
88
|
+
packageAction = Boolean(values.all) && !values['keep-package'];
|
|
56
89
|
args = args.filter(arg => arg !== '--keep-package');
|
|
57
90
|
}
|
|
58
91
|
if (packageAction) {
|
|
59
92
|
process.exitCode = await managePackage(args[0], args.slice(1), dataRoot());
|
|
60
93
|
} else {
|
|
61
|
-
let python = ['setup', 'update'].includes(args[0]) ? await ensureRuntime() : currentPython();
|
|
94
|
+
let python = ['setup', 'update', 'install'].includes(args[0]) ? await ensureRuntime() : currentPython();
|
|
62
95
|
if (args[0] === 'uninstall' && !python) python = await ensureRuntime();
|
|
63
96
|
if (!python) throw new Error('SETUP_REQUIRED: Run tum-mcp setup first.');
|
|
64
97
|
const forwarded = args;
|
|
65
98
|
const env = { ...process.env, TUM_MCP_NPM_LAUNCHER: '1' }; delete env.PYTHONPATH; delete env.PYTHONHOME;
|
|
66
|
-
const purge = args[0] === 'uninstall' && args.includes('--purge-runtime');
|
|
99
|
+
const purge = args[0] === 'uninstall' && args.includes('--purge-runtime') && args.includes('--all');
|
|
67
100
|
const release = purge ? await acquireSetupLock() : null;
|
|
68
101
|
try {
|
|
69
102
|
const child = spawnSync(python, ['-I', '-m', 'tum_mcp', ...forwarded], { env, stdio: 'inherit', shell: false });
|
|
70
103
|
if (child.error) throw new Error('Managed backend could not start; run setup again.');
|
|
71
104
|
process.exitCode = child.status ?? (child.signal === 'SIGINT' ? 130 : 1);
|
|
105
|
+
if (args[0] === 'uninstall' && child.status === 20) {
|
|
106
|
+
process.exitCode = await managePackage('uninstall', [...args.slice(1), '--all'], dataRoot());
|
|
107
|
+
}
|
|
72
108
|
if (purge && child.status === 0) await removeRuntimeFiles();
|
|
73
109
|
} finally { if (release) await release(); }
|
|
74
110
|
}
|
package/npm/ui.mjs
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Bootstrap help stays available before Python setup; installed help uses the backend.
|
|
2
|
+
const color = process.stdout.isTTY && !('NO_COLOR' in process.env) && process.env.TERM !== 'dumb';
|
|
3
|
+
const width = Math.min(Number(process.env.COLUMNS) || process.stdout.columns || 80, 100);
|
|
4
|
+
const styled = (text, code) => color ? `\x1b[${code}m${text}\x1b[0m` : text;
|
|
5
|
+
|
|
6
|
+
function line(text, indent = '') {
|
|
7
|
+
const available = Math.max(16, width - indent.length);
|
|
8
|
+
let remaining = text;
|
|
9
|
+
while (remaining.length > available) {
|
|
10
|
+
const space = remaining.lastIndexOf(' ', available);
|
|
11
|
+
const end = space > 0 ? space : available;
|
|
12
|
+
console.log(indent + remaining.slice(0, end));
|
|
13
|
+
remaining = remaining.slice(end).trimStart();
|
|
14
|
+
}
|
|
15
|
+
console.log(indent + remaining);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function printHelp(version, description, usage, sections = []) {
|
|
19
|
+
console.log(`${styled('TUM MCP', '1')} Help ${styled(version, '2')}`);
|
|
20
|
+
line(description);
|
|
21
|
+
console.log();
|
|
22
|
+
line('Usage');
|
|
23
|
+
line(usage, ' ');
|
|
24
|
+
console.log();
|
|
25
|
+
for (const [title, rows] of sections) {
|
|
26
|
+
console.log(styled(title, '1'));
|
|
27
|
+
const labelWidth = Math.max(...rows.map(([label]) => label.length)) + 2;
|
|
28
|
+
for (const [label, detail] of rows) {
|
|
29
|
+
if (width < 70 || labelWidth > width / 2) {
|
|
30
|
+
line(label);
|
|
31
|
+
line(detail, ' ');
|
|
32
|
+
} else {
|
|
33
|
+
const prefix = label.padEnd(labelWidth);
|
|
34
|
+
const available = Math.max(16, width - prefix.length);
|
|
35
|
+
const words = detail.split(' ');
|
|
36
|
+
let row = '';
|
|
37
|
+
let first = true;
|
|
38
|
+
for (const word of words) {
|
|
39
|
+
if (row && row.length + word.length + 1 > available) {
|
|
40
|
+
console.log((first ? prefix : ' '.repeat(labelWidth)) + row);
|
|
41
|
+
first = false;
|
|
42
|
+
row = '';
|
|
43
|
+
}
|
|
44
|
+
row += (row ? ' ' : '') + word;
|
|
45
|
+
}
|
|
46
|
+
console.log((first ? prefix : ' '.repeat(labelWidth)) + row);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
console.log();
|
|
50
|
+
}
|
|
51
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jamestesting888/tum-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Read-only TUM
|
|
3
|
+
"version": "0.9.1",
|
|
4
|
+
"description": "Read-only TUM campus tools and source-backed study, exercise and lecture workflows",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
},
|
|
13
13
|
"files": [
|
|
14
14
|
"npm/tum-mcp.mjs",
|
|
15
|
+
"npm/ui.mjs",
|
|
15
16
|
"npm/runtime.mjs",
|
|
16
17
|
"npm/download.mjs",
|
|
17
18
|
"npm/lock.mjs",
|
|
@@ -28,7 +29,8 @@
|
|
|
28
29
|
"docs/setup.md",
|
|
29
30
|
"docs/development.md",
|
|
30
31
|
"docs/tum-mcp.md",
|
|
31
|
-
"docs/study.md"
|
|
32
|
+
"docs/study.md",
|
|
33
|
+
"docs/lecture-notes.md"
|
|
32
34
|
],
|
|
33
35
|
"scripts": {
|
|
34
36
|
"prepack": "node npm/build.mjs",
|
|
@@ -54,6 +56,9 @@
|
|
|
54
56
|
"moodle",
|
|
55
57
|
"artemis",
|
|
56
58
|
"zulip",
|
|
57
|
-
"codex"
|
|
59
|
+
"codex",
|
|
60
|
+
"tumonline",
|
|
61
|
+
"studocu",
|
|
62
|
+
"lecture-notes"
|
|
58
63
|
]
|
|
59
64
|
}
|
|
Binary file
|