wikijs-mcp-server
Provides tools for interacting with a Wiki.js instance, enabling listing, reading, searching, creating, updating, and deleting wiki pages.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@wikijs-mcp-serversearch the wiki for 'backup strategy'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Wiki.js MCP Server
MCP-Server, der eine Wiki.js-2.x-Instanz als Tools bereitstellt — gedacht für die Nutzung mit Mattermost Agents, funktioniert aber mit jedem MCP-Client (Streamable HTTP oder stdio).
Wiki.js wird über seine GraphQL-API (/graphql) mit einem Bearer-API-Key angesprochen.
Version 0.7.0 — Änderungen siehe CHANGELOG.md.
Tools
Tool | Beschreibung |
| Seiten auflisten (mit Pfad-Präfix-Filter, Sortierung, Tag- und Locale-Filter) |
| Eine Seite per numerischer ID oder Pfad vollständig lesen |
| Volltextsuche über das Wiki ( |
| Neue Seite anlegen (Markdown) |
| Bestehende Seite aktualisieren (Achtung: |
| Seite unwiderruflich löschen |
Mit WIKIJS_READ_ONLY=true werden nur die drei Lese-Tools registriert.
Alle Tools und Parameter sind ausführlich beschrieben (inkl. Beispielen und Workflow-Hinweisen), damit auch schwächere LLMs die Schnittstelle zuverlässig nutzen. Zusätzlich macht der Server vage Anweisungen wie „erstelle eine Seite mit ssh-dummy-accounts" robust:
Server-Instructions: Beim MCP-Handshake bekommt der Client einen Workflow-Leitfaden (erst suchen, Struktur ansehen, vollständiges Markdown schreiben, dann anlegen).
Auto-Pfad: Bei
wiki_create_pageistpathoptional und wird aus dem Titel abgeleitet („SSH Dummy Accounts" →ssh-dummy-accounts).Pfad-Normalisierung: Führende Slashes, Locale-Präfixe, URLs, Umlaute, Leerzeichen und Großschreibung werden automatisch bereinigt (
/de/Infrastruktur/Backup Konzept→infrastruktur/backup-konzept).Duplikat-Schutz: Existiert am Zielpfad schon eine Seite, schlägt
wiki_create_pagefehl und nennt die vorhandene Seiten-ID mit dem Hinweis, stattdessenwiki_update_pagezu nutzen.Such-Fallback: Liefert der Wiki.js-Suchindex 0 Treffer (die Standard-„Database"-Engine findet Begriffe im Seiteninhalt oft nicht), scannt der Server die Seiteninhalte direkt (bis 200 Seiten) und liefert Treffer inkl. Text-Snippet. Pfadfilter werden dabei normalisiert (
CTF2026→ctf2026).Pfad-Präfix-Filter:
wiki_list_pagesundwiki_searchnehmen ein optionalespath. Es wirkt als Präfix über ganze Pfadsegmente, nicht alsstartsWith—ctf2026liefertctf2026undctf2026/..., aber niemalsctf20260,ctf2026-oldoderfoo/ctf2026. Beiwiki_list_pageswird erst gefiltert und dannlimitangewendet,limit: 100liefert also bis zu 100 passende Seiten.Anklickbare Quellen: Jede Seite bringt ein
url-Feld mit, das der Agent als Quelle zitieren soll. Die Basis dafür istWIKIJS_URLund damit unabhängig von der API-Adresse — interne Docker-Adressen tauchen nicht mehr in Chat-Antworten auf.Unscharfe Pfad-Auflösung: Schlägt
wiki_get_pagemit einem Pfad fehl, wird er tolerant gegen die echte Seitenliste gematcht — Groß-/Kleinschreibung, Punkt-vs-Bindestrich (10-0-0-0-27findet10.0.0.0-27) und Locale-Unterschiede werden aufgelöst; bei Beinahe-Treffern werden existierende ähnliche Seiten mit ihren IDs vorgeschlagen.
Related MCP server: wikijs-mcp
Voraussetzungen
Node.js 20+ (oder Docker)
eine laufende Wiki.js-2.x-Instanz
ein Wiki.js-API-Key: Administration → API Access → API aktivieren → New API Key
Konfiguration
cp .env.example .envVariable | Bedeutung | Default |
| Adresse, unter der der Server die GraphQL-API erreicht (ohne | — (Pflicht) |
| Öffentliche Browser-URL für die | leer (= |
| API-Key aus Wiki.js | — (Pflicht) |
| Standard-Locale für Seiten |
|
|
|
|
| Harte Bereichsgrenze für alle Page-Tools (siehe unten) | leer (unbeschränkt) |
|
|
|
| Bind-Adresse des HTTP-Endpunkts |
|
| Optionaler Bearer-Token zum Schutz des Endpunkts (empfohlen) | leer |
| Anzeigename des Servers |
|
Interne API-Adresse vs. öffentliche Links
Jede zurückgegebene Seite enthält ein url-Feld, das der Agent als Quelle zitiert. Läuft der Server im selben Docker-Netz wie Wiki.js, erreicht er die API oft unter einem internen Namen, den ein Benutzer im Browser nicht öffnen kann. Dafür gibt es zwei getrennte Variablen:
WIKIJS_BASE_URL=http://wiki:3000 # nur für die GraphQL-API des Servers
WIKIJS_URL=https://wiki.hacktober.ch # nur für die zitierten LinksErgebnis:
http://wiki:3000/graphql <- API-Aufrufe
https://wiki.hacktober.ch/en/CTF2025/hosts/10-10-20-12-dev3 <- url-FeldIst WIKIJS_URL leer oder nicht gesetzt, wird WIKIJS_BASE_URL verwendet — bestehende Setups ändern sich also nicht. Ein abschließender Slash wird entfernt.
Pfad-Präfix-Filter (wiki_list_pages)
wiki_list_pages hat einen optionalen Parameter path. Er ist ein Pfad-Präfix, kein Tag und kein Wildcard-Muster:
{ "path": "CTF2026", "limit": 100, "orderBy": "PATH" }Zurück kommen genau die Seiten, deren Pfad gleich dem Präfix ist oder mit <präfix>/ beginnt:
Pfad | im Ergebnis? |
| ja |
| ja |
| ja |
| ja |
| nein |
| nein |
| nein |
| nein |
Regeln:
pathist optional. Ohnepathverhält sich das Tool exakt wie vorher.CTF2026,/CTF2026,CTF2026/und/en/CTF2026werden identisch normalisiert (→ctf2026).Keine Wildcards.
*oderctf2026/*sind falsch; ein*wird als „kein Filter" behandelt, damit ältere Bots keinen Fehler bekommen.limitist ein Integer (100, nicht"100"), Bereich 1–500. Der Filter greift vor dem Limit,limit: 100liefert also bis zu 100 passende Seiten statt 100 global gelesener.tags,orderByundlocaleverhalten sich unverändert und lassen sich mitpathkombinieren.
Wiki.js selbst kann in pages.list nicht nach Pfad-Präfix filtern; der Filter läuft deshalb im MCP-Server, direkt auf der Ergebnisliste.
Harte Bereichsgrenze (WIKIJS_PATH_PREFIX)
Für Setups, in denen ein Agent (z. B. in einem Mattermost-Channel) nur einen Wiki-Bereich sehen und verändern darf:
WIKIJS_PATH_PREFIX=CTF2026Ist die Variable gesetzt, gilt für alle Page-Tools:
Tool | Verhalten |
| liefert ausschließlich Seiten im Präfix; ein zusätzliches |
| sucht ausschließlich im Präfix, inkl. Wildcard-Abfrage und Content-Scan-Fallback |
| verweigert Seiten außerhalb des Präfix (per ID und per Pfad) |
| verweigert Zielpfade außerhalb des Präfix |
| verweigert Änderungen an Seiten außerhalb des Präfix und das Verschieben einer Seite hinaus |
| verweigert das Löschen außerhalb des Präfix |
Es gilt dieselbe Segment-Regel wie beim path-Filter (ctf2026 bzw. ctf2026/..., aber nicht ctf20260 oder ctf2026-old), und Slashes sowie ein Locale-Präfix werden normalisiert. Ist WIKIJS_PATH_PREFIX leer oder nicht gesetzt, bleibt das Verhalten unverändert unbeschränkt.
Abgelehnte Aufrufe liefern eine erklärende Fehlermeldung samt Vorschlag, z. B.:
ERROR: Refused: this server is restricted to the wiki section "ctf2026".
The requested path "infrastructure/backup" is outside that section.
Did you mean "ctf2026/infrastructure/backup"?Starten
npm install
npm run build
npm start # HTTP-Modus auf Port 3123Entwicklung mit Auto-Reload:
npm run devMit Docker Compose:
cp docker-compose.example.yml docker-compose.yml
cp .env.example .env # Werte anpassen
docker compose up -dDer MCP-Endpunkt ist dann http://<host>:3123/mcp, ein Healthcheck liegt auf GET /healthz.
Einrichtung in Mattermost
Mattermost Agents bindet externe MCP-Server über Streamable HTTP an (stdio wird nicht unterstützt — deshalb ist http hier der Default-Transport).
Diesen Server so starten, dass er vom Mattermost-Server aus erreichbar ist (
MCP_AUTH_TOKENsetzen!).In Mattermost: System Console → Plugins → Agents → Model Context Protocol (MCP).
Add Remote MCP Server wählen:
URL:
http://<host>:3123/mcpCustom Headers (wenn
MCP_AUTH_TOKENgesetzt):Authorization=Bearer <dein-token>
Speichern — die
wiki_*-Tools stehen dem Agent anschließend in Mattermost-Channels zur Verfügung.
Lokal testen
MCP-Handshake per curl:
curl -s -X POST http://localhost:3123/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'Für lokale stdio-Clients (z. B. Claude Code): MCP_TRANSPORT=stdio setzen und den Prozess node dist/server.js als MCP-Server eintragen.
Beispiel-Tool-Aufrufe
Alle Seiten eines Bereichs auflisten:
{ "name": "wiki_list_pages", "arguments": { "path": "CTF2026", "limit": 100, "orderBy": "PATH" } }Das ganze Wiki auflisten (unverändertes Verhalten):
{ "name": "wiki_list_pages", "arguments": { "limit": 50 } }Nur Writeups mit Tag im Bereich:
{ "name": "wiki_list_pages", "arguments": { "path": "ctf2026", "tags": ["writeup"] } }Falsch — Wildcards und String-Zahlen:
{ "name": "wiki_list_pages", "arguments": { "path": "*", "limit": "50" } }"*" wird als „kein Filter" behandelt und "50" wird noch toleriert; korrekt sind "path": "ctf2026" und "limit": 50. Wirklich ungültige Werte ("limit": "viele", "limit": 2.5, "orderBy": "SIDEWAYS") werden mit einer klaren Validierungsmeldung abgelehnt.
Tests
npm testFührt die Node-eigene Test-Runner-Suite (node --test) über test/ aus — aktuell 73 Tests. Ein Wiki.js wird nicht gebraucht: die Tools laufen über den MCP-In-Memory-Transport gegen einen Fake-Client, und die Testumgebung wird fest gesetzt, eine vorhandene .env beeinflusst das Ergebnis also nicht.
Abgedeckt sind unter anderem:
Bereich | Inhalt |
Pfade | Normalisierung von Slashes, Locale-Präfix und Wildcards; segment-genaues Präfix-Matching inkl. |
| mit und ohne |
Schema |
|
| Durchsetzung in allen sechs Page-Tools, inkl. Verschiebeversuch aus dem Bereich heraus und der beiden Such-Fallbacks |
| Fallback auf |
Version |
|
Hinweise
Page-IDs sind in Wiki.js Integer (keine UUIDs).
Pfade werden ohne führenden Slash und ohne Locale-Präfix angegeben (
infrastruktur/backup, nicht/de/infrastruktur/backup).Wiki.js 3.x hat ein inkompatibles GraphQL-Schema und wird von diesem Server nicht unterstützt.
Nach einer Änderung an der
.envden Container neu starten — die Konfiguration wird nur beim Start gelesen.
This server cannot be deployed
Maintenance
Related MCP Connectors
- hiveWikiOAuthai.hivewiki
Shared project wiki for AI agents: read and write pages, next actions, and activity logs over MCP.
- FlowdexOAuthdk.flowdex
Read and write your team's shared, AI-readable wiki from any MCP client.
Read-only MCP for the Eco game wiki: search, Markdown pages, and wiki_* lookups. No keys, no writes.
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceMCP server for accessing Wiki.js through its GraphQL API, enabling page management, search, tags, and system info operations.MIT
- AlicenseAqualityCmaintenanceAn MCP server for managing Wiki.js 2.x pages through its GraphQL API, enabling search, read, create, update, move, delete, version history, and asset listing.1326 npmMIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server for interacting with Wiki.js via GraphQL API, enabling page management (CRUD, search, publish), user and group management, and blogging workflow with drafts.18 npmMIT
- FlicenseNot gradedqualityBmaintenanceMCP server for Wiki.js integration, enabling page CRUD operations (create, update, get, list, search, delete, move) via the Wiki.js GraphQL API.-