MCP Server for Wiki.js GraphQL API integration
Strong schema and naming foundation with good descriptions and error handling. All 7 tools have explicit definitions with JSON Schema validation via Zod. Tool names follow verb_noun pattern (create_page, get_page, etc.) with clear action verbs. Descriptions are comprehensive (100-300 chars) and explain WHAT/WHEN/HOW. Schemas include proper type constraints, enums, regex patterns, and min/max bounds. However, output schemas are not formally documented in the tool definitions themselves, they exist in implementation but are not visible in the schema registration. Error handling is present but could be more granular per operation type. Composition is solid: each tool has one clear responsibility, and tool outputs appear designed to chain (e.g., list/search return IDs that other tools accept). Security is well-handled with environment variable injection for credentials.
Create a new page in Wiki.js with markdown or HTML content. This tool creates a new page at the specified path. If a page already exists at that path, the operation will fail. Args: - path (string, required): Page path without leading slash (e.g., "osticket/plugin-name") - title (string, required): Page title (max 200 chars) - content (string, required): Page content in markdown or HTML - description (string, required): Meta description (max 500 chars) - locale (string): Page locale, default "en" - editor (enum): "markdown" (default), "code", or "ckeditor" - isPublished (boolean): Publish immediately, default true - isPrivate (boolean): Private page, default false - tags (array): Tags for categorization Returns: Created page info with ID, path, title, and URL Examples: - Create docs page: path="docs/api", title="API Reference", content="# API..." - Create private draft: path="drafts/idea", isPublished=false, isPrivate=true
Delete a page from Wiki.js. WARNING: This action is IRREVERSIBLE! Permanently removes a page and all its history. Identify the page by ID or path+locale. Args: - id (number, optional): Page ID (use this OR path) - path (string, optional): Page path (use this OR id) - locale (string): Page locale, default "en" (required with path) Returns: Confirmation of deletion CAUTION: This operation cannot be undone. All page history will be lost. Examples: - Delete by ID: id=42 - Delete by path: path="old/deprecated-page", locale="en"
Get a page from Wiki.js by ID or path. Returns full page content and metadata. This tool retrieves a single page with all its content. You can identify the page either by its numeric ID or by its path + locale combination. Args: - id (number, optional): Page ID (use this OR path) - path (string, optional): Page path (use this OR id) - locale (string): Page locale, default "en" (required when using path) Returns: Full page data including: - id, path, title, description - content (may be truncated for very large pages) - contentType, isPublished, locale - createdAt, updatedAt timestamps Note: Content over 100,000 characters will be truncated with a notice. Examples: - Get by ID: id=42 - Get by path: path="osticket/api-endpoints", locale="en"
Output schemas not formally documented in tool registration. While implementation classes exist, the tool definitions do not include 'outputSchema' or return type documentation visible to clients. Clients cannot validate responses or know what fields to expect.
Destructive operation (delete_page) lacks explicit confirmation pattern or dry-run capability. Description includes a CAUTION but does not offer a two-step confirmation flow. Agents could accidentally delete pages without explicit user consent.
Error responses not structured for agent recovery. While error handling exists in implementation (src/services/client.ts likely), the tool descriptions do not document what errors can occur, whether they are retryable, or what the agent should do next (e.g., 'Path already exists, try a different path or use update_page instead').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 66 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 51 | - | v1 |
List all pages in Wiki.js with optional filtering and pagination. This tool returns a paginated list of all pages. Use the offset parameter to navigate through large result sets. Args: - locale (string, optional): Filter by locale (e.g., "en", "de") - limit (number): Max pages to return, default 50, max 200 - offset (number): Skip N pages for pagination, default 0 Returns: - pages: Array of page summaries (id, path, title, description, locale, tags, updatedAt) - pagination: { limit, offset, total_count, has_more, next_offset } Use pagination.has_more and pagination.next_offset to fetch more results. Examples: - List all: (no params, returns first 50) - Filter by locale: locale="de" - Paginate: offset=50, limit=50 (get pages 51-100)
Move a page to a new path in Wiki.js. Reorganize your wiki structure by moving pages to different paths or locales. Identify the source page by ID or path+locale. Args: - id (number, optional): Page ID to move (use this OR path) - path (string, optional): Current page path (use this OR id) - locale (string): Current page locale, default "en" - destinationPath (string, required): New path for the page - destinationLocale (string): Target locale, default "en" Returns: Confirmation of move with old and new paths Note: This changes the page URL. Update any links pointing to the old path. Examples: - Move to new category: id=42, destinationPath="new-category/page-name" - Reorganize: path="old/path", destinationPath="new/path" - Change locale: id=42, destinationPath="page-name", destinationLocale="de"
Search for pages in Wiki.js by query string. This tool performs a full-text search across all page content and metadata. Results are ranked by relevance. Args: - query (string, required): Search query (min 2 chars, max 200 chars) - locale (string, optional): Filter results by locale Returns: - totalHits: Total number of matching pages - suggestions: Search suggestions for refinement - results: Array of matching pages (id, title, path, description, locale) Examples: - Search for topic: query="osTicket API" - Search in German pages: query="Plugin", locale="de"
Update an existing page in Wiki.js. Modify content, title, description, tags, or publish status of an existing page. Identify the page by ID or path+locale. Args: - id (number, optional): Page ID (use this OR path) - path (string, optional): Page path (use this OR id) - locale (string): Page locale, default "en" (required with path) - content (string, optional): New page content - title (string, optional): New title (max 200 chars) - description (string, optional): New description (max 500 chars) - isPublished (boolean, optional): Publish/unpublish - tags (array, optional): Replace tags Returns: Success confirmation with update result Note: If you don't provide content or tags, existing values are automatically preserved. This allows metadata-only updates (e.g., changing isPublished) without having to provide the full page content. Examples: - Update content: id=42, content="# New Content..." - Unpublish: path="drafts/old-post", isPublished=false - Update tags: id=42, tags=["updated", "v2"] - Publish only: id=42, isPublished=true (content auto-preserved)
Pagination metadata in list_pages response is inferred but not documented in tool description. Response includes 'pagination.has_more' and 'pagination.next_offset' in examples, but the formal output schema is not visible in the tool definition.
Mutually exclusive parameters (id vs path+locale) documented in descriptions but could use more explicit guidance. Example: 'Either provide id OR (path + locale), not both' would clarify the constraint for LLMs.