Wikijs Mv
FreeNot checkedMCP server for Wiki.js with full GraphQL API coverage, fine-grained permissions, multi-user support, and deployable on Vercel.
About
MCP server for Wiki.js with full GraphQL API coverage, fine-grained permissions, multi-user support, and deployable on Vercel.
README
Ein MCP-Server für Wiki.js mit drei Zielen:
- Möglichst vollständige Abdeckung der GraphQL-API — 69 Tools über alle Domänen (Pages, Tags, Assets inkl. Datei-Upload, Users, Groups, Comments, Navigation, Auth/API-Keys, Site/System), inklusive eines
wiki_graphql-Escape-Hatch für 100 % Abdeckung. - Feingranulare Rechtesteuerung — pro Funktion/Kategorie: erlaubt / nur mit Genehmigung / geblockt.
- Echter Mehrbenutzer-Betrieb — jeder Nutzer mit eigenem API-Key/eigenen Rechten, ohne dass der echte Wiki.js-Key zum LLM-Anbieter (ChatGPT/Claude) gelangt.
Läuft in zwei Modi aus einem Code:
| Modus | Transport | Einsatz | Auth |
|---|---|---|---|
| HTTP | Streamable HTTP (/mcp) |
Deployment auf Vercel | pro Request (Header oder URL-Param) |
| stdio | stdio | lokal (Claude Desktop, Cursor) | aus Env |
Inhalt
- Funktionen
- Schnellstart
- Auf Vercel deployen + Umgebungsvariablen ← ausführlich
- Mehrbenutzer: Profile & Handle-Generierung ← ausführlich
- Clients verbinden: ChatGPT & Claude Code ← ausführlich
- Rechtesteuerung (Permission Policy)
- Tool-Übersicht
- Architektur · Robustheit · Tests · Grenzen
Funktionen
- Volle GraphQL-API — Pages-CRUD, Tree/History/Version/Links/Search/Tags, Batch- & Tree-Delete, Assets, Users, Groups, Comments, Navigation, API-Keys, Site/System + Raw-GraphQL.
- Vercel-tauglich — stateless Streamable HTTP über mcp-handler (kein Session-State, kein Redis nötig).
- Mehrbenutzer ohne Key-Leak — Profile-Map: jeder Nutzer hat einen geheimen Handle; der echte Key bleibt serverseitig in der Vercel-Env.
- Rechtesteuerung —
allow/confirm(Dry-Run-Vorschau) /block, pro Kategorie und pro Tool, mit Presets und „nur-verschärfen"-Overlays pro Nutzer. - Robust — Request-Timeout, Auto-Preserve bei Updates, Content-Truncation, ID-oder-Pfad, Graceful Shutdown.
Live-Beispiel-Deployment: https://mcp-for-wiki-js.vercel.app (Landing-Page = Verbindungsanleitung).
Schnellstart
cd mcp-wikijs-mv
npm install
Lokal als HTTP-Server (zum Testen):
npm run dev # http://localhost:3030/mcp
Lokal als stdio-Server (Claude Desktop / Cursor):
# .env: WIKIJS_URL + WIKIJS_TOKEN setzen (siehe .env.example)
npm run stdio
Auf Vercel deployen:
npm i -g vercel
vercel --prod # Endpoint: https://<deploy>/mcp
Wiki.js-API-Key erzeugen: In Wiki.js → Administration → API → API aktivieren → New API Key → Name + Ablauf wählen → Key kopieren. Tipp: scoped Key (read-only/gruppenbeschränkt) für Nutzer mit wenig Rechten. Die im Key hinterlegten Wiki.js-Rechte gelten zusätzlich zur Policy dieses Servers.
Auf Vercel deployen + Umgebungsvariablen
Grundsatz: zum Deployen brauchst du keine Env-Variable
Der Build (next build) läuft ohne jede Env. Was du setzt, entscheidet nur den Betriebsmodus:
| Modus | Env setzen | Nutzer geben… |
|---|---|---|
| Single-Tenant — eine feste Instanz für alle | WIKIJS_URL + WIKIJS_TOKEN (+ optional WIKIJS_PERMISSION_PRESET) |
nichts (nur die URL …/mcp) |
| Mehrbenutzer (empfohlen) — viele Nutzer, je eigener Key/Rechte | WIKIJS_PROFILES (+ optional WIKIJS_PERMISSION_PRESET) |
ihren geheimen Handle |
Im Mehrbenutzer-Modus liegen die echten Keys als Env-Variable in Vercel (Vercel verschlüsselt Env at-rest) — der LLM-Anbieter sieht nur den Handle. Details: Profile & Handle.
Vollständige Env-Referenz
| Variable | Pflicht | Default | Zweck |
|---|---|---|---|
WIKIJS_URL |
nur Single-Tenant¹ | – | Basis-URL der Wiki.js-Instanz, z. B. https://wiki.example.org (ohne /graphql) |
WIKIJS_TOKEN |
nur Single-Tenant¹ | – | Wiki.js-API-Key (Bearer). Secret. (Alias: WIKIJS_API_KEY) |
WIKIJS_PROFILES |
für Mehrbenutzer | – | JSON: geheimer Handle → { label, token, role, url? }. Secret. Siehe unten |
WIKIJS_PERMISSION_PRESET |
nein | safe |
Globale Obergrenze (Ceiling-Rolle) — sichtbare Tools + Maximum. Rollen in config/roles.json |
WIKIJS_POLICY |
nein | – | JSON-Feinjustierung deploy-weit pro Kategorie/Tool |
WIKIJS_ROLES |
nein | – | JSON, das die Rollen-Definitionen zur Laufzeit überschreibt (Form wie config/roles.json) |
WIKIJS_SHOW_BLOCKED |
nein | false |
geblockte Tools als deaktivierte Stubs in tools/list zeigen |
WIKIJS_KEY_MAP |
nein | – | Legacy-Map Handle→Token (nur Token; URL/Policy aus Env). Von WIKIJS_PROFILES abgelöst |
WIKIJS_TIMEOUT_MS |
nein | 30000 |
Timeout pro GraphQL-Request (AbortController) |
WIKIJS_MAX_CONCURRENCY |
nein | 8 |
Max. parallele Upstream-Requests (Overload-Schutz; queued/sheddet bei Überlast) |
WIKIJS_RETRIES |
nein | 2 |
Retry nur bei Connection-Fehlern (sicher auch für Mutationen) |
WIKIJS_AUDIT |
nein | true |
Audit-Log für write/delete/admin (false = aus; nie Secrets) |
WIKIJS_MCP_VERBOSE |
nein | false |
MCP-Request-Logging (true) |
PUBLIC_BASE_URL |
nein | aus Headern | überschreibt die im Discovery-Dokument beworbene URL |
¹ Im Mehrbenutzer-Modus liefern die WIKIJS_PROFILES-Einträge URL+Token; WIKIJS_URL/WIKIJS_TOKEN sind dann nur Fallback. Auf der stdio-Variante (lokal, ein Nutzer) sind WIKIJS_URL + WIKIJS_TOKEN Pflicht.
Env in Vercel setzen
Dashboard: Projekt → Settings → Environment Variables → pro Variable Name + Value → Environment Production (gern auch Preview) anhaken → Save.
CLI:
vercel env add WIKIJS_PROFILES production
vercel env add WIKIJS_PERMISSION_PRESET production
⚠️ Nach jeder Env-Änderung neu deployen (Deployments → ⋯ → Redeploy, bzw.
vercel --prod), sonst greifen die Werte nicht.
Sicherheit
WIKIJS_TOKEN,WIKIJS_PROFILES,WIKIJS_KEY_MAPsind Secrets — als normale Env-Variable eintragen (Vercel verschlüsselt at-rest), nie ins Repo committen (.envist in.gitignore).- Scoped Keys verwenden (read-only/gruppenbeschränkt) + sinnvolles
WIKIJS_PERMISSION_PRESET→ Defense-in-Depth. maxDurationder MCP-Function ist auf 60 s gesetzt (läuft auf jedem Plan inkl. Hobby; inapp/[transport]/route.tserhöhbar auf Pro).
Mehrbenutzer: Profile & Handle-Generierung
Konzept
Statt den echten Key an den Client/LLM zu geben, konfigurierst du Nutzer als Profile in WIKIJS_PROFILES und weist jedem eine Rolle zu. Der Map-Key jedes Profils ist ein geheimer, unerratbarer Handle — das einzige, was der Nutzer/LLM sieht. Die Wiki-URL wird einmal global über WIKIJS_URL gesetzt (in der Regel ein Wiki für alle):
"<GEHEIMER-HANDLE>": {
"label": "Alice", // nicht-geheimer Name (Audit/Anzeige)
"token": "<echter Wiki.js-API-Key>", // Secret — bleibt serverseitig
"role": "leser", // Rolle aus config/roles.json
"url": "https://…" // OPTIONAL (selten; Default: WIKIJS_URL)
}
- Jeder Handle = eigener Key + eigene Rolle. Verschiedene Keys laufen nie über denselben Handle.
labelwird inwiki_connection_statusangezeigt; der geheime Handle wird nie zurückgegeben.- Echte Rechte = Wiki.js-Key und Rolle (MCP-Schranke). Die Rolle reicht maximal bis zur globalen Obergrenze
WIKIJS_PERMISSION_PRESET— siehe Rollen.
⚠️ Der Handle IST das Geheimnis. Wäre er erratbar (z. B. ein Vorname), könnte ein Nutzer den Handle eines anderen verwenden und dessen Rechte erben → Rechtemanagement ausgehebelt. Immer hochentropische Zufalls-Handles verwenden — kein Tool außer einem CSPRNG ist nötig (kein Online-Generator!).
Handles erzeugen
Empfohlen — der mitgelieferte Generator (label:role, gibt die fertige Env-Zeile aus):
npm run gen:profile -- "Alice:leser" "Bob:redakteur"
Ausgabe (Beispiel):
WIKIJS_PROFILES={"wzp_…A":{"label":"Alice","token":"REPLACE_WITH_ALICE_WIKIJS_API_KEY","role":"leser"},"wzp_…B":{"label":"Bob","token":"REPLACE_WITH_BOB_WIKIJS_API_KEY","role":"redakteur"}}
# Jedem Nutzer seinen geheimen Handle aushändigen (wie ein Passwort):
# Alice [role: leser] → wzp_…A
# Bob [role: redakteur] → wzp_…B
Alternativen (alle lokal, CSPRNG):
# Node:
node -e "console.log('wzp_'+require('crypto').randomBytes(24).toString('base64url'))"
# OpenSSL:
echo "wzp_$(openssl rand -base64 24 | tr '+/' '-_' | tr -d '=')"
# Windows PowerShell (eingebaut):
$b=[byte[]]::new(24);([Security.Cryptography.RNGCryptoServiceProvider]::new()).GetBytes($b);'wzp_'+[Convert]::ToBase64String($b).TrimEnd('=').Replace('+','-').Replace('/','_')
Oder ein Passwort-Manager (1Password/Bitwarden/KeePass): „langes Zufallspasswort" — erzeugt und speichert ihn.
Der Präfix
wzp_ist nur Konvention (Wiedererkennung/Secret-Scanning) und weglassbar. Verboten: selbst ausgedachte Strings,Get-Random,Math.random(), Zeitstempel — das sind keine CSPRNGs. Handles nicht in einem Online-Tool oder im Chat erzeugen.
Beispiel: 2 Nutzer auf derselben Wiki-URL
- Generieren:
npm run gen:profile -- "Alice:readonly" "Bob:editor" - Die
REPLACE_WITH_…-Platzhalter durch echte (scoped) Wiki.js-Keys ersetzen:
WIKIJS_PROFILES={"wzp_…SECRET-A":{"label":"Alice","url":"https://wiki.example.org","token":"<KEY_ALICE>","preset":"readonly"},"wzp_…SECRET-B":{"label":"Bob","url":"https://wiki.example.org","token":"<KEY_BOB>","preset":"editor"}}
- In Vercel als
WIKIJS_PROFILESsetzen (+ z. B.WIKIJS_PERMISSION_PRESET=editorals Obergrenze) → Redeploy. - Jedem Nutzer seinen geheimen Handle geben (siehe Clients verbinden).
Widerruf
Eintrag aus WIKIJS_PROFILES entfernen → Redeploy. (Der Wiki.js-Key selbst kann zusätzlich in Wiki.js widerrufen werden.)
Clients verbinden: ChatGPT & Claude Code
Welcher Weg geht wo? Die Clients unterscheiden sich, wie ein Geheimnis übergeben wird:
| Client | Custom-Header? | Handle übergeben via |
|---|---|---|
| ChatGPT (Developer Mode) | ❌ | URL-Parameter ?token=<handle> |
| claude.ai (Web-Connector) | ❌ | URL-Parameter ?token=<handle> |
| Claude Code (CLI) | ✅ | Header X-Wikijs-Token: <handle> |
| Cursor | ✅ | Header |
| Claude Desktop (lokal) | – | stdio mit Env (oder Web-Connector) |
Bei
WIKIJS_PROFILESschickt der Client nur den Handle als Token — keine URL nötig (die steckt im Profil). Ohne Profile (direktes BYOK) zusätzlich die Instanz-URL mitgeben (?url=…bzw.X-Wikijs-Url).
ChatGPT (Developer Mode → Custom Connector)
Voraussetzung: Plan Plus/Pro/Business/Enterprise/Edu; Server über HTTPS erreichbar (Vercel ✓).
- Settings → Connectors → Advanced settings → Developer mode aktivieren.
- Settings → Connectors → Create (bzw. „Add custom connector").
- MCP Server URL mit dem geheimen Handle eintragen:
(Optional zusätzlich verschärfen:https://<deploy>/mcp?token=wzp_DEIN_GEHEIMER_HANDLE&preset=readonly.) - Authentication: No authentication (das Geheimnis steckt in der URL).
- Speichern → im Composer den Connector aktivieren.
Developer Mode gibt vollen Tool-Zugriff inkl. Schreib-Aktionen (mit Bestätigungs-Dialog). Zusätzlich greift die Server-Policy: im Default
safeliefern Write/Delete zuerst eine Dry-Run-Vorschau (echte Ausführung erst mitconfirm: true).
Claude Code (CLI)
Claude Code unterstützt Custom-Header — der Handle bleibt aus der URL heraus:
claude mcp add --transport http wikijs https://<deploy>/mcp \
--header "X-Wikijs-Token: wzp_DEIN_GEHEIMER_HANDLE"
- Mehrere
--headermöglich (z. B. zusätzlich--header "X-Wikijs-Preset: readonly"). - Scope:
-s local(Default, nur du) ·-s user(alle deine Projekte) ·-s project(eingecheckte.mcp.json— keinen echten Handle committen!). - Prüfen:
claude mcp list,claude mcp get wikijs.
Alternativ als JSON (~/.claude.json oder Projekt-.mcp.json):
{
"mcpServers": {
"wikijs": {
"type": "http",
"url": "https://<deploy>/mcp",
"headers": { "X-Wikijs-Token": "wzp_DEIN_GEHEIMER_HANDLE" }
}
}
}
claude.ai (Web-Connector) & Cursor
- claude.ai (Web): Settings → Connectors → Add custom connector → URL
https://<deploy>/mcp?token=<handle>→ Add. (Plan Pro/Max/Team/Enterprise.) - Cursor:
.cursor/mcp.jsonmiturl+headers: { "X-Wikijs-Token": "<handle>" }.
Claude Desktop (lokal, stdio)
Single-User über die .env des Servers (kein Handle nötig):
{
"mcpServers": {
"wikijs": {
"command": "npm",
"args": ["--prefix", "/ABSOLUTER/PFAD/zu/mcp-wikijs-mv", "run", "stdio"],
"env": {
"WIKIJS_URL": "https://dein-wiki.example.org",
"WIKIJS_TOKEN": "DEIN_WIKIJS_API_KEY",
"WIKIJS_PERMISSION_PRESET": "editor"
}
}
}
}
Verbindung testen
Im Client das Tool wiki_connection_status aufrufen lassen → zeigt connected, baseUrl, profile (= Label) und ob ein Key gesetzt ist. Bei connected: true passt alles.
Rechtesteuerung (Rollen)
Jedes Tool hat eine Kategorie; eine Rolle bildet jede Kategorie (und optional jedes Tool) auf einen Modus ab:
| Modus | Verhalten |
|---|---|
allow |
wird sofort ausgeführt |
confirm |
gibt zunächst eine Dry-Run-Vorschau zurück; echte Ausführung erst mit confirm: true |
block |
in tools/list ausgeblendet (oder verweigert die Ausführung) |
Kategorien: read, write, delete, manage_users, manage_groups, manage_system, manage_auth.
Rollen-Leiter (config/roles.json)
Rollen sind in config/roles.json definiert — frei editierbar, mit extends (Vererbung) und per-Tool-Overrides. Default-Leiter:
| Rolle | read | write | delete | users | groups | system | auth | Hinweis |
|---|---|---|---|---|---|---|---|---|
leser |
allow | block | block | block | block | block | block | nur lesen |
kommentator |
allow | block | block | block | block | block | block | + nur Kommentare schreiben (per-Tool) |
autor |
allow | allow | block | block | block | block | block | schreiben, nicht löschen |
redakteur |
allow | allow | confirm | block | block | block | block | = editor |
moderator |
allow | allow | confirm | confirm | block | block | block | + Nutzer moderieren |
betreuer |
allow | allow | confirm | block | block | confirm | block | + Wartung (Cache/Tree) |
admin |
allow | allow | confirm | confirm | confirm | confirm | block | + Nutzer/Gruppen |
systemadmin |
allow | allow | allow | allow | allow | allow | allow | = full |
(Plus Kompat-Aliase readonly/safe/editor/maintainer/full.) Effektive Rollen anzeigen: npm run roles. Vollständige Matrix + Klartext-Beschreibung: docs/roles.md.
Eigene Rolle anlegen: Eintrag in config/roles.json (oder extends einer bestehenden) → Vercel Redeploy, bzw. ohne Rebuild per Env WIKIJS_ROLES (gleiches JSON).
Obergrenze, Zuweisung & Verschärfung
- Globale Obergrenze (
WIKIJS_PERMISSION_PRESET): die maximale Capability + der sichtbare Tool-Satz. Auf deine höchste verwendete Rolle setzen. - Pro Person (
roleimWIKIJS_PROFILES-Eintrag): die zugewiesene Rolle — wirkt innerhalb der Obergrenze. - Pro Request (Client): Header
X-Wikijs-Preset/X-Wikijs-Policybzw. URL&preset=/&policy=— nur verschärfend.
Sicherheitsmodell: Rolle & Request-Overlay können nur bis zur Obergrenze reichen und nur verschärfen. Die Sichtbarkeit in
tools/listbestimmt die Obergrenze (mcp-handler registriert global). Echte Rechte = Schnittmenge aus Wiki.js-Key und Rolle.
Tool-Übersicht
wiki_-Präfix. (R)=read · (W)=write · (D)=delete · (S)=manage_system · (U)=manage_users · (G)=manage_groups · (A)=manage_auth.
Pages / Tags wiki_pages_search (R) · wiki_page_get (R) · wiki_pages_list (R) · wiki_pages_tree (R) · wiki_page_history (R) · wiki_page_version (R) · wiki_pages_links (R) · wiki_tags_list (R) · wiki_tags_search (R) · wiki_page_create (W) · wiki_page_update (W, full oder edits=[{find,replace}]) · wiki_page_move (W) · wiki_page_render (W) · wiki_page_restore (W) · wiki_page_convert (W) · wiki_tag_update (W) · wiki_page_delete (D) · wiki_pages_delete_batch (D) · wiki_pages_delete_tree (D) · wiki_tag_delete (D) · wiki_pages_purge_history (D) · wiki_pages_flush_cache (S) · wiki_pages_rebuild_tree (S) · wiki_pages_migrate_locale (S)
Assets wiki_assets_list (R) · wiki_asset_folders (R) · wiki_asset_create_folder (W) · wiki_asset_rename (W) · wiki_asset_delete (D) · wiki_assets_flush_temp (S)
Comments wiki_comments_list (R) · wiki_comment_get (R) · wiki_comment_create (W) · wiki_comment_update (W) · wiki_comment_delete (D)
Navigation wiki_navigation_get (R) · wiki_navigation_update_tree (S)
Users wiki_user_profile (R) · wiki_users_list · wiki_users_search · wiki_user_get · wiki_users_last_logins · wiki_user_create · wiki_user_update · wiki_user_delete · wiki_user_activate · wiki_user_deactivate · wiki_user_verify · wiki_user_reset_password · wiki_user_disable_tfa (U, außer Profile)
Groups wiki_groups_list · wiki_group_get · wiki_group_create · wiki_group_update · wiki_group_delete · wiki_group_assign_user · wiki_group_unassign_user (G)
System / Auth / Escape-Hatch wiki_connection_status (R) · wiki_site_info (R) · wiki_site_config (S) · wiki_system_info (S) · wiki_system_flags (S) · wiki_apikeys_list (A) · wiki_apikey_create (A) · wiki_apikey_revoke (A) · wiki_auth_strategies (A) · wiki_auth_set_api_state (A) · wiki_graphql (S, beliebige GraphQL-Operation)
Mehr zu den Admin-Domänen (Theming/Storage/Mail/Search/…): docs/admin-extension.md.
Architektur
app/[transport]/route.ts Streamable-HTTP-Endpoint /mcp via mcp-handler (+ URL-Param→Header)
app/.well-known/mcp.json/route.ts Discovery-Dokument
app/page.tsx Landing-Page = Verbindungsanleitung (echte Domain eingesetzt)
bin/stdio.ts stdio-Entry für Desktop-Clients
lib/
meta.ts Servername, Version, Instructions
context.ts Pro-Request-Auth (Profile/Header/URL-Param/Env) + Policy-Overlays
permissions.ts Policy-Engine (Presets, allow/confirm/block, gestapelte tighten-only Overlays)
register.ts Zentrale Tool-Registrierung + Policy-Wrapper + Confirm-Gate
wikijs/client.ts fetch-basierter GraphQL-Client (Timeout, ohne Extra-Dependency)
wikijs/format.ts Ergebnis-/Fehler-Helfer, responseResult-Prüfung, Truncation
tools/*.ts Tool-Definitionen je Domäne (deklarativ: Name, Kategorie, Zod-Schema, Handler)
config/roles.json Rollen-Definitionen (editierbar; extends + per-Tool; Built-ins als Fallback)
scripts/ gen-profile.mjs (Handle-Generator) · show-roles.ts · smoke*.mjs
test-{policy,nav,semaphore,context}.ts (offline) · test-local-live.ts (live)
Stack: Next.js (App Router) · mcp-handler · @modelcontextprotocol/sdk · zod. Stateless → Vercel-nativ.
Robustheit
- Auto-Preserve bei
wiki_page_update— aktuelle Seite wird vor dem Update geholt; nicht angegebene Felder (content, tags, …) bleiben erhalten (verhindert die Wiki.js-Falle, bei der ein Metadaten-Update den Inhalt löscht). - Request-Timeout —
WIKIJS_TIMEOUT_MS(Default 30 s) perAbortController, kein hängender Serverless-Aufruf. - Überlast-Schutz —
WIKIJS_MAX_CONCURRENCY(Default 8) cappt parallele Upstream-Requests; Überzahl wird kurz gequeued, bei anhaltender Last mit „busy" abgewiesen (Load-Shedding) statt in einen DB-Pool-Hang zu laufen. - Retry bei Connection-Fehlern —
WIKIJS_RETRIES(Default 2): nur DNS/TCP/TLS-Fehler werden mit Backoff wiederholt (sicher auch für Mutationen, da der Request den Server nie erreichte) — nicht bei Timeouts/GraphQL-Fehlern. - Navigations-Guard —
wiki_navigation_update_treeverweigert destruktive Voll-Ersetzungen ohneforceund liefert stets denprevious-Snapshot als Rollback. - Escape-Hatch abgesichert —
wiki_graphqlgibt rohe Mutationen erst als Dry-Run zurück (echte Ausführung mitconfirm:true). - Audit-Log — write/delete/admin-Aktionen strukturiert geloggt (Tool, Kategorie, Profil-Label, Outcome, ms;
WIKIJS_AUDIT; nie Secrets). - Strukturierte Ausgabe — Tools liefern
structuredContentzusätzlich zum Text (für MCP-Clients mit strukturiertem Tool-Output). - Content-Truncation —
wiki_page_getkürzt sehr lange Inhalte (Default 100 000 Zeichen) mit Hinweis;maxContentChars: 0= voll. - ID-oder-Pfad —
wiki_page_get/_delete/_moveakzeptierenidoderpath+locale. - Graceful Shutdown (stdio): SIGINT/SIGTERM, EPIPE ignoriert.
Tests
npm run typecheck # TypeScript ohne Build
npm test # Offline-Suite: policy + nav + semaphor + context (50 Assertions)
npm run build # Production-Build (Vercel-Artefakt)
# Live-Integrationstest: ALLE Tool-Handler gegen ein WEGWERF-/leeres Wiki.js
WIKIJS_URL=http://localhost:3000 WIKIJS_TOKEN=<key-oder-admin-jwt> npm run test:live
# E2E gegen ein Deployment (HTTP-Transport):
npm run smoke -- <url> # Handshake, Tool-Sichtbarkeit, Confirm-Gate, Header-Auth
node scripts/smoke-urlauth.mjs <url> # URL-Parameter-Auth (?url=&token=&preset=)
node scripts/probe-deploy.mjs <url> # Deploy ohne Creds prüfen (Env-Status)
Vollständiges Per-Tool-Ergebnis (zuletzt 79 ok / 0 FAIL, alle 69 Tools): docs/TESTPROTOKOLL.md. Wegwerf-Wiki dafür: docker compose -f docker-compose.test.yml up -d (Setup-Automatisierung siehe Protokoll). CI: .github/workflows/ci.yml.
Grenzen
- Datei-Upload läuft in Wiki.js über einen Multipart-REST-Endpoint (
/u, nicht GraphQL) — abgedeckt durchwiki_asset_upload(Base64-Eingabe); ebenso Ordner anlegen, Umbenennen und Löschen. - Manche Operationen verlangen in Wiki.js erhöhte Scopes (
manage:system,write:pages, …). Fehlt dem Key die Berechtigung, kommt ein Wiki.js-Autorisierungsfehler — unabhängig von der hiesigen Policy. wiki_page_convertmd→html wird von Wiki.js abgelehnt (Server-Limit, nicht alle Editor-Kombinationen sind konvertierbar); das Tool meldet die Server-Antwort korrekt.
Weitere Doku
- Rechte & Clients: docs/roles.md (Rollen × Rechte-Matrix) · docs/permissions.md · docs/clients-claude.md · docs/clients-chatgpt.md · docs/admin-extension.md
- Test & Betrieb: docs/TESTPROTOKOLL.md (vollständiges Protokoll, alle 69 Tools) · docs/pgbouncer.md (Prod-Hardening: DB-Pool / PgBouncer / MTU / IP-Allowlist)
Lizenz
MIT
Installing Wikijs Mv
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/janschachtschabel/mcp-for-wiki-jsFAQ
Is Wikijs Mv MCP free?
Yes, Wikijs Mv MCP is free — one-click install via Unyly at no cost.
Does Wikijs Mv need an API key?
No, Wikijs Mv runs without API keys or environment variables.
Is Wikijs Mv hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Wikijs Mv in Claude Desktop, Claude Code or Cursor?
Open Wikijs Mv on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectCompare Wikijs Mv with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
