users-demo
Demo mit mehrschichtigem Benutzerverwaltungs-API + MCP
Eine kleine Demo, erstellt mit Node.js (nur JS). Ein Präsentationsbeispiel, das Schicht für Schicht zeigt, wie „dasselbe API menschlichen Benutzern und KI-Agenten mit getrennter Authentifizierung und getrennten Freigabebereichen bereitgestellt wird und auf der KI-Seite ein MCP-Server (API-Beschreibungsschicht) darübergelegt wird".
Die Designvorlage stammt vom produktiven MCP von spx-learning-square (spx-learning-square/mcp/, 65 Tools, .mcpb-Verteilung). Diese Demo reduziert diesen Ansatz auf eine minimale Konfiguration.
Gesamtbild
人間ユーザー ──ログイン──▶ セッショントークン ─┐
│ Authorization: Bearer
AI (Claude) ──▶ MCP サーバー ──PAT──────────────┤
(mcp/index.mjs ▼
= API 説明層) ┌─────────────────────────┐
│ API サーバー (Express) │
│ 認証層(2 系統) │
│ エージェント公開 │
│ レジストリ │
│ controller │
│ service │
│ repository(メモリ) │
└─────────────────────────┘Related MCP server: entra-scim-mcp
Schichtenaufbau
Schicht | Datei | Rolle |
Authentifizierungsschicht (Mensch) |
| Login → Ausstellung von Session-Token. |
Authentifizierungsschicht (KI) |
| Validierung von PAT (vorab ausgestellter Schlüssel). Kein Login nötig |
Öffentliches Register |
| Registrierungsliste der für KI freigegebenen APIs. Nicht registrierte APIs liefern auch bei erfolgreicher Authentifizierung 403 |
Controller-Schicht |
| HTTP ⇄ Service-Konvertierung + Guard-Deklaration pro Route |
Service-Schicht |
| Geschäftsregeln (Validierung, Duplikatprüfung). Kennt kein HTTP |
Repository-Schicht |
| Datenspeicherung (Demo im Speicher. In der Praxis durch MySQL usw. ersetzbar) |
MCP-Schicht (API-Beschreibungsschicht) |
| Erklärt KI die API-Nutzung auf Japanisch und vermittelt. Hat keine Berechtigungen |
Berechtigungsmatrix (Kern der Demo)
API | Menschlicher Benutzer | KI-Agent |
GET /api/users (Liste) | ✅ | ✅ registriert |
GET /api/users/:id (Abruf) | ✅ | ✅ registriert |
POST /api/users (Erstellen) | ✅ | ✅ registriert |
PUT /api/users/:id (Aktualisieren) | ✅ | ❌ |
DELETE /api/users/:id (Löschen) | ✅ | ❌ |
GET /api/agent/apis (öffentliche Liste) | ✅ | ✅ registriert |
Destruktive Operationen (Aktualisieren, Löschen) werden durch Nicht-Registrierung im Register zu menschenexklusiv. Der Punkt ist, dass „was der KI erlaubt ist" in einer einzigen Datei, agentRegistry.mjs, einsehbar ist.
So führt man es aus
1. API-Server
npm install
npm run api # http://localhost:3000Für den Start mit Docker (nur das API wird containerisiert):
npm run docker # = docker compose up --build → http://localhost:3000Die MCP-Schicht (
mcp/index.mjs) wird nicht in den Container aufgenommen. Da es sich um einen Prozess handelt, den Claude Desktop / Claude Code per stdio auf dem Rechner des Benutzers startet, erfolgt die Verteilung nicht über Docker, sondern über.mcpb. Auch das ist ein Präsentationspunkt: API auf der Serverseite (Docker/ECS), MCP auf der Clientseite (.mcpb) – die Deployment-Einheiten sind getrennt.
Ablauf für menschliche Benutzer (Login → CRUD):
# ログイン(デモ: alice / demo)
TOKEN=$(curl -s -X POST localhost:3000/api/auth/login \
-H 'Content-Type: application/json' \
-d '{"login_id":"alice","password":"demo"}' | node -p 'JSON.parse(require("fs").readFileSync(0)).data.token')
curl -s localhost:3000/api/users -H "Authorization: Bearer $TOKEN" # 一覧
curl -s -X DELETE localhost:3000/api/users/3 -H "Authorization: Bearer $TOKEN" # 削除も OKAblauf für KI-Agenten (PAT, Standard-Schlüssel agent-demo-key):
curl -s localhost:3000/api/users -H "Authorization: Bearer agent-demo-key" # ✅ 200
curl -s localhost:3000/api/agent/apis -H "Authorization: Bearer agent-demo-key" # ✅ 公開一覧
curl -s -X DELETE localhost:3000/api/users/2 \
-H "Authorization: Bearer agent-demo-key" # ❌ 403 user_onlyEs gibt zwei Arten von Fehlercodes:
user_only = API mit menschenexklusivem Guard (Aktualisieren, Löschen),
agent_not_allowed = Guard ist forAgent, aber API nicht im Register.
2. MCP-Server (API-Beschreibungsschicht)
Debug-UI (MCP Inspector):
npm run inspectBei Claude Code registrieren:
claude mcp add users-demo -- node /Users/d.bui/Documents/project/mcp-from-scratch/mcp/index.mjsGesprächsbeispiele: „Zeig mir die Benutzerliste" → list_users, „Registriere ein neues Mitglied" → create_user,
„Lösche Nummer 3" → Es gibt kein Tool, daher wird auf den Admin-Bildschirm verwiesen (in instructions angegeben).
3. E2E-Test (MCP als „Claude-Ersatz" aufrufen)
npm test # test/mcp-client.test.mjsMit dem Client des MCP SDK wird eine stdio-Verbindung zu mcp/index.mjs hergestellt (gleicher Pfad wie Claude),
API-Start → automatische Validierung aller Tools + Ressourcen + Fehlerfälle (nicht vorhandene ID / E-Mail-Duplikat / Schemaverstoß).
Auch für Live-Demos bei Präsentationen geeignet.
4. Verteilung als .mcpb für Claude Desktop
.mcpb = Desktop-Erweiterung, die manifest.json + Code als zip enthält. Per Doppelklick
installierbar; Benutzer müssen weder Node installieren noch Konfigurationsdateien bearbeiten.
API-URL und Zugriffsschlüssel werden über user_config (Formular bei der Installation) in die env injiziert
(Schlüssel mit sensitive: true werden im OS-Schlüsselbund gespeichert).
npx @anthropic-ai/mcpb validate manifest.json
npm run pack # → dist/users-mcp-demo.mcpb(node_modules ごと同梱)Die Build-Artefakte werden in dist/ ausgegeben (nicht in der Git-Verwaltung). Durch .mcpbignore
werden API-Code und Docker-bezogene Dateien nicht in die Erweiterung aufgenommen –
im Bundle sind nur manifest.json + mcp/ + node_modules enthalten.
Präsentationsfolien
slides/index.html im Browser öffnen und direkt präsentieren (Navigation mit ← → Tasten, 14 Folien,
offline-fähig). Aufbau: Gesamtbild → Code-Shots der einzelnen Schichten → Berechtigungsmatrix → Verteilung →
Demo-Ablauf → Erkenntnisse aus dem Produktivbetrieb.
Präsentationspunkte (aus dem Produktivbetrieb von spx-learning-square)
Die MCP-Schicht hat keine Berechtigungen. Sie greift nicht auf die DB zu, sondern ruft nur die REST-API mit PAT auf. Berechtigungsprüfung und Validierung erfolgen ausschließlich an einer Stelle auf der API-Seite – selbst wenn MCP kaputtgeht, kann kein Unfall passieren, den die UI nicht verursachen kann.
Authentifizierung ist in 2 Systeme getrennt. Mensch = Login + Session, KI = vorab ausgestelltes PAT. Wenn die Herkunft der Tokens unterschiedlich ist, können Widerruf, Audit und Ratenbegrenzung ebenfalls getrennt gestaltet werden.
Die Freigabe für KI erfolgt über ein „explizites Registrierungssystem". Wenn man über Pfad-Präfixe freigibt, kann es zu Unfällen kommen, bei denen versehentlich auch benachbarte sensible APIs geöffnet werden (eine Lehre, die beinahe real passiert wäre). Das Register funktioniert zugleich als „API-Spezifikation für KI".
Die Tool-Beschreibungen sind Anweisungen an das Modell. Durch das Schreiben von Betriebsregeln wie „IDs nicht raten, sondern mit list_users auflösen" oder „bei Löschung auf den Admin-Bildschirm verweisen" in description / instructions lässt sich das KI-Verhalten nicht über Code, sondern über Text steuern.
Fehler werden nicht geworfen, sondern mit
isError+ maschinenlesbarem code zurückgegeben. Das Modell kann den code lesen und selbstständig wiederherstellen (email_taken → Alternativvorschlag machen usw.).stdout ist ausschließlich für JSON-RPC. Bei einem stdio-Server zerstört
console.logdie Kommunikation. Logging erfolgt immer überconsole.error.
Referenzen
MCP-Spezifikation und Dokumentation: https://modelcontextprotocol.io
TypeScript/JS SDK: https://github.com/modelcontextprotocol/typescript-sdk
MCPB (Manifest-Spezifikation + CLI): https://github.com/anthropics/mcpb
Produktive Implementierung:
../spx-learning-square/mcp/(esbuild-1-Datei-Bundle, mit eingebrannten Umgebungs-Labels, Backend generiert.mcpbdynamisch)
This server cannot be deployed
Maintenance
Related MCP Connectors
Supervised API-write gateway for AI agents with policy, human approval and execution receipts.
- FullmaktOAuthai.fullmakt
Credential broker for AI agents: scoped, revocable API access with policy enforcement and audit.
The trust harness for AI agents. Set what an agent can do before it acts.
Runtime permission, approval, and audit layer for AI agent tool execution.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to access user and message data through MCP resources, providing REST API integration for user management with paginated lists and thread tracking.15 npm2MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to manage Microsoft Entra users and groups via the SCIM 2.0 Provisioning API, including provisioning, deprovisioning, group membership, custom security attributes, and lifecycle operations.2MIT
- AlicenseNot gradedqualityBmaintenanceEnables autonomous AI agents to securely access and execute external tools, such as GitHub REST API operations, with per-user authentication, authorization, audit logging, and observability.MIT
- FlicenseNot gradedqualityCmaintenanceEnables management of system users through a simple sample API, exposed as MCP tools for natural-language interaction.-