# Nordwerk-Lager: Übungsserver für den Kurs „MCP: Agenten an Werkzeuge anschließen“

Nordwerk ist eine erfundene Manufaktur für Werkstattmöbel. Der Server „Nordwerk-Lager“ gibt
einem KI-Agenten drei Werkzeuge: Produkte suchen, Lagerbestand abfragen, eine Anfrage anlegen.
Alle Namen, Preise und Bestände sind erfunden.

## Was drin ist

| Datei | Wofür | Stufe |
|---|---|---|
| `ohne-sdk/server.py` | fertiger Server nur mit Python, ohne Pakete | 3, 4, Vertiefung 5 |
| `loesungen/stufe_05.py` | eigener Server mit dem SDK, ein Werkzeug | 5 |
| `loesungen/stufe_06_schlecht.py`, `stufe_06.py` | schlecht und gut beschriebene Werkzeuge | 6 |
| `loesungen/stufe_07.py` | dazu ein schreibendes Werkzeug mit Absicherung | 7 |
| `loesungen/stufe_08.py` | dazu eine Resource und ein Prompt | 8 |
| `loesungen/stufe_10_http.py` | derselbe Server als HTTP-Dienst mit Token | 10, 11 |
| `pruefe_protokoll.py` | Protokolltest ohne Agent (nur Standardbibliothek) | 9 |
| `messen/` | Messung gute gegen schlechte Beschreibungen, Referenzwerte vom 25.09.2026 | 6 |
| `daten/produkte.csv` | das Sortiment (8 Produkte) | alle |
| `daten/produkte-mit-angriff.csv` | dasselbe mit einer eingeschleusten Anweisung | 7 |
| `daten/lieferbedingungen.md` | Inhalt der Resource | 8 |
| `konfig/` | Einträge für Claude Code, Codex, opencode, LibreChat | 3, 10, 11, 12 |

## Einrichten (einmal)

Voraussetzung: Python 3.11 oder neuer und `uv` (https://docs.astral.sh/uv/).

```
cd nordwerk-lager
uv sync
uv run python pruefe_protokoll.py
```

Die letzte Zeile muss `8 von 8 in Ordnung` lauten. `uv sync` legt die Umgebung `.venv` an und
installiert das MCP-SDK in der Version aus `uv.lock` (mcp 2.2.0).

Für Stufe 3 und 4 brauchst Du kein `uv`: `python ohne-sdk/server.py` läuft mit jedem Python.

## Zurück auf Anfang

- Angelegte Anfragen löschen: `daten/anfragen.csv` und `daten/protokoll.log` löschen.
- Einen Server wieder austragen: `claude mcp remove nordwerk-lager` bzw. `codex mcp remove nordwerk-lager`,
  oder den Eintrag aus `.mcp.json` / `opencode.json` entfernen.

## Sicherheit

- Der HTTP-Server (`stufe_10_http.py`) lauscht nur auf `127.0.0.1` und verlangt ein Token.
  Nicht im Router freigeben, nicht auf `0.0.0.0` umstellen.
- Das Token gehört in eine Umgebungsvariable, nie in eine Datei im Repository.
