Dokumentation
Maschinchenring ist eine Plattform für lokalen Geräteverleih. Geräte können über den Chat, die Webseite oder direkt über einen MCP-Client (z.B. Claude Desktop) gebucht werden.
Architektur
Ein Node.js-Server (Express + Hono) stellt gleichzeitig eine Astro SSR-Website und einen MCP-Server bereit. Daten werden in einer SQLite-Datenbank (better-sqlite3) gespeichert.
LLM-Client (Claude Desktop, etc.)
│
│ OAuth PKCE + MCP Streamable HTTP
▼
┌──────────────────────────────────┐
│ Node.js Server (:3000) │
│ ├── /mcp MCP-Tools │
│ ├── /oauth/* OIDC │
│ ├── /auth/* GitHub+Magic │
│ ├── /buchungen/* Approve/Reject│
│ ├── /api/* REST-API │
│ └── /* Astro SSR │
│ SQLite (better-sqlite3) │
└──────────────────────────────────┘
│ │
│ E-Mail (SES/SMTP) │ imgproxy
▼ ▼
Owner + Mieter Bild-CDN Zugangswege
Webseite
Die Webseite unter / bietet:
- Geräteübersicht — alle verfügbaren Geräte und Sets mit Preisen
- Gerätedetail — Beschreibung, Bilder, Verfügbarkeitskalender
- Chat — KI-Assistent (Claude) zum Suchen und Buchen
- Buchungsübersicht — eigene Buchungen verwalten (Login erforderlich)
- Konto — Profil und MCP-Server-URL (Login erforderlich)
MCP-Client (Claude Desktop etc.)
Der MCP-Server ist unter /mcp erreichbar. MCP-Clients authentifizieren sich per OAuth 2.0 PKCE:
- Discovery:
GET /.well-known/oauth-authorization-server - Registrierung:
POST /oauth/register→client_id - Autorisierung:
GET /oauth/authorize?...→ Login → Auth-Code - Token:
POST /oauth/tokenmit Code + Code-Verifier →access_token - MCP-Calls:
Bearer <access_token>an/mcp
Die MCP-Server-URL findet man nach dem Login unter /konto.
Authentifizierung
Zwei Login-Methoden stehen zur Verfügung:
- GitHub OAuth — Login mit GitHub-Konto
- Magic Link — E-Mail-Link ohne Passwort
Nach dem Login wird ein JWT (RS256) als Cookie gesetzt (auth_token).
Buchungsfluss
Mieter → create_booking → Status: pending
│
▼ Owner erhält E-Mail mit Approve/Reject-Link
│
├── Approve → /buchungen/:id/approve?token=...
│ → Status: approved → Mieter-E-Mail (+ Abholadresse)
│
└── Reject → /buchungen/:id/reject?token=...
→ Status: rejected → Mieter-E-Mail Buchungen können auch per MCP-Tool (approve_booking / reject_booking) oder über die API bestätigt/abgelehnt werden.
Bilder
Bilder werden per POST /images/upload hochgeladen (JWT-Auth, Uploader-Berechtigung erforderlich). Sie landen auf S3/MinIO und werden via imgproxy als optimierte, HMAC-signierte URLs ausgeliefert.
Datenschutz
Wichtig: Die Abholadresse (Owner-Adresse) erscheint niemals öffentlich. Sie wird ausschließlich nach Buchungsbestätigung per E-Mail an den Mieter übermittelt.
Tech-Stack
- Runtime: Node 24,
--experimental-strip-types(kein Build-Step) - Framework: Express + Hono (API) + Astro 6 SSR (Website)
- Datenbank: SQLite via better-sqlite3
- Auth: JWT RS256 (jose), GitHub OAuth (arctic), Magic Links
- MCP: @modelcontextprotocol/sdk, Streamable HTTP
- Suche: Hybrid semantisch + lexikal (Jina Embeddings)
- Bilder: S3/MinIO + imgproxy
- E-Mail: AWS SES / SMTP