@hsayed21/wikijs-mcp 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +87 -0
  3. package/dist/constants.d.ts +15 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +22 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/index.d.ts +11 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +90 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/schemas/index.d.ts +72 -0
  12. package/dist/schemas/index.d.ts.map +1 -0
  13. package/dist/schemas/index.js +98 -0
  14. package/dist/schemas/index.js.map +1 -0
  15. package/dist/services/client.d.ts +39 -0
  16. package/dist/services/client.d.ts.map +1 -0
  17. package/dist/services/client.js +235 -0
  18. package/dist/services/client.js.map +1 -0
  19. package/dist/services/error-handler.d.ts +34 -0
  20. package/dist/services/error-handler.d.ts.map +1 -0
  21. package/dist/services/error-handler.js +72 -0
  22. package/dist/services/error-handler.js.map +1 -0
  23. package/dist/tools/get-page.d.ts +39 -0
  24. package/dist/tools/get-page.d.ts.map +1 -0
  25. package/dist/tools/get-page.js +75 -0
  26. package/dist/tools/get-page.js.map +1 -0
  27. package/dist/tools/get-tree.d.ts +45 -0
  28. package/dist/tools/get-tree.d.ts.map +1 -0
  29. package/dist/tools/get-tree.js +77 -0
  30. package/dist/tools/get-tree.js.map +1 -0
  31. package/dist/tools/index.d.ts +8 -0
  32. package/dist/tools/index.d.ts.map +1 -0
  33. package/dist/tools/index.js +8 -0
  34. package/dist/tools/index.js.map +1 -0
  35. package/dist/tools/list-pages.d.ts +42 -0
  36. package/dist/tools/list-pages.d.ts.map +1 -0
  37. package/dist/tools/list-pages.js +82 -0
  38. package/dist/tools/list-pages.js.map +1 -0
  39. package/dist/tools/search-pages.d.ts +39 -0
  40. package/dist/tools/search-pages.d.ts.map +1 -0
  41. package/dist/tools/search-pages.js +65 -0
  42. package/dist/tools/search-pages.js.map +1 -0
  43. package/dist/types.d.ts +60 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +5 -0
  46. package/dist/types.js.map +1 -0
  47. package/package.json +50 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Markus Michalski
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # Wiki.js MCP Server
2
+
3
+ **Read-only Model Context Protocol server for Wiki.js** - Search, list, browse, and retrieve published Wiki.js knowledge base pages from your AI assistant.
4
+
5
+ ## v2.0.0 - Major Refactoring
6
+
7
+ This version includes a complete rewrite following MCP Best Practices:
8
+
9
+ - **TypeScript** - Full type safety with strict mode
10
+ - **Modern SDK** - Uses MCP SDK v1.24+ with `McpServer.tool()` API
11
+ - **Zod Validation** - Runtime input validation for all tools
12
+ - **Service-Prefixed Tools** - All tools use `wikijs_` prefix for namespace clarity
13
+ - **Tool Annotations** - Proper `readOnlyHint`, `destructiveHint`, etc.
14
+ - **Pagination Support** - List operations return `has_more`, `next_offset`, `total_count`
15
+ - **Character Limits** - Large content is truncated with clear notices
16
+
17
+ ## Quick Start
18
+
19
+ ```bash
20
+ # 1. Install package
21
+ npm install -g @hsayed21/wikijs-mcp
22
+
23
+ # 2. Configure your MCP client with WIKIJS_API_URL and WIKIJS_API_TOKEN
24
+ ```
25
+
26
+ ## Requirements
27
+
28
+ - **Node.js 18+**
29
+ - **Wiki.js instance** (v2.x or v3.x)
30
+ - **Wiki.js API Token** with read permissions
31
+
32
+ ## Available Tools
33
+
34
+ | Tool | Description | Annotations |
35
+ |------|-------------|-------------|
36
+ | `wikijs_get_page` | Retrieve full page content and metadata | `readOnlyHint: true` |
37
+ | `wikijs_list_pages` | List pages with pagination and filtering | `readOnlyHint: true` |
38
+ | `wikijs_get_tree` | Retrieve the hierarchical Wiki.js page tree | `readOnlyHint: true` |
39
+ | `wikijs_search_pages` | Full-text search across wiki pages | `readOnlyHint: true` |
40
+
41
+ ## Development
42
+
43
+ ```bash
44
+ # Development with hot-reload
45
+ npm run dev
46
+
47
+ # Build for production
48
+ npm run build
49
+
50
+ # Type checking
51
+ npm run typecheck
52
+ ```
53
+
54
+ ## Project Structure
55
+
56
+ ```
57
+ wikijs-mcp/
58
+ ├── src/
59
+ │ ├── index.ts # Main server entry point
60
+ │ ├── constants.ts # Shared constants (CHARACTER_LIMIT, etc.)
61
+ │ ├── types.ts # TypeScript type definitions
62
+ │ ├── schemas/ # Zod validation schemas
63
+ │ ├── services/ # API client and error handling
64
+ │ └── tools/ # Tool implementations
65
+ ├── dist/ # Compiled JavaScript
66
+ ├── evaluation.xml # MCP evaluation test questions
67
+ └── package.json
68
+ ```
69
+
70
+ ## License
71
+
72
+ MIT License - See [LICENSE](./LICENSE) for details
73
+
74
+ ## Author
75
+ **Markus Michalski**
76
+ - Website: [markus-michalski.net](https://markus-michalski.net)
77
+ - GitHub: [@markus-michalski](https://github.com/markus-michalski)
78
+
79
+ ## Attribution
80
+
81
+ Originally authored by [@markus-michalski](https://github.com/markus-michalski). This package was updated by **hsayed21** to fit a read-only Wiki.js MCP workflow for AI support agents.
82
+
83
+ ## Links
84
+
85
+ - **[Full Documentation](https://faq.markus-michalski.net/en/mcp/wikijs)** (English)
86
+ - **[Vollstaendige Dokumentation](https://faq.markus-michalski.net/de/mcp/wikijs)** (Deutsch)
87
+ - [Changelog](./CHANGELOG.md)
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Wiki.js MCP Server Constants
3
+ */
4
+ export declare const CHARACTER_LIMIT = 100000;
5
+ export declare const MAX_CONTENT_SIZE = 500000;
6
+ export declare const DEFAULT_PAGE_LIMIT = 50;
7
+ export declare const MAX_PAGE_LIMIT = 200;
8
+ export declare const MAX_TAG_LENGTH = 100;
9
+ export declare const MAX_TAGS_PER_PAGE = 50;
10
+ export declare const API_TIMEOUT = 30000;
11
+ export declare enum ResponseFormat {
12
+ JSON = "json",
13
+ MARKDOWN = "markdown"
14
+ }
15
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,eAAe,SAAS,CAAC;AAGtC,eAAO,MAAM,gBAAgB,SAAU,CAAC;AAGxC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,cAAc,MAAM,CAAC;AAGlC,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAGpC,eAAO,MAAM,WAAW,QAAQ,CAAC;AAGjC,oBAAY,cAAc;IACxB,IAAI,SAAS;IACb,QAAQ,aAAa;CACtB"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Wiki.js MCP Server Constants
3
+ */
4
+ // Maximum response size in characters to prevent overwhelming LLM context
5
+ export const CHARACTER_LIMIT = 100000;
6
+ // Maximum content size in characters for write operations
7
+ export const MAX_CONTENT_SIZE = 500_000;
8
+ // Default pagination settings
9
+ export const DEFAULT_PAGE_LIMIT = 50;
10
+ export const MAX_PAGE_LIMIT = 200;
11
+ // Tag limits
12
+ export const MAX_TAG_LENGTH = 100;
13
+ export const MAX_TAGS_PER_PAGE = 50;
14
+ // API timeout in milliseconds
15
+ export const API_TIMEOUT = 30000;
16
+ // Response formats
17
+ export var ResponseFormat;
18
+ (function (ResponseFormat) {
19
+ ResponseFormat["JSON"] = "json";
20
+ ResponseFormat["MARKDOWN"] = "markdown";
21
+ })(ResponseFormat || (ResponseFormat = {}));
22
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AAEtC,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAExC,8BAA8B;AAC9B,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACrC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC,aAAa;AACb,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,8BAA8B;AAC9B,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AAEjC,mBAAmB;AACnB,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,uCAAqB,CAAA;AACvB,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Wiki.js MCP Server
4
+ *
5
+ * Provides Model Context Protocol (MCP) tools for interacting with Wiki.js GraphQL API
6
+ *
7
+ * @author Markus Michalski
8
+ * @license MIT
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
package/dist/index.js ADDED
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Wiki.js MCP Server
4
+ *
5
+ * Provides Model Context Protocol (MCP) tools for interacting with Wiki.js GraphQL API
6
+ *
7
+ * @author Markus Michalski
8
+ * @license MIT
9
+ */
10
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
11
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
12
+ import dotenv from 'dotenv';
13
+ import { homedir } from 'os';
14
+ import { join } from 'path';
15
+ import { existsSync } from 'fs';
16
+ import { WikiJsClient } from './services/client.js';
17
+ import { getPageToolDefinition, handleGetPage, getTreeToolDefinition, handleGetTree, listPagesToolDefinition, handleListPages, searchPagesToolDefinition, handleSearchPages, } from './tools/index.js';
18
+ // Load environment variables from deployment directory
19
+ const envPath = join(homedir(), '.claude', 'mcp-servers', 'wikijs', '.env');
20
+ if (existsSync(envPath)) {
21
+ dotenv.config({ path: envPath });
22
+ }
23
+ else {
24
+ // Fallback to CWD for development
25
+ dotenv.config();
26
+ }
27
+ // Validate required environment variables
28
+ const WIKIJS_API_URL = process.env.WIKIJS_API_URL;
29
+ const WIKIJS_API_TOKEN = process.env.WIKIJS_API_TOKEN;
30
+ if (!WIKIJS_API_URL || !WIKIJS_API_TOKEN) {
31
+ console.error('Error: Missing required environment variables');
32
+ console.error('Please ensure WIKIJS_API_URL and WIKIJS_API_TOKEN are set in .env file');
33
+ process.exit(1);
34
+ }
35
+ // Initialize Wiki.js client
36
+ const wikiClient = new WikiJsClient(WIKIJS_API_URL, WIKIJS_API_TOKEN);
37
+ // Create MCP server with modern API
38
+ const server = new McpServer({
39
+ name: 'wikijs-mcp-server',
40
+ version: '2.0.0',
41
+ });
42
+ // Register tools using modern registerTool API
43
+ server.tool(getPageToolDefinition.name, getPageToolDefinition.description, getPageToolDefinition.inputSchema.shape, async (args) => handleGetPage(wikiClient, args));
44
+ server.tool(listPagesToolDefinition.name, listPagesToolDefinition.description, listPagesToolDefinition.inputSchema.shape, async (args) => handleListPages(wikiClient, args));
45
+ server.tool(getTreeToolDefinition.name, getTreeToolDefinition.description, getTreeToolDefinition.inputSchema.shape, async (args) => handleGetTree(wikiClient, args));
46
+ server.tool(searchPagesToolDefinition.name, searchPagesToolDefinition.description, searchPagesToolDefinition.inputSchema.shape, async (args) => handleSearchPages(wikiClient, args));
47
+ // Graceful shutdown handling
48
+ let isShuttingDown = false;
49
+ async function shutdown(signal) {
50
+ if (isShuttingDown)
51
+ return;
52
+ isShuttingDown = true;
53
+ console.error(`Received ${signal}, shutting down gracefully...`);
54
+ try {
55
+ await server.close();
56
+ console.error('Wiki.js MCP Server shutdown complete');
57
+ process.exit(0);
58
+ }
59
+ catch (error) {
60
+ console.error('Error during shutdown:', error);
61
+ process.exit(1);
62
+ }
63
+ }
64
+ // Setup signal handlers
65
+ process.on('SIGINT', () => shutdown('SIGINT'));
66
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
67
+ process.on('uncaughtException', (error) => {
68
+ // Don't log EPIPE errors (broken pipe when client disconnects)
69
+ if (error.code !== 'EPIPE') {
70
+ console.error('Uncaught exception:', error);
71
+ }
72
+ shutdown('uncaughtException');
73
+ });
74
+ process.on('unhandledRejection', (reason) => {
75
+ console.error('Unhandled rejection:', reason);
76
+ shutdown('unhandledRejection');
77
+ });
78
+ // Start server
79
+ async function main() {
80
+ const transport = new StdioServerTransport();
81
+ await server.connect(transport);
82
+ const host = new URL(WIKIJS_API_URL).hostname;
83
+ console.error('Wiki.js MCP Server v2.0.0 running on stdio');
84
+ console.error(`Connected to: ${host}`);
85
+ }
86
+ main().catch((error) => {
87
+ console.error('Server error:', error);
88
+ process.exit(1);
89
+ });
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Zod Schemas for Wiki.js MCP Server Tools
3
+ *
4
+ * All input validation schemas with proper constraints and descriptions
5
+ */
6
+ import { z } from 'zod';
7
+ export declare const getPageSchema: z.ZodObject<{
8
+ id: z.ZodOptional<z.ZodNumber>;
9
+ path: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
10
+ locale: z.ZodDefault<z.ZodString>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ locale: string;
13
+ id?: number | undefined;
14
+ path?: string | undefined;
15
+ }, {
16
+ id?: number | undefined;
17
+ path?: string | undefined;
18
+ locale?: string | undefined;
19
+ }>;
20
+ export type GetPageInput = z.infer<typeof getPageSchema>;
21
+ export declare const listPagesSchema: z.ZodObject<{
22
+ locale: z.ZodOptional<z.ZodString>;
23
+ path: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
24
+ limit: z.ZodDefault<z.ZodNumber>;
25
+ offset: z.ZodDefault<z.ZodNumber>;
26
+ }, "strip", z.ZodTypeAny, {
27
+ limit: number;
28
+ offset: number;
29
+ path?: string | undefined;
30
+ locale?: string | undefined;
31
+ }, {
32
+ path?: string | undefined;
33
+ locale?: string | undefined;
34
+ limit?: number | undefined;
35
+ offset?: number | undefined;
36
+ }>;
37
+ export type ListPagesInput = z.infer<typeof listPagesSchema>;
38
+ export declare const searchPagesSchema: z.ZodObject<{
39
+ query: z.ZodString;
40
+ locale: z.ZodOptional<z.ZodString>;
41
+ path: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
42
+ }, "strip", z.ZodTypeAny, {
43
+ query: string;
44
+ path?: string | undefined;
45
+ locale?: string | undefined;
46
+ }, {
47
+ query: string;
48
+ path?: string | undefined;
49
+ locale?: string | undefined;
50
+ }>;
51
+ export type SearchPagesInput = z.infer<typeof searchPagesSchema>;
52
+ export declare const getTreeSchema: z.ZodObject<{
53
+ parent_path: z.ZodOptional<z.ZodString>;
54
+ parent_id: z.ZodOptional<z.ZodNumber>;
55
+ mode: z.ZodDefault<z.ZodEnum<["ALL", "FOLDERS", "PAGES"]>>;
56
+ locale: z.ZodDefault<z.ZodString>;
57
+ includeAncestors: z.ZodDefault<z.ZodBoolean>;
58
+ }, "strip", z.ZodTypeAny, {
59
+ locale: string;
60
+ mode: "ALL" | "FOLDERS" | "PAGES";
61
+ includeAncestors: boolean;
62
+ parent_path?: string | undefined;
63
+ parent_id?: number | undefined;
64
+ }, {
65
+ locale?: string | undefined;
66
+ mode?: "ALL" | "FOLDERS" | "PAGES" | undefined;
67
+ includeAncestors?: boolean | undefined;
68
+ parent_path?: string | undefined;
69
+ parent_id?: number | undefined;
70
+ }>;
71
+ export type GetTreeInput = z.infer<typeof getTreeSchema>;
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA6CxB,eAAO,MAAM,aAAa;;;;;;;;;;;;EAIxB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAGzD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAoB1B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAG7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAY5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAGjE,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;EAqBxB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Zod Schemas for Wiki.js MCP Server Tools
3
+ *
4
+ * All input validation schemas with proper constraints and descriptions
5
+ */
6
+ import { z } from 'zod';
7
+ import { DEFAULT_PAGE_LIMIT, MAX_PAGE_LIMIT } from '../constants.js';
8
+ // Common schemas
9
+ const localeSchema = z
10
+ .string()
11
+ .regex(/^[a-z]{2}(-[A-Z]{2})?$/, 'Locale must be a valid language code (e.g., "en", "de", "en-US")')
12
+ .default('en')
13
+ .describe('Page locale (e.g., "en", "de")');
14
+ const pageIdSchema = z
15
+ .number()
16
+ .int()
17
+ .positive()
18
+ .describe('Page ID (positive integer)');
19
+ const pagePathSchema = z
20
+ .string()
21
+ .min(1)
22
+ .max(500)
23
+ .regex(/^[a-zA-Z0-9][a-zA-Z0-9\-_/]*[a-zA-Z0-9]$|^[a-zA-Z0-9]$/, 'Path must contain only alphanumeric characters, hyphens, underscores, and forward slashes')
24
+ .refine((path) => !path.includes('..') && !path.includes('//'), 'Path must not contain ".." or "//"')
25
+ .describe('Page path without leading slash (e.g., "osticket/plugin-name" or "home")');
26
+ const pathFilterSchema = z
27
+ .string()
28
+ .min(1)
29
+ .max(500)
30
+ .regex(/^[a-zA-Z0-9][a-zA-Z0-9\-_/]*$/, 'Path must contain only alphanumeric characters, hyphens, underscores, and forward slashes')
31
+ .refine((path) => !path.includes('..') && !path.includes('//'), 'Path must not contain ".." or "//"')
32
+ .describe('Only return pages where the path starts with this value (e.g., "osticket/" or "support")');
33
+ // Get Page Schema
34
+ export const getPageSchema = z.object({
35
+ id: pageIdSchema.optional().describe('Page ID (optional if path is provided)'),
36
+ path: pagePathSchema.optional().describe('Page path (optional if id is provided)'),
37
+ locale: localeSchema,
38
+ });
39
+ // List Pages Schema
40
+ export const listPagesSchema = z.object({
41
+ locale: z
42
+ .string()
43
+ .regex(/^[a-z]{2}(-[A-Z]{2})?$/, 'Locale must be a valid language code')
44
+ .optional()
45
+ .describe('Filter by locale (optional, e.g., "en", "de")'),
46
+ path: pathFilterSchema.optional(),
47
+ limit: z
48
+ .number()
49
+ .int()
50
+ .min(-1)
51
+ .max(MAX_PAGE_LIMIT)
52
+ .default(DEFAULT_PAGE_LIMIT)
53
+ .describe(`Maximum number of pages to return (default: ${DEFAULT_PAGE_LIMIT}, max: ${MAX_PAGE_LIMIT}). Use -1 to return all matching pages.`),
54
+ offset: z
55
+ .number()
56
+ .int()
57
+ .min(0)
58
+ .default(0)
59
+ .describe('Number of pages to skip for pagination (default: 0)'),
60
+ });
61
+ // Search Pages Schema
62
+ export const searchPagesSchema = z.object({
63
+ query: z
64
+ .string()
65
+ .min(2)
66
+ .max(200)
67
+ .describe('Search query string (minimum 2 characters)'),
68
+ locale: z
69
+ .string()
70
+ .regex(/^[a-z]{2}(-[A-Z]{2})?$/, 'Locale must be a valid language code')
71
+ .optional()
72
+ .describe('Filter results by locale (optional)'),
73
+ path: pathFilterSchema.optional(),
74
+ });
75
+ // Get Page Tree Schema
76
+ export const getTreeSchema = z.object({
77
+ parent_path: z
78
+ .string()
79
+ .max(500)
80
+ .optional()
81
+ .describe('Optional parent path to start the tree from. Use empty/omit for the wiki root.'),
82
+ parent_id: z
83
+ .number()
84
+ .int()
85
+ .positive()
86
+ .optional()
87
+ .describe('Optional parent tree node ID to start from. Usually path is easier for agents.'),
88
+ mode: z
89
+ .enum(['ALL', 'FOLDERS', 'PAGES'])
90
+ .default('ALL')
91
+ .describe('Tree mode: ALL returns folders and pages, FOLDERS returns folders only, PAGES returns pages only.'),
92
+ locale: localeSchema,
93
+ includeAncestors: z
94
+ .boolean()
95
+ .default(false)
96
+ .describe('Whether to include ancestor nodes for the selected path/parent.'),
97
+ });
98
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Wiki.js GraphQL API Client
3
+ *
4
+ * Provides methods to interact with the Wiki.js GraphQL API
5
+ */
6
+ import type { WikiPage, WikiPageListItem, SearchResponse, WikiPageTreeNode } from '../types.js';
7
+ export declare class WikiJsClient {
8
+ private apiUrl;
9
+ private apiToken;
10
+ constructor(apiUrl: string, apiToken: string);
11
+ /**
12
+ * Execute a GraphQL query
13
+ */
14
+ query<T>(query: string, variables?: Record<string, unknown>): Promise<T>;
15
+ /**
16
+ * List all pages with optional filtering
17
+ */
18
+ listPages(locale?: string | null, limit?: number, offset?: number, path?: string | null): Promise<{
19
+ pages: WikiPageListItem[];
20
+ total: number;
21
+ }>;
22
+ /**
23
+ * Get a single page by ID
24
+ */
25
+ getPageById(id: number): Promise<WikiPage | null>;
26
+ /**
27
+ * Get a single page by path
28
+ */
29
+ getPageByPath(path: string, locale?: string): Promise<WikiPage | null>;
30
+ /**
31
+ * Search pages
32
+ */
33
+ searchPages(searchQuery: string, locale?: string | null, path?: string | null): Promise<SearchResponse>;
34
+ /**
35
+ * Get the hierarchical Wiki.js page tree
36
+ */
37
+ getPageTree(path?: string | null, parent?: number | null, mode?: 'ALL' | 'FOLDERS' | 'PAGES', locale?: string, includeAncestors?: boolean): Promise<WikiPageTreeNode[]>;
38
+ }
39
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/services/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAsBrB,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAK5C;;OAEG;IACG,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IA2ClF;;OAEG;IACG,SAAS,CACb,MAAM,GAAE,MAAM,GAAG,IAAW,EAC5B,KAAK,GAAE,MAAY,EACnB,MAAM,GAAE,MAAU,EAClB,IAAI,GAAE,MAAM,GAAG,IAAW,GACzB,OAAO,CAAC;QAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA6CxD;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAiCvD;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAa,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAiClF;;OAEG;IACG,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,MAAM,GAAG,IAAW,EAC5B,IAAI,GAAE,MAAM,GAAG,IAAW,GACzB,OAAO,CAAC,cAAc,CAAC;IA+B1B;;OAEG;IACG,WAAW,CACf,IAAI,GAAE,MAAM,GAAG,IAAW,EAC1B,MAAM,GAAE,MAAM,GAAG,IAAW,EAC5B,IAAI,GAAE,KAAK,GAAG,SAAS,GAAG,OAAe,EACzC,MAAM,GAAE,MAAa,EACrB,gBAAgB,GAAE,OAAe,GAChC,OAAO,CAAC,gBAAgB,EAAE,CAAC;CAwC/B"}