@jamestesting888/tum-mcp 0.0.0-stage → 0.4.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.
@@ -0,0 +1,246 @@
1
+ # TUM MCP 0.4.1 guide
2
+
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.
8
+
9
+ ## Current capabilities
10
+
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.
35
+
36
+ ## Build and test the local package
37
+
38
+ For normal installation, use `npm install --global @jamestesting888/tum-mcp@0.4.1`
39
+ and `tum-mcp setup --client codex`. The following commands are for maintainers.
40
+
41
+ ```sh
42
+ uv sync --locked
43
+ uv run ruff check src tests plugin/scripts scripts
44
+ uv run ruff format --check src tests plugin/scripts scripts
45
+ uv run pytest -q -m 'not live'
46
+ node npm/build.mjs
47
+ npm test
48
+ npm pack --ignore-scripts --pack-destination dist
49
+ npm run test:consumer -- dist/jamestesting888-tum-mcp-0.4.1.tgz
50
+ ```
51
+
52
+ The npm artifact has an explicit file allowlist, a bundled backend wheel,
53
+ hash-pinned dependency requirements, backend integrity metadata, and pinned uv
54
+ artifacts with SHA-256 checksums. `npm install` has no lifecycle setup/login
55
+ hooks. uv's generated output-directory ignore file is overridden specifically so
56
+ the required backend enters the tarball. Inspect the tarball before distribution.
57
+
58
+ Install the tarball into a temporary directory for testing, then run its binary:
59
+
60
+ ```sh
61
+ npm install --prefix /path/to/test-profile --ignore-scripts /path/to/package.tgz
62
+ /path/to/test-profile/node_modules/.bin/tum-mcp setup --client generic
63
+ ```
64
+
65
+ Use `TUM_MCP_DATA_DIR` and `TUM_MCP_CONFIG_DIR` to isolate testing from real campus
66
+ state. Never change the maintainer's actual client configuration just to test
67
+ packaging. Setup provisions a private, versioned Python runtime using uv 0.12.5
68
+ and Python 3.13.15; an existing matching uv, including the verified cached download,
69
+ is reused. Source checkouts and system
70
+ Python are unnecessary for consumers. Supported bootstrap targets are macOS
71
+ 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.
73
+ Clean consumer bootstrap, idempotent setup, diagnostics, and skill validation
74
+ passed on macOS ARM64 and in Linux ARM64 and x86_64 containers. The x86_64 check
75
+ ran through Docker amd64 emulation on an ARM64 Mac; packaged MCP protocol checks
76
+ and an encrypted credential round trip through a real GNOME Secret Service in an
77
+ 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
79
+ x86_64/amd64 and aarch64/ARM64.
80
+
81
+ `update` provisions the backend bundled in the invoked package and preserves
82
+ older runtime directories. To obtain a newer public package after publication,
83
+ invoke its reviewed version explicitly. It does not publish a release or replace
84
+ customized client skills silently. If interrupted setup leaves `setup.lock`,
85
+ confirm that no setup process is running before removing that directory locally.
86
+ An invalid or incomplete runtime is never selected for serving. Failed validation
87
+ clears its ready marker so explicit setup can rebuild it; older runtimes remain
88
+ available to existing client registrations. Use an older reviewed package and
89
+ rerun its setup to restore that runtime, reviewing any client configuration diff.
90
+
91
+ 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.
95
+
96
+ ## Connections and scopes
97
+
98
+ ```sh
99
+ tum-mcp connect campus
100
+ tum-mcp status
101
+ tum-mcp discover artemis ACCOUNT_ID
102
+ tum-mcp discover zulip ACCOUNT_ID
103
+ tum-mcp scope artemis ACCOUNT_ID --course COURSE_ID --sensitive --workspace
104
+ tum-mcp scope zulip ACCOUNT_ID --channel CHANNEL_ID
105
+ ```
106
+
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.
130
+
131
+ Settings live outside the installed package in `TUMMCP/config/preferences.json`.
132
+ 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.
141
+ Zulip message text is retrieved live and is not persisted. Retrieved excerpts may
142
+ be transmitted to the coding agent's configured AI provider. Moodle's existing
143
+ document cache retains its documented plaintext/expiry behavior.
144
+
145
+ Course nicknames can be mapped in `mappings` using explicit per-service IDs.
146
+ The tools resolve one exact mapping; ambiguity never grants broader access.
147
+
148
+ ## Assignment workspaces and tests
149
+
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:
154
+
155
+ ```sh
156
+ tum-mcp workspace connect-git ACCOUNT_ID COURSE_ID EXERCISE_ID
157
+ ```
158
+
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
+
181
+ ## Client and skill setup
182
+
183
+ `setup --client codex` prepares a local plugin/marketplace entry using the
184
+ portable Agent Plugins schemas. Enable it in
185
+ Codex Plugins, restart, and verify real tool and skill loading. Disable the legacy
186
+ TUM Moodle plugin when switching so duplicate tools/skills are not active.
187
+ The old installation remains available for rollback. Setup reports required UI
188
+ steps and never equates writing files with activation.
189
+
190
+ The Codex adapter uses a contained Node launcher to pin the managed Python in
191
+ 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.
204
+
205
+ ```sh
206
+ 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
210
+ tum-mcp skills validate
211
+ tum-mcp skills export /path/to/new/export-folder
212
+ ```
213
+
214
+ Personal overrides stay in the user configuration directory. Installation
215
+ refuses conflicting/customized copies rather than overwriting them. Review an
216
+ exported diff and retain a backup when applying an update. Structural validation
217
+ checks metadata, real tool references, and invocation policy. It does not measure
218
+ model activation precision or recall. The original 95% targets, repeated held-out
219
+ trials, and two review passes have not been demonstrated for this pilot.
220
+ Export refuses symbolic links and
221
+ does not overwrite an existing destination.
222
+
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
226
+ records separately by host/version/model. Each record follows `Trial` in
227
+ `skill_validation.py` and references its retained raw trace by SHA-256. The scorer
228
+ does not launch other agents or certify the supplied traces, summary quality,
229
+ or platform acceptance. Inspect traces and backend effects before approving a
230
+ release; no measured activation accuracy is claimed by the structural checks.
231
+
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.
@@ -0,0 +1,5 @@
1
+ {
2
+ "wheel": "tum_moodle_integration-0.4.1-py3-none-any.whl",
3
+ "wheelSha256": "5e5b586e0bfff7504bb4026d155e274283dfb47d69d7f4b9077e95c7374b71fc",
4
+ "requirementsSha256": "2ce7807c938fb7aa2e74fbc9537555830240ea43a2858c2f436ba5efd031dda6"
5
+ }