@jamestesting888/tum-mcp 0.4.1 → 0.6.0

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/docs/tum-mcp.md CHANGED
@@ -1,52 +1,50 @@
1
- # TUM MCP 0.4.1 guide
1
+ # TUM MCP guide
2
2
 
3
3
  Package: `@jamestesting888/tum-mcp`, CLI: `tum-mcp`, backend: Python 3.13.
4
- Patch 0.4.1 fixes UTF-8 skill and client-configuration handling on Windows code pages.
5
- Version 0.4.1 is distributed as a public read/local-assistance pilot. The complete
6
- revision 3 remote workflow is not included; its approval and host boundaries
7
- remain unverified and its remote-action tools remain disabled.
4
+ Version **0.6.0** provides read-only course retrieval and five local study workflows.
8
5
 
9
6
  ## Current capabilities
10
7
 
11
- The campus server preserves all sixteen `moodle_*` tools and the existing Moodle
12
- session/keychain identity. It adds scoped Zulip channel search/topic reads,
13
- released Artemis programming statements, exact-revision visible feedback,
14
- participation-bound workspace preparation, approved container test recipes,
15
- submission previews, and seven portable workflow skills.
16
-
17
- Remote start, push, submit, rebuild, Zulip posting, and DMs are unavailable.
18
- An internal, release-gated executor covers exact-action fingerprints, encrypted
19
- expiring one-use grants, account/scope/credential revalidation, and durable
20
- unknown-outcome receipts. Synthetic tests cover one POST or exact-commit push,
21
- copied/fabricated approvals, changed targets, and lost responses. No MCP write
22
- tool, approval issuer, or preference can open this development release's gate.
23
- The internal executor is groundwork for Phase 5; no live-action certification is claimed.
24
- Revision 3 Phase 5 needs a demonstrated trusted approval/credential boundary and
25
- safe practice-exercise verification before those tools can be exposed. A
26
- submission preview never performs a commit or remote action. Native Git/browser
27
- tools available to an unrestricted host remain outside the MCP enforcement
28
- boundary; the server does not claim to prevent every host-level push.
29
-
30
- The verified public origins are `https://artemis.tum.de` and
31
- `https://zulip.cit.tum.de`. Public discovery on 24 October 2026 reported Artemis
32
- 10.4, source revision `d8594cc5fb2f2ec276bd123861be7ff20c1b3cc0`, and Zulip 12.0,
33
- feature level 498, with TUM Shibboleth. No account permission follows from that
34
- public discovery. Provider routes were checked against that Artemis revision.
8
+ All sixteen `moodle_*` compatibility tools remain available, including materials,
9
+ announcements, forums and explicitly scoped private-record reads. Artemis adds
10
+ available-course metadata, lectures and learning units, student PDF attachments,
11
+ released non-quiz statements and permitted exact-commit feedback. Zulip provides
12
+ scoped channel/topic search and cited discussion reads.
13
+
14
+ Website access is read-only. There are no public exercise workspace, test-run,
15
+ submission, start, deployment, rebuild or push workflows. The retained internal
16
+ remote gate rejects every action even if an old verification flag is enabled.
17
+ Local downloads, source inventories, study-site builds and checkpoint storage
18
+ are local operations; they do not post, submit or mark campus content as read.
19
+
20
+ Artemis lecture reads use the student overview/detail endpoints, verify the
21
+ selected course and omit unreleased units and personal completion records.
22
+ `artemis_get_attachment` retrieves a bounded page range from the student PDF,
23
+ which excludes hidden slides, and optionally saves that copy locally. Original
24
+ staff links are never fetched. Video/online links remain cited references;
25
+ unsupported or external content is reported as a retrieval gap.
26
+
27
+ Lecture routes were checked against the
28
+ [Artemis source](https://github.com/ls1intum/Artemis/blob/88824427f7ea38512606824c58b8858e539eb2eb/src/main/java/de/tum/cit/aet/artemis/lecture/web/LectureResource.java)
29
+ and the
30
+ [student file boundary](https://github.com/ls1intum/Artemis/blob/88824427f7ea38512606824c58b8858e539eb2eb/src/main/java/de/tum/cit/aet/artemis/core/web/FileResource.java).
31
+ Synthetic fixtures are the default. Live checks remain private and use explicit scopes.
35
32
 
36
33
  ## Build and test the local package
37
34
 
38
- For normal installation, use `npm install --global @jamestesting888/tum-mcp@0.4.1`
35
+ For normal installation, use `npm install --global @jamestesting888/tum-mcp@latest`
39
36
  and `tum-mcp setup --client codex`. The following commands are for maintainers.
40
37
 
41
38
  ```sh
42
39
  uv sync --locked
43
- uv run ruff check src tests plugin/scripts scripts
44
- uv run ruff format --check src tests plugin/scripts scripts
40
+ uv run ruff check src tests scripts
41
+ uv run ruff format --check src tests scripts
45
42
  uv run pytest -q -m 'not live'
46
43
  node npm/build.mjs
47
44
  npm test
48
45
  npm pack --ignore-scripts --pack-destination dist
49
- npm run test:consumer -- dist/jamestesting888-tum-mcp-0.4.1.tgz
46
+ npm run test:consumer
47
+ npm run test:upgrade
50
48
  ```
51
49
 
52
50
  The npm artifact has an explicit file allowlist, a bundled backend wheel,
@@ -69,17 +67,20 @@ and Python 3.13.15; an existing matching uv, including the verified cached downl
69
67
  is reused. Source checkouts and system
70
68
  Python are unnecessary for consumers. Supported bootstrap targets are macOS
71
69
  arm64/x64, Windows arm64/x64, and glibc Linux arm64/x64; hands-on verification is
72
- recorded separately. Linux still needs a native Secret Service for credentials.
70
+ recorded separately. New campus sessions use permission-restricted local keys and need no Secret Service.
73
71
  Clean consumer bootstrap, idempotent setup, diagnostics, and skill validation
74
72
  passed on macOS ARM64 and in Linux ARM64 and x86_64 containers. The x86_64 check
75
73
  ran through Docker amd64 emulation on an ARM64 Mac; packaged MCP protocol checks
76
74
  and an encrypted credential round trip through a real GNOME Secret Service in an
77
75
  isolated D-Bus session also passed. Real Linux desktop browser sign-in, macOS x64,
78
- and Windows hands-on checks remain open. The installer targets glibc Linux
76
+ and Windows hands-on checks remain open. New storage and terminal behavior need
77
+ the current checkout’s test evidence; earlier native-store results do not certify them. The installer targets glibc Linux
79
78
  x86_64/amd64 and aarch64/ARM64.
80
79
 
81
- `update` provisions the backend bundled in the invoked package and preserves
82
- older runtime directories. To obtain a newer public package after publication,
80
+ `update` prepares the backend bundled in the invoked package, refreshes
81
+ previously configured clients and preserves older runtime generations.
82
+ [Update and removal behavior](setup.md#update-and-remove) covers ownership
83
+ receipts, legacy adoption, conflict handling and explicit cleanup. To obtain a newer public package after publication,
83
84
  invoke its reviewed version explicitly. It does not publish a release or replace
84
85
  customized client skills silently. If interrupted setup leaves `setup.lock`,
85
86
  confirm that no setup process is running before removing that directory locally.
@@ -89,55 +90,69 @@ available to existing client registrations. Use an older reviewed package and
89
90
  rerun its setup to restore that runtime, reviewing any client configuration diff.
90
91
 
91
92
  For platforms outside the bootstrap targets, the source installation needs
92
- Python 3.13+, uv, Git, and a native credential store: run `uv sync --locked`, then
93
- `uv run tum-mcp setup --client generic` from the checkout. Chrome is needed for
94
- browser onboarding. Docker is needed only for isolated assignment tests.
93
+ Python 3.13+, uv, and Git: run `uv sync --locked`, then
94
+ `uv run tum-mcp setup --client generic` from the checkout. An installed Chromium browser is needed for
95
+ browser onboarding. See [setup](setup.md) for browser choices and WSL.
95
96
 
96
97
  ## Connections and scopes
97
98
 
98
99
  ```sh
99
- tum-mcp connect campus
100
+ tum-mcp connect
100
101
  tum-mcp status
101
102
  tum-mcp discover artemis ACCOUNT_ID
102
103
  tum-mcp discover zulip ACCOUNT_ID
103
- tum-mcp scope artemis ACCOUNT_ID --course COURSE_ID --sensitive --workspace
104
+ tum-mcp scope artemis ACCOUNT_ID --course COURSE_ID --sensitive
104
105
  tum-mcp scope zulip ACCOUNT_ID --channel CHANNEL_ID
105
106
  ```
106
107
 
107
- `connect campus` opens Artemis and Zulip in one temporary Chrome context for
108
- user-driven sign-in/MFA; the identity provider can reuse its session between tabs.
109
- Only each service's own host cookies are encrypted and saved. Identity-provider
110
- cookies are discarded when the browser closes. Single-service commands remain
111
- available as `connect artemis` and `connect zulip`.
112
-
113
- Zulip browser sessions use its read-only `/json/` routes; API-key authentication
114
- uses `/api/v1/`. A successful authenticated `/json/users/me` read was verified on
115
- TUM's deployment. This separation is also documented in
116
- [Zulip's dispatcher](https://github.com/zulip/zulip/blob/12.0/zerver/lib/rest.py).
117
- Session expiry requires browser reconnection. API keys are optional:
118
- `connect zulip --auth api-key` imports an existing key through hidden local input.
119
- Never paste credentials in chat. Browser login and Artemis Git access remain
120
- separate capabilities. Existing scopes survive reconnection; new identities start
121
- with empty scopes. Private channels additionally require `--private-channel ID` while
122
- remaining in `--channel ID`. `--sensitive` enables own Artemis participation and
123
- feedback reads; `--workspace` separately enables preparation under the configured
124
- workspace root. Neither authorizes submission.
125
-
126
- On 24 October 2026, both saved browser-session credentials passed identity
127
- verification through the actual MCP process. Scoped Artemis exercise listing and
128
- statement retrieval, plus a bounded Zulip channel search, passed. No participation
129
- was started, code pushed, message sent, or read flag changed by these checks.
108
+ `connect` takes no arguments or connection options. Move with up/down, toggle
109
+ services with Space, and press Enter. Choose a browser when more than one is
110
+ installed. Only selected tabs open in one temporary browser context. Moodle,
111
+ Artemis and Zulip all follow this flow; no separate Moodle login is needed.
112
+ Sign-in/MFA stays in the browser. `TERM=dumb` uses numbered prompts. Ctrl+C
113
+ cancels and retains completed connections. Old service/campus arguments and
114
+ `--service`/`--auth` flags are rejected before any browser opens.
115
+
116
+ Detection covers Chrome, Edge, Brave, Chromium, Vivaldi, Opera and selected
117
+ preview channels. Set `TUM_MCP_BROWSER` to an executable path for another
118
+ compatible Chromium build. Browsers must permit Playwright automation. Firefox
119
+ and Safari use different protocols and are outside this integration.
120
+ Only service-owned cookies are saved; identity-provider cookies are discarded
121
+ when the temporary browser closes. Existing browser profiles are never imported.
122
+
123
+ Zulip uses its read-only `/json/` routes with the browser session; no API key is
124
+ required. Reconnect through the same selector when a session expires. Existing
125
+ API-key records remain readable for compatibility, but key entry is not part of
126
+ onboarding. See [Zulip's dispatcher](https://github.com/zulip/zulip/blob/12.0/zerver/lib/rest.py).
127
+ Existing scopes survive reconnection; new identities start with empty scopes.
128
+ Private Zulip channels require `--private-channel ID` as well as `--channel ID`.
129
+ `--sensitive` enables own Artemis participation/feedback reads. It grants no
130
+ website mutation or local execution permission.
130
131
 
131
132
  Settings live outside the installed package in `TUMMCP/config/preferences.json`.
132
133
  The default data directory is beside the legacy `TUMMoodle` directory on each OS.
133
- Existing Moodle data is retained in place, preserving the keychain lookup. New
134
- service credentials are encrypted separately with an account/provider/origin-bound
135
- identity and a native credential-store key. There is no plaintext fallback.
136
- For the platform trade-offs, upstream examples, and the distinction between
137
- Keychain and desktop-app permissions, see
138
- [credential storage options](credential-storage-options.md). Use the installed
139
- `tum-mcp` runtime from the first login to avoid development-to-packaged Python
140
- permission changes.
134
+ Existing Moodle data and its native-store identity are retained in place. New
135
+ campus connections deliberately do not read or migrate native-store secrets;
136
+ reconnect each service once to use local-file storage. The combined MCP process
137
+ uses that storage for all `moodle_*` compatibility tools. The separate Moodle-only
138
+ installer keeps its native-store default.
139
+ Historical Git credentials remain local data for legacy cleanup; the current
140
+ package provides no assignment Git workflow.
141
+
142
+ New Moodle sessions live under `TUMMoodle/local-session/`; campus credentials live
143
+ under `TUMMCP/credentials/local/`. Each directory has an independent `session.key`.
144
+ Encrypted records and keys have owner-only permissions: 0700 directories / 0600
145
+ keys on POSIX; protected current-user DACLs on Windows through PowerShell. No
146
+ administrator privileges are requested. This avoids Keychain/Secret Service
147
+ prompts but protects less than a native store. A copy of both ciphertext and key
148
+ is sufficient to decrypt a session. Do not share, sync publicly, or package them.
149
+
150
+ Missing or damaged keys fail closed. Restore the matching key from a private
151
+ backup. To start fresh, stop clients and move the affected **local storage folder**
152
+ to a private backup before reconnecting; this also resets its stored Git tokens.
153
+ Never remove the legacy Moodle directory or downloads to repair a login.
154
+ Native-store records remain available to the older installation for rollback.
155
+
141
156
  Zulip message text is retrieved live and is not persisted. Retrieved excerpts may
142
157
  be transmitted to the coding agent's configured AI provider. Moodle's existing
143
158
  document cache retains its documented plaintext/expiry behavior.
@@ -145,38 +160,33 @@ document cache retains its documented plaintext/expiry behavior.
145
160
  Course nicknames can be mapped in `mappings` using explicit per-service IDs.
146
161
  The tools resolve one exact mapping; ambiguity never grants broader access.
147
162
 
148
- ## Assignment workspaces and tests
163
+ ## Diagnostics
149
164
 
150
- The user requests `artemis_prepare_workspace` with explicit account/course/
151
- exercise IDs and graded/practice mode. Missing participation returns
152
- `ACTION_REQUIRED`; preparation never starts it. Offline IDE access must be
153
- affirmatively enabled. Import an existing participation-scoped Git token locally:
165
+ `doctor` reads local configuration and checks runtime prerequisites. It does not
166
+ open a browser, contact campus services, decrypt sessions, or read native stores.
167
+ Saved sessions are **Not verified** until checked. Git and Docker are not
168
+ prerequisites. Client registration is distinguished
169
+ from activation; the host must confirm a running MCP connection after setup.
154
170
 
155
- ```sh
156
- tum-mcp workspace connect-git ACCOUNT_ID COURSE_ID EXERCISE_ID
157
- ```
171
+ Use `doctor --live` for bounded authenticated identity checks on saved local
172
+ sessions and optional GitHub CLI authentication. Campus checks read Moodle's
173
+ course overview and Artemis/Zulip identity only;
174
+ it does not broaden content scopes. `doctor --json` emits schema-versioned JSON
175
+ without terminal styling; combine both flags for live automation. Paths appear
176
+ in JSON for troubleshooting. Default diagnostics do not create state folders.
177
+
178
+ ## Study workflows
158
179
 
159
- The hidden clone URL must match the server-reported participation repository.
160
- It is sanitized before storage/output. A narrow Git credential helper supplies
161
- the token only to that HTTPS repository. Clone uses no inherited credential
162
- helpers, external Git protocols, hooks, submodules, or dependency installers.
163
- Existing unrelated/dirty work is preserved. Local receipt files contain IDs,
164
- workspace, mode, branch, and revision, never tokens.
165
-
166
- Configure `test_recipes` locally with a unique `name`, exact `account_id`,
167
- `course_id`, an image pinned as `registry/image@sha256:DIGEST`, an `argv` array,
168
- `timeout_seconds`, and `verification_level` (`targeted` by default, or `full`
169
- after reviewing the complete test command). Submission preflight requires a
170
- passing `full` recipe for the exact content. Review the recipe and obtain its
171
- image/dependencies as a separate step. The runner uses an already-present image (`--pull=never`), no
172
- network, no home/keychain/SSH mounts, a read-only container filesystem, dropped
173
- capabilities, and CPU/memory/process/time/output limits. Only the assignment
174
- workspace is mounted read/write, with its Git metadata mounted read-only.
175
- Receipts record exit status, source fingerprints, recipe, image, timestamps,
176
- and bounded output. A missing engine or recipe fails
177
- closed. Evidence is encrypted/authenticated outside the assignment directory;
178
- editing a workspace JSON file cannot fabricate a passing receipt. Ordinary
179
- host-native testing does not acquire these isolation guarantees.
180
+ `read-content` retrieves course information across the three websites. `sync-study`
181
+ uses read-only local status to initialize an explicitly chosen available course or
182
+ reconcile an existing project. Incomplete state is preserved for recovery.
183
+ `prepare-study` creates or extends its local interactive site. See the
184
+ [study guide](study.md) for examples, state structure and helper commands.
185
+
186
+ One project holds one course. Source revisions, coverage and course knowledge
187
+ avoid unnecessary rereads. Edited files and customized site templates are kept;
188
+ changed sources invalidate dependent units. Study projects, originals and learner
189
+ progress are preserved during package updates/removal.
180
190
 
181
191
  ## Client and skill setup
182
192
 
@@ -189,24 +199,63 @@ steps and never equates writing files with activation.
189
199
 
190
200
  The Codex adapter uses a contained Node launcher to pin the managed Python in
191
201
  isolated mode; portable stdio manifests require a bare or contained executable.
192
- Disposable-profile checks with Codex CLI 0.164.0 discovered all seven campus
193
- skills and 36 tools with no discovery error. Claude Code 2.1.304 connected to the
194
- stdio process. `scripts/verify_campus_clients.py` reproduces those checks without
195
- running another coding agent or changing real user profiles. After a user restart,
196
- an active Codex desktop chat also loaded all 36 tools, verified both provider
197
- identities, and passed scoped Artemis exercise and Zulip message reads.
198
- Host/model activation trials remain a separate gate.
199
-
200
- `setup --client claude` preserves unrelated user configuration, registers the
201
- local MCP server, and installs the skill pack. Codex's submission invocation
202
- policy and Claude's `disable-model-invocation` metadata are handled independently.
203
- Generic clients receive configuration plus optional manual skill export.
202
+ The shipped pack contains five skills: `read-content`, `sync-study`,
203
+ `prepare-study`, `audio-notes` and `publish-study`. Website-specific retrieval
204
+ guidance is loaded from references within read-content. Teaching, schema and design contracts live
205
+ with prepare-study; the renderer and synthetic example ship as reusable assets.
206
+ Audio Notes converts prepared content into category tracks and maintains coverage,
207
+ scripts, voice settings, candidates and archives under the course's `audio/` root.
208
+ Publish Study uses host GitHub CLI authentication to create a private repository
209
+ and a public Pages website after explicit publication consent. It chooses a course
210
+ and semester name, updates the same site after successful study builds, and shows
211
+ the hosted URL alongside the local launcher URL. No tokens or original course
212
+ downloads are uploaded. See [publishing](study.md#publish-a-study-website).
213
+ Old seven-skill, three-site and separate init/update packs are retired only when
214
+ managed copies remain unchanged. Personal overrides are preserved and require a deliberate merge into
215
+ the consolidated workflows before export.
216
+
217
+ `scripts/verify_campus_clients.py` checks real host discovery in disposable
218
+ profiles without running a model or changing actual user profiles. Host/model
219
+ routing quality is a separate evaluation from structural and discovery checks.
220
+ Claude's invocation metadata follows each workflow's selected policy; automatic
221
+ selection is enabled by default and never grants permission for a mutation.
222
+
223
+ `setup --client cursor` writes `~/.cursor/mcp.json` and installs all five skills
224
+ under `~/.cursor/skills/`.
225
+ `setup --client antigravity` installs the same skills under `~/.gemini/config/skills/`
226
+ and writes `~/.gemini/config/mcp_config.json`; an existing
227
+ legacy `~/.gemini/antigravity/mcp_config.json` is reused when no current file exists.
228
+ Both merge the `tum` stdio entry and preserve unrelated settings.
229
+ From WSL, append `--host windows` to any client setup command to target its
230
+ Windows profile. The generated `wsl.exe` command pins the distribution, Linux
231
+ user, managed Python and data paths, so clients share the WSL connection.
232
+ Use the same host option on uninstall. Native Windows uses the default host.
233
+ `doctor` in WSL shows local and Windows client registrations separately.
234
+ See [the WSL guide](setup.md#wsl) for interop requirements. Conflicting or
235
+ invalid configuration is preserved with an actionable error. Reload MCP servers
236
+ in the host after setup; actual host activation is not certified by writing files.
237
+ See the official [Cursor MCP documentation](https://cursor.com/docs/mcp) and
238
+ [Antigravity MCP documentation](https://antigravity.google/docs/mcp).
239
+
240
+ Both adapters install complete skill bundles, including references and website
241
+ assets. Existing MCP-only registrations gain skills through setup or `tum-mcp update`.
242
+ Ownership receipts track installed files: updates replace only unchanged managed
243
+ files, and uninstall removes only unchanged managed files and the MCP entry.
244
+ An edited managed file blocks that client's update or uninstall for review.
245
+ Unrelated skills, extra user files, sessions and personal work stay intact.
246
+ Without an ownership receipt, uninstall preserves manually installed skills.
247
+ Restart the client and verify that its skills and MCP tools appear; writing files
248
+ does not establish model-routing quality or native desktop activation.
249
+ See the official [Cursor skills guide](https://cursor.com/help/customization/skills)
250
+ and [Antigravity skills guide](https://antigravity.google/docs/skills?app=antigravity-ide).
251
+
252
+ Manual export remains available for other clients or a separate reviewed copy:
204
253
 
205
254
  ```sh
206
255
  tum-mcp skills list
207
- tum-mcp skills inspect tum-zulip-research
208
- tum-mcp skills customize tum-zulip-research
209
- tum-mcp skills diff tum-zulip-research
256
+ tum-mcp skills inspect read-content
257
+ tum-mcp skills customize read-content
258
+ tum-mcp skills diff read-content
210
259
  tum-mcp skills validate
211
260
  tum-mcp skills export /path/to/new/export-folder
212
261
  ```
@@ -220,27 +269,27 @@ trials, and two review passes have not been demonstrated for this pilot.
220
269
  Export refuses symbolic links and
221
270
  does not overwrite an existing destination.
222
271
 
223
- The bundled activation corpus has 140 cases (16 development and four held-out
224
- cases per skill), including explicit/implicit requests, adjacent negatives, and
225
- missing credentials. `skills evaluate TRIALS.jsonl` scores supplied fresh-session
272
+ The activation corpus covers the reading, study and audio workflows, with
273
+ development and held-out partitions. It covers explicit/implicit requests, unrelated
274
+ negatives, missing credentials and unsupported-action negatives. Old trial
275
+ results must not be reused against the consolidated skill labels. `skills evaluate TRIALS.jsonl` scores supplied fresh-session
226
276
  records separately by host/version/model. Each record follows `Trial` in
227
277
  `skill_validation.py` and references its retained raw trace by SHA-256. The scorer
228
278
  does not launch other agents or certify the supplied traces, summary quality,
229
279
  or platform acceptance. Inspect traces and backend effects before approving a
230
280
  release; no measured activation accuracy is claimed by the structural checks.
231
281
 
232
- ## Release scope
233
-
234
- The maintainer authorized public npm distribution of the current 0.4.1 pilot.
235
- This does not certify the complete revision 3 workflow or all desktop targets.
236
- Host/model skill-selection trials, native Windows/macOS x64 onboarding, and real
237
- Linux desktop browser sign-in remain incomplete. Remote workflows also need a
238
- trusted approval/host credential boundary and safe practice verification before
239
- they can be exposed. Browser sign-in alone does not establish a saved backend connection.
240
-
241
- Maintainer checks include the relevant tests, a reviewed tarball inventory,
242
- integrity checks, and an isolated consumer install. Never publish or stage npm
243
- packages as a test. Review and authorization of a registry upload are separate
244
- from a GitHub source push; this pilot is being published to npm first.
245
- `tum-mcp status` reports registry state as `not_checked`, since it inspects local
246
- configuration without making registry requests.
282
+ ## Verification and release scope
283
+
284
+ Local source validation, real MCP protocol discovery, installation/migration
285
+ checks and browser study-site QA are separate gates. Model-routing accuracy and
286
+ human SSO/MFA on every desktop are not established by schema tests or generated
287
+ configuration. No measured skill-selection accuracy is claimed.
288
+
289
+ The existing desktop/WSL CI matrix must pass on the exact pushed revision before
290
+ it is described as verified. Test data and public fixtures are synthetic. Real
291
+ course material, local agent notes and screenshots stay under ignored local paths.
292
+ Maintainer checks include a reviewed tarball inventory, integrity checks and an
293
+ isolated consumer install. Never publish or stage npm packages as a test. Registry
294
+ publication requires separate user authorization and remains paused for this work.
295
+ `tum-mcp status` reports registry state as `not_checked`; it reads local configuration.
@@ -1,5 +1,5 @@
1
1
  {
2
- "wheel": "tum_moodle_integration-0.4.1-py3-none-any.whl",
3
- "wheelSha256": "5e5b586e0bfff7504bb4026d155e274283dfb47d69d7f4b9077e95c7374b71fc",
4
- "requirementsSha256": "2ce7807c938fb7aa2e74fbc9537555830240ea43a2858c2f436ba5efd031dda6"
2
+ "wheel": "tum_mcp-0.6.0-py3-none-any.whl",
3
+ "wheelSha256": "8437422504920753d1d6781cd87c57065cfbb8c0630ff0c5fd1de237b2d00426",
4
+ "requirementsSha256": "25f9efa7a4ffb0b97abcfeb9d4706d04808273ab1b35abcfaa1ef0b66e87591b"
5
5
  }
@@ -48,7 +48,7 @@ backports-zstd==1.8.0 ; python_full_version < '3.14' \
48
48
  beautifulsoup4==4.15.0 \
49
49
  --hash=sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7 \
50
50
  --hash=sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9
51
- # via tum-moodle-integration
51
+ # via tum-mcp
52
52
  brotli==1.2.0 ; platform_python_implementation == 'CPython' \
53
53
  --hash=sha256:0cf8c3b8ba93d496b2fae778039e2f5ecc7cff99df84df337ca31d8f2252896c \
54
54
  --hash=sha256:1b1d6a4efedd53671c793be6dd760fcf2107da3a52331ad9ea429edf0902f27a \
@@ -207,15 +207,15 @@ cryptography==47.0.0 \
207
207
  # via
208
208
  # pyjwt
209
209
  # secretstorage
210
- # tum-moodle-integration
210
+ # tum-mcp
211
211
  defusedxml==0.7.1 \
212
212
  --hash=sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69 \
213
213
  --hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61
214
- # via tum-moodle-integration
214
+ # via tum-mcp
215
215
  filelock==3.32.7 \
216
216
  --hash=sha256:37b8a3d9811b0f9aef7e5ec5c71bb320de52df51e6ca9bcd6f5ad81187660da7 \
217
217
  --hash=sha256:65ff0d0190ea42038b32bda4b77834fb05be2cad4c5b9b01aa4dfb3614536e52
218
- # via tum-moodle-integration
218
+ # via tum-mcp
219
219
  greenlet==3.5.6 \
220
220
  --hash=sha256:06c0e933290fba8ffe53ead4ae1b8044b0e9754b75cebf381aa2bc3e50d82fac \
221
221
  --hash=sha256:2ab5f42ac6c238eb71770715e6e909ad9a1a92b6c681ccb64cd5a0f07edb953f \
@@ -291,7 +291,7 @@ httpx2==2.15.1 \
291
291
  --hash=sha256:ff75485308fbe441e75b1218546e4e78d884df41e1a9741c1f79335ed8fcfef7
292
292
  # via
293
293
  # mcp
294
- # tum-moodle-integration
294
+ # tum-mcp
295
295
  httpx2-jsfetch==1.0 ; sys_platform == 'emscripten' \
296
296
  --hash=sha256:70a0e3eabfef7cce5ad9c629f7d01ca05e418f586646f4ddf14782e4c1454c60 \
297
297
  --hash=sha256:cb916b707601e69a07721aabc8f3f6659be3a6893bc1ff5c6f9e02241df2da32
@@ -329,7 +329,7 @@ jsonschema==4.26.0 \
329
329
  --hash=sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce
330
330
  # via
331
331
  # mcp
332
- # tum-moodle-integration
332
+ # tum-mcp
333
333
  jsonschema-specifications==2025.9.1 \
334
334
  --hash=sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe \
335
335
  --hash=sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d
@@ -337,7 +337,11 @@ jsonschema-specifications==2025.9.1 \
337
337
  keyring==25.7.0 \
338
338
  --hash=sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f \
339
339
  --hash=sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b
340
- # via tum-moodle-integration
340
+ # via tum-mcp
341
+ latex2mathml==3.81.1 \
342
+ --hash=sha256:c337668441b71c819b6733905a8058ba9a9d767bae11a0c5fdacb3aff31361bd \
343
+ --hash=sha256:c95add0c0fcdecad2d70567e0643050d5ea1149fb2e98a5d5792fb1c8eea2ed5
344
+ # via tum-mcp
341
345
  markdown-it-py==4.2.0 \
342
346
  --hash=sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49 \
343
347
  --hash=sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a
@@ -345,7 +349,7 @@ markdown-it-py==4.2.0 \
345
349
  mcp==2.3.0 \
346
350
  --hash=sha256:8b147a50441cf059dc88c684e0aeed3687f0aa0f39c6cde7b90330effd2b34d8 \
347
351
  --hash=sha256:dd0c44c089d16453e8ae31a3877a0054d7a2314caaa81f5e0541b9b1734b2377
348
- # via tum-moodle-integration
352
+ # via tum-mcp
349
353
  mcp-types==2.3.0 \
350
354
  --hash=sha256:968efdbdaedfab06adae40d378a34395f1090c5921d4be3c9cde283aaf76d91d \
351
355
  --hash=sha256:d1e46549edb35ee19a94940fcee6d1addd7e589ab7ea92dda83f5d84781fc362
@@ -420,7 +424,7 @@ pillow==12.3.0 \
420
424
  --hash=sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5 \
421
425
  --hash=sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d \
422
426
  --hash=sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198
423
- # via tum-moodle-integration
427
+ # via tum-mcp
424
428
  playwright==1.64.0 \
425
429
  --hash=sha256:2c14d105548876b15bea5e7eca77bf0d8ff4ba0c607c1ae931067f3d1b010369 \
426
430
  --hash=sha256:5a59af1b230b234008524a5d42b613b233d4256f73bc1dd25bf3f11db0c81b75 \
@@ -430,7 +434,11 @@ playwright==1.64.0 \
430
434
  --hash=sha256:8de42430e9a7c8b04ec963856d484d36ffd452882318ebad2df3e6fb49a8197a \
431
435
  --hash=sha256:97a5c247f1130f3343f097caf3bb1e79358d6b6cfa3550d97ecd721d1905911a \
432
436
  --hash=sha256:d76a501c9930b5a097b00e2448cda2200122a1e8e4be762ff535c1b076277737
433
- # via tum-moodle-integration
437
+ # via tum-mcp
438
+ prompt-toolkit==3.0.53 \
439
+ --hash=sha256:01c0891d7f9237d5e339f7d3e42cdae80b7534abb1c7c0e3352efba6231492f2 \
440
+ --hash=sha256:9ec8a0ad96d5c56148b3f914aa79c1564c3fde5d2e6b876e7bc327e353cf8fa6
441
+ # via questionary
434
442
  psutil==7.2.2 \
435
443
  --hash=sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372 \
436
444
  --hash=sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9 \
@@ -453,7 +461,7 @@ psutil==7.2.2 \
453
461
  --hash=sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486 \
454
462
  --hash=sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00 \
455
463
  --hash=sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8
456
- # via tum-moodle-integration
464
+ # via tum-mcp
457
465
  pycparser==3.11 ; implementation_name != 'PyPy' \
458
466
  --hash=sha256:51d5a8ba2be0bbe440b99d2112604c95bbbc3c2748a64260186c541e1729cd80 \
459
467
  --hash=sha256:d875f09c3507d00e1aba0eecc6dcadc1352f30fff09dc6bff2f1c2935e97c2bc
@@ -464,7 +472,7 @@ pydantic==2.14.1 \
464
472
  # via
465
473
  # mcp
466
474
  # mcp-types
467
- # tum-moodle-integration
475
+ # tum-mcp
468
476
  pydantic-core==2.50.1 \
469
477
  --hash=sha256:0036473f5583e6a60e50b8b21651511564277a3f05cc5dab8cf579f552cd5f6c \
470
478
  --hash=sha256:009634b83993777ddcd69cad0ffcace43dabde692109528e35f0fde91e386a8b \
@@ -559,7 +567,7 @@ pyjwt==2.15.1 \
559
567
  pypdf==6.21.1 \
560
568
  --hash=sha256:2d62c383acd6e0dff0a96322ba8b1135229343b084d73c6f6cfd947fd291afcb \
561
569
  --hash=sha256:553e2d42f5bb3bb2a785a7d3de8ef90bb7df74b5413eff5a7b4388007ea9254b
562
- # via tum-moodle-integration
570
+ # via tum-mcp
563
571
  pypdfium2==5.14.0 \
564
572
  --hash=sha256:09b99c8f0cb427eb17fec13c0862ed598bba34b4843df153f70fff806a2820bc \
565
573
  --hash=sha256:11f281613fa22313d9c7ab89947665e84eccf8ebe40e1198a84a88352305648d \
@@ -584,7 +592,7 @@ pypdfium2==5.14.0 \
584
592
  --hash=sha256:eb8aeca157808f323e39ea298cc6d6c8e080c192ea2efb1ca81daa0f0ff4d095 \
585
593
  --hash=sha256:f1b696e6901e16f114a2ec6332e5e3f8f5033a901614ead28499ab18ca6024f5 \
586
594
  --hash=sha256:f6f13bbcc5f4adabc2676e52f662c6cb375de86b314790b0ae08f3ab62eb116a
587
- # via tum-moodle-integration
595
+ # via tum-mcp
588
596
  python-multipart==0.0.32 \
589
597
  --hash=sha256:be54b7f3fa167bb83e4fcd936b887b708f4e57fe75911c02aebf53efaf8d938e \
590
598
  --hash=sha256:ff6d3f776f16878c894e52e107296ffc890e913c611b1a4ec6c44e2821fe2e23
@@ -634,7 +642,11 @@ pyyaml==6.0.3 \
634
642
  --hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \
635
643
  --hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \
636
644
  --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6
637
- # via tum-moodle-integration
645
+ # via tum-mcp
646
+ questionary==2.1.1 \
647
+ --hash=sha256:3d7e980292bb0107abaa79c68dd3eee3c561b83a0f89ae482860b181c8bd412d \
648
+ --hash=sha256:a51af13f345f1cdea62347589fbb6df3b290306ab8930713bfae4d475a7d4a59
649
+ # via tum-mcp
638
650
  referencing==0.37.0 \
639
651
  --hash=sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231 \
640
652
  --hash=sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8
@@ -644,7 +656,9 @@ referencing==0.37.0 \
644
656
  rich==15.0.0 \
645
657
  --hash=sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb \
646
658
  --hash=sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36
647
- # via typer
659
+ # via
660
+ # tum-mcp
661
+ # typer
648
662
  rpds-py==2026.9.1 \
649
663
  --hash=sha256:00ba2d8c7dd4ee537978ddf4b3fbd712bef2d8751603f7f3146b3f4287768e25 \
650
664
  --hash=sha256:028ad274ea951dac64491b5d1e65712a4aeabfdbdb9fccf797b57bd899b0c495 \
@@ -754,7 +768,7 @@ truststore==0.10.5 ; sys_platform != 'emscripten' \
754
768
  typer==0.27.3 \
755
769
  --hash=sha256:d0396f770a560ab1b0a8504e13b5f254b728cedb05c61cf0359e944e50ce8901 \
756
770
  --hash=sha256:e50022f28b82a86313e54501317a1db64bf8f8d036ff8cfe5ca7e47675454aff
757
- # via tum-moodle-integration
771
+ # via tum-mcp
758
772
  typing-extensions==4.16.0 \
759
773
  --hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \
760
774
  --hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5
@@ -778,3 +792,34 @@ uvicorn==0.54.0 ; sys_platform != 'emscripten' \
778
792
  --hash=sha256:505bdb0f318731d45f1f712071fc781a8981f6847a31c902c9f5e652d4f67faf \
779
793
  --hash=sha256:a2e33cbfaa0306f8e6b0c13e0cb89d7d7a2da3e62b90c66e18c33d9807b28620
780
794
  # via mcp
795
+ wcwidth==0.9.3 \
796
+ --hash=sha256:16d09df90b3a8f799ea14c726a41d9b906c3104f95f46d158e1ebe45cf4d547b \
797
+ --hash=sha256:2f875a4c9e62df2ecfa70d99b24c551f2245609858e179c3a40e74631b2d08a4 \
798
+ --hash=sha256:3b119ef60177a92b4f298b80e98464c2922a1fba3ed77fe9a2bcb69edf1b9af4 \
799
+ --hash=sha256:3e3e31d6c17d6da3051f7eb854d5e4bebdc52a08a7a52adc2da6f15af51304e8 \
800
+ --hash=sha256:457f986e4867111cb037ccbf0d97ae100b1ecad030d43a020e7207f1e29649d5 \
801
+ --hash=sha256:52a13869704d43a4add59c68ebc892198e53063883114783bf0b7457e250e3f4 \
802
+ --hash=sha256:537ea00b6792bb243cd09582322c54dbc848879e5d34ea4c5fee0147529685ab \
803
+ --hash=sha256:569a0cdb826d3097b6dbacfaa45aa0002d72a2ba6fa8a63251ea43ac4dd7b6a4 \
804
+ --hash=sha256:5d3b0b6c37f40e8d8298941ec373a426a892bb9a514328abcc9226cdc60ae6eb \
805
+ --hash=sha256:658dcbce546e7f28ee361f88e4a8e591dd56f46bff6084e11b4ad8310ed99946 \
806
+ --hash=sha256:6f3e855d3a09af8b7b6d56e76bc270681032f8a37d527a8d5707a441958e3730 \
807
+ --hash=sha256:70a2ca239b85a219324968993c76c117fe423d4e1a7c9d860c999c66192f2570 \
808
+ --hash=sha256:7a95d8c784cbccbbcb808eaadfd156cd282b2bdd95e89b32505e3443381ce61d \
809
+ --hash=sha256:80557db1f77148b78e1b3c2a9cc4ebc4feabef42aaf69a555565057031c32367 \
810
+ --hash=sha256:9470169fcb4e5340269175ebb3642dd5bfc8f82da8c86f29fc1fefc6c2b9bc1b \
811
+ --hash=sha256:9ab8bfee107e08de09e15f9f6afb9fe0f64c8d64fd296d0d8557bafe71ea3f93 \
812
+ --hash=sha256:9e1cbe18c18d152e1e68e4e2561dab6c2bc988f8fd337a1fb2e1e0809c3fa568 \
813
+ --hash=sha256:a44acbb23b525070a0b8c343dd7cab7a4020aff73b38804f7a66d6a66e16e3fc \
814
+ --hash=sha256:a7c0405a3bf3c564e481d6b2d55c99cc231bb68cf8f4a0995944bbce5ebf1a5d \
815
+ --hash=sha256:aab90ab489850f87633922c3064f6d0442d8f6ae5407a62f82bdb1f424179c05 \
816
+ --hash=sha256:c12abd75ffcbad417e7770a6feb82413c102ccce5c435068c39a82e2218b00b3 \
817
+ --hash=sha256:c1bbc8ebf133422cadfefea95a9f89d6c9e9a1ae19930bef7862a9b59b20bbad \
818
+ --hash=sha256:c4531d93344441a7948e665854f0c40e3a8342ee106436d1531efa7a9fa7641e \
819
+ --hash=sha256:dfe7cfbd4cb59db9fe0931bd6091ab4a95b3acc5d56bfb50fa9fef0ccba5dc5c \
820
+ --hash=sha256:e3c9069c54a2da0bf4f6c7e65a735cb1da0f47601a15cb5fef7e4b6ffca4cf60 \
821
+ --hash=sha256:e9362be098c43d076aa43754face3cc0180fa81cea9ba304240b15490f2617e8 \
822
+ --hash=sha256:eef39f3260991d8767189d296f0116fa4b45ad9c3a9a16d5af9187fb66b27564 \
823
+ --hash=sha256:f11789e520ade8017fa93b01a4b8985571bb433eaefc2f857b57e36875e2e1d8 \
824
+ --hash=sha256:f2f943c4ef14e9baba730740265f4e5bf5fc8473550e36cd92828cd5663561a6
825
+ # via prompt-toolkit