@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.
- package/LICENSE +21 -0
- package/README.md +87 -0
- package/dist/constants.d.ts +15 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +22 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/index.d.ts +72 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +98 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/services/client.d.ts +39 -0
- package/dist/services/client.d.ts.map +1 -0
- package/dist/services/client.js +235 -0
- package/dist/services/client.js.map +1 -0
- package/dist/services/error-handler.d.ts +34 -0
- package/dist/services/error-handler.d.ts.map +1 -0
- package/dist/services/error-handler.js +72 -0
- package/dist/services/error-handler.js.map +1 -0
- package/dist/tools/get-page.d.ts +39 -0
- package/dist/tools/get-page.d.ts.map +1 -0
- package/dist/tools/get-page.js +75 -0
- package/dist/tools/get-page.js.map +1 -0
- package/dist/tools/get-tree.d.ts +45 -0
- package/dist/tools/get-tree.d.ts.map +1 -0
- package/dist/tools/get-tree.js +77 -0
- package/dist/tools/get-tree.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-pages.d.ts +42 -0
- package/dist/tools/list-pages.d.ts.map +1 -0
- package/dist/tools/list-pages.js +82 -0
- package/dist/tools/list-pages.js.map +1 -0
- package/dist/tools/search-pages.d.ts +39 -0
- package/dist/tools/search-pages.d.ts.map +1 -0
- package/dist/tools/search-pages.js +65 -0
- package/dist/tools/search-pages.js.map +1 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- 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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|