wikijs-mcp-server
Provides tools for interacting with a Wiki.js instance, enabling listing, reading, searching, creating, updating, and deleting wiki pages.
Click on "Install 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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Shared project wiki for AI agents: read and write pages, next actions, and activity logs over MCP.
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
- AlicenseAqualityCmaintenanceAn MCP server that lets Claude (or any MCP client) manage a Wiki.js instance through its GraphQL admin API — read and write pages, manage navigation and groups, and trigger Git storage syncs.11MIT
- 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.1329MIT
- 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.41MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sglogger/wikijs-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server