Technischer Deep-Dive: mzone-publisher-mcp v1.0.0
Der MCP-Server publisher.maierzone.de ist voll funktionsfähig und gut strukturiert. Er bietet 14 Tools für Content-Management, Template-Rendering und Wiki-Maintenance. Die OAuth2-Integration mit Keycloak funktioniert einwandfrei (getestet mit client_credentials Flow).
8 Templates in 8 Kategorien. Alle nutzen Freemarker als Template-Engine mit HTML5-Output.
| Template | Category | Variables | Typische Nutzung |
|---|---|---|---|
post-single | post | 6 | Blog-Artikel, Berichte |
landing-hero | landing | 7 | Landing Pages, CTAs |
gallery-wide | gallery | 5 | Bildergalerien |
quote-feature | feature | 5 | Feature-Highlights |
timeline-journey | journey | 5 | Story-Telling, Timelines |
split-editorial | editorial | 7 | Editorial Content |
info-card | info | 6 | Info-Boxen, Cards |
wiki-page | wiki | 7 | Wiki-Dokumentation |
Das wiki-page Template verwendet einen spezialisierten Context:
{
"pageType": "service|runbook|status|decision|log|backlog|index|schema",
"title": "...",
"metadata": { "key": "value", ... },
"sections": [
{ "heading": "...", "content": "..." }
],
"crossRefs": ["wiki-svc-other", "wiki-adr-001"],
"lastVerified": "2026-07-28",
"freshnessStatus": "green|yellow|red"
}
Freshness-Thresholds (lintWiki):
| pageType | Threshold | Beschreibung |
|---|---|---|
| status | 1 Tag | Status-Seiten veralten schnell |
| service | 14 Tage | Service-Profile |
| runbook, log, backlog, index, schema | 30 Tage | Operative Dokumentation |
| decision | 90 Tage | Architektur-Entscheidungen |
Der Server verwendet den Streamable HTTP Transport mit SSE (Server-Sent Events) für die Kommunikation. Das erfordert eine explizite Session-Etablierung:
/mcp mit Accept: text/event-stream, application/jsonmcp-session-id Headermcp-session-id Header muss mitgeschickt werden| Mechanismus | Status | Bemerkung |
|---|---|---|
OAuth2 client_credentials | ✅ Funktioniert | Service Account (20min Token-Lifetime) |
OAuth2 authorization_code | ⚠️ Möglich | PKCE + Browser-Flow, Code nur ~60s gültig |
| Token Refresh | ❌ Nicht getestet | Refresh Token bei auth_code verfügbar |
client_credentials optimal. Für User-gebundene Aktionen (Audit-Trail) wäre authorization_code besser, erfordert aber einen Browser-Redirect-Flow.
| Tool | Status | Latenz | Bemerkung |
|---|---|---|---|
| getPageStats | ✅ OK | ~800ms | Liefert korrekte Aggregates |
| listPublishedPages | ✅ OK | ~900ms | 35 Pages, schlankes Format |
| searchPages | ✅ OK | ~700ms | Case-insensitive Slug-Suche |
| fullTextSearch | ✅ OK | ~900ms | Tiefensuche im Context |
| listTemplates | ✅ OK | ~600ms | 8 Templates, no HTML |
| getTemplate | ✅ OK | ~700ms | Liefert vollständiges HTML |
| getPageContext | ⚠️ Partiell | ~600ms | Leere Keys bei wiki-Seiten |
| renderPreview | ✅ OK | ~1000ms | 5KB HTML Output |
| lintWiki | ✅ OK | ~800ms | Keine wiki-Seiten gefunden (kein Fehler) |
| publishPage | ⏭️ Nicht getestet | - | Schreibend, nicht getestet |
| publishRawPage | ⏭️ Nicht getestet | - | Schreibend, nicht getestet |
| publishRawPageCompressed | ⏭️ Nicht getestet | - | Schreibend, nicht getestet |
| mergePageContext | ⏭️ Nicht getestet | - | Schreibend, nicht getestet |
| deletePage | 🚫 BLOCKED | - | Explizit nicht ausgeführt (Safety-Test) |
Die 35 publizierten Seiten umfassen:
Kategorien-Verteilung: editorial, feature, gallery, info, journey, landing, post, wiki
llm-wiki-howto-mission-setup gab Keys: [] zurück. Mögliche Ursachen:
lintWiki fand 0 stale Pages und 0 Pages ohne crossRefs. Das deutet darauf hin, dass entweder:
wiki-* Slug-Pattern folgendestructiveHint: true und readOnlyHint: false — selbst getPageStats und listTemplates. Das könnte Safety-Layer im Client (z.B. Claude Desktop) veranlassen, unnötig nach Bestätigung zu fragen.
publishPages (plural) für Multi-Page-Deployments wäre effizientervalidateTemplate Tool, das Context gegen Schema prüft (vor dem Render)getPageDiff(slug, contextJson) — zeigt Änderungen vor dem PublishgetPageStatsFür die Verbindung mit einem MCP-Client (z.B. Claude Desktop, Continue, oder OpenClaw):
{
"mcpServers": {
"maierzone-publisher": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-remote"],
"env": {
"MCP_SERVER_URL": "https://publisher.maierzone.de/mcp",
"MCP_AUTH_TOKEN": "eyJhbGciOiJSUzI1Ni..."
}
}
}
}
Hinweis: Aktuell unterstützt der Server nur den Streamable HTTP Transport. Eine native SSE-Verbindung (für ältere MCP-Clients) wäre ein Fallback.