@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.
- package/LICENSE +21 -0
- package/NOTICE +6 -0
- package/README.md +94 -2
- package/docs/credential-storage-options.md +86 -0
- package/docs/development.md +96 -0
- package/docs/setup.md +177 -0
- package/docs/tum-mcp.md +246 -0
- package/npm/backend/manifest.json +5 -0
- package/npm/backend/requirements.txt +780 -0
- package/npm/backend/tum_moodle_integration-0.4.1-py3-none-any.whl +0 -0
- package/npm/download.mjs +38 -0
- package/npm/runtime.mjs +96 -0
- package/npm/tum-mcp.mjs +21 -0
- package/npm/uv-artifacts.json +30 -0
- package/package.json +14 -4
package/docs/tum-mcp.md
ADDED
|
@@ -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.
|