@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/CHANGELOG.md +29 -0
- package/NOTICE +2 -4
- package/README.md +157 -59
- package/docs/development.md +118 -80
- package/docs/setup.md +164 -147
- package/docs/study.md +325 -0
- package/docs/tum-mcp.md +184 -135
- package/npm/backend/manifest.json +3 -3
- package/npm/backend/requirements.txt +62 -17
- package/npm/backend/tum_mcp-0.6.0-py3-none-any.whl +0 -0
- package/npm/runtime.mjs +210 -62
- package/npm/tum-mcp.mjs +20 -8
- package/package.json +50 -11
- package/docs/credential-storage-options.md +0 -86
- package/npm/backend/tum_moodle_integration-0.4.1-py3-none-any.whl +0 -0
package/docs/tum-mcp.md
CHANGED
|
@@ -1,52 +1,50 @@
|
|
|
1
|
-
# TUM MCP
|
|
1
|
+
# TUM MCP guide
|
|
2
2
|
|
|
3
3
|
Package: `@jamestesting888/tum-mcp`, CLI: `tum-mcp`, backend: Python 3.13.
|
|
4
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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@
|
|
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
|
|
44
|
-
uv run ruff format --check src tests
|
|
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
|
|
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.
|
|
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.
|
|
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`
|
|
82
|
-
|
|
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,
|
|
93
|
-
`uv run tum-mcp setup --client generic` from the checkout.
|
|
94
|
-
browser onboarding.
|
|
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
|
|
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
|
|
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
|
|
108
|
-
|
|
109
|
-
Only
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
##
|
|
163
|
+
## Diagnostics
|
|
149
164
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
156
|
-
|
|
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
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
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
|
|
208
|
-
tum-mcp skills customize
|
|
209
|
-
tum-mcp skills diff
|
|
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
|
|
224
|
-
|
|
225
|
-
missing credentials
|
|
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
|
-
##
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
`tum-mcp status` reports registry state as `not_checked
|
|
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": "
|
|
3
|
-
"wheelSha256": "
|
|
4
|
-
"requirementsSha256": "
|
|
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-
|
|
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-
|
|
210
|
+
# tum-mcp
|
|
211
211
|
defusedxml==0.7.1 \
|
|
212
212
|
--hash=sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69 \
|
|
213
213
|
--hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61
|
|
214
|
-
# via tum-
|
|
214
|
+
# via tum-mcp
|
|
215
215
|
filelock==3.32.7 \
|
|
216
216
|
--hash=sha256:37b8a3d9811b0f9aef7e5ec5c71bb320de52df51e6ca9bcd6f5ad81187660da7 \
|
|
217
217
|
--hash=sha256:65ff0d0190ea42038b32bda4b77834fb05be2cad4c5b9b01aa4dfb3614536e52
|
|
218
|
-
# via tum-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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
|
|
Binary file
|