@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
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wiki.js GraphQL API Client
|
|
3
|
+
*
|
|
4
|
+
* Provides methods to interact with the Wiki.js GraphQL API
|
|
5
|
+
*/
|
|
6
|
+
import { API_TIMEOUT, CHARACTER_LIMIT } from '../constants.js';
|
|
7
|
+
function compareValues(left, right, direction) {
|
|
8
|
+
const multiplier = direction === 'ASC' ? 1 : -1;
|
|
9
|
+
if (typeof left === 'number' && typeof right === 'number') {
|
|
10
|
+
return (left - right) * multiplier;
|
|
11
|
+
}
|
|
12
|
+
return String(left ?? '').localeCompare(String(right ?? ''), undefined, {
|
|
13
|
+
numeric: true,
|
|
14
|
+
sensitivity: 'base',
|
|
15
|
+
}) * multiplier;
|
|
16
|
+
}
|
|
17
|
+
export class WikiJsClient {
|
|
18
|
+
apiUrl;
|
|
19
|
+
apiToken;
|
|
20
|
+
constructor(apiUrl, apiToken) {
|
|
21
|
+
this.apiUrl = apiUrl;
|
|
22
|
+
this.apiToken = apiToken;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Execute a GraphQL query
|
|
26
|
+
*/
|
|
27
|
+
async query(query, variables = {}) {
|
|
28
|
+
const controller = new AbortController();
|
|
29
|
+
const timeoutId = setTimeout(() => controller.abort(), API_TIMEOUT);
|
|
30
|
+
try {
|
|
31
|
+
const response = await fetch(this.apiUrl, {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
headers: {
|
|
34
|
+
Authorization: `Bearer ${this.apiToken}`,
|
|
35
|
+
'Content-Type': 'application/json',
|
|
36
|
+
},
|
|
37
|
+
body: JSON.stringify({ query, variables }),
|
|
38
|
+
signal: controller.signal,
|
|
39
|
+
});
|
|
40
|
+
clearTimeout(timeoutId);
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
43
|
+
}
|
|
44
|
+
const result = (await response.json());
|
|
45
|
+
if (result.errors) {
|
|
46
|
+
// Log full error for debugging, return only messages to client
|
|
47
|
+
console.error('GraphQL API errors:', JSON.stringify(result.errors));
|
|
48
|
+
const messages = result.errors.map((e) => e.message).join('; ');
|
|
49
|
+
throw new Error(`GraphQL request failed: ${messages}`);
|
|
50
|
+
}
|
|
51
|
+
if (!result.data) {
|
|
52
|
+
throw new Error('No data returned from GraphQL API');
|
|
53
|
+
}
|
|
54
|
+
return result.data;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
58
|
+
throw new Error('Request timed out. Please try again.');
|
|
59
|
+
}
|
|
60
|
+
throw new Error(`Wiki.js API request failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* List all pages with optional filtering
|
|
65
|
+
*/
|
|
66
|
+
async listPages(locale = null, limit = 100, offset = 0, path = null) {
|
|
67
|
+
const query = `
|
|
68
|
+
query {
|
|
69
|
+
pages {
|
|
70
|
+
list {
|
|
71
|
+
id
|
|
72
|
+
path
|
|
73
|
+
title
|
|
74
|
+
description
|
|
75
|
+
isPublished
|
|
76
|
+
locale
|
|
77
|
+
contentType
|
|
78
|
+
createdAt
|
|
79
|
+
updatedAt
|
|
80
|
+
tags
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
`;
|
|
85
|
+
const data = await this.query(query);
|
|
86
|
+
let pages = data.pages.list;
|
|
87
|
+
// Filter by locale if provided
|
|
88
|
+
if (locale) {
|
|
89
|
+
pages = pages.filter((p) => p.locale === locale);
|
|
90
|
+
}
|
|
91
|
+
// Keep support-facing retrieval scoped to published pages.
|
|
92
|
+
pages = pages.filter((p) => p.isPublished);
|
|
93
|
+
// Filter to pages under the requested path if provided.
|
|
94
|
+
if (path) {
|
|
95
|
+
pages = pages.filter((p) => p.path.startsWith(path));
|
|
96
|
+
}
|
|
97
|
+
pages = pages.sort((left, right) => compareValues(left.title, right.title, 'ASC'));
|
|
98
|
+
const total = pages.length;
|
|
99
|
+
const paginatedPages = limit < 0 ? pages : pages.slice(offset, offset + limit);
|
|
100
|
+
return { pages: paginatedPages, total };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get a single page by ID
|
|
104
|
+
*/
|
|
105
|
+
async getPageById(id) {
|
|
106
|
+
const query = `
|
|
107
|
+
query($id: Int!) {
|
|
108
|
+
pages {
|
|
109
|
+
single(id: $id) {
|
|
110
|
+
id
|
|
111
|
+
path
|
|
112
|
+
title
|
|
113
|
+
description
|
|
114
|
+
content
|
|
115
|
+
contentType
|
|
116
|
+
isPublished
|
|
117
|
+
locale
|
|
118
|
+
createdAt
|
|
119
|
+
updatedAt
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
`;
|
|
124
|
+
const data = await this.query(query, { id });
|
|
125
|
+
const page = data.pages.single;
|
|
126
|
+
// Truncate content if needed
|
|
127
|
+
if (page?.content && page.content.length > CHARACTER_LIMIT) {
|
|
128
|
+
page.content =
|
|
129
|
+
page.content.substring(0, CHARACTER_LIMIT) +
|
|
130
|
+
`\n\n[Content truncated. Original length: ${page.content.length} chars. Use path-based access for full content.]`;
|
|
131
|
+
}
|
|
132
|
+
return page;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get a single page by path
|
|
136
|
+
*/
|
|
137
|
+
async getPageByPath(path, locale = 'en') {
|
|
138
|
+
const query = `
|
|
139
|
+
query($path: String!, $locale: String!) {
|
|
140
|
+
pages {
|
|
141
|
+
singleByPath(path: $path, locale: $locale) {
|
|
142
|
+
id
|
|
143
|
+
path
|
|
144
|
+
title
|
|
145
|
+
description
|
|
146
|
+
content
|
|
147
|
+
contentType
|
|
148
|
+
isPublished
|
|
149
|
+
locale
|
|
150
|
+
createdAt
|
|
151
|
+
updatedAt
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
`;
|
|
156
|
+
const data = await this.query(query, { path, locale });
|
|
157
|
+
const page = data.pages.singleByPath;
|
|
158
|
+
// Truncate content if needed
|
|
159
|
+
if (page?.content && page.content.length > CHARACTER_LIMIT) {
|
|
160
|
+
page.content =
|
|
161
|
+
page.content.substring(0, CHARACTER_LIMIT) +
|
|
162
|
+
`\n\n[Content truncated. Original length: ${page.content.length} chars]`;
|
|
163
|
+
}
|
|
164
|
+
return page;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Search pages
|
|
168
|
+
*/
|
|
169
|
+
async searchPages(searchQuery, locale = null, path = null) {
|
|
170
|
+
const query = `
|
|
171
|
+
query($query: String!) {
|
|
172
|
+
pages {
|
|
173
|
+
search(query: $query) {
|
|
174
|
+
results {
|
|
175
|
+
id
|
|
176
|
+
title
|
|
177
|
+
path
|
|
178
|
+
description
|
|
179
|
+
locale
|
|
180
|
+
}
|
|
181
|
+
suggestions
|
|
182
|
+
totalHits
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
`;
|
|
187
|
+
const data = await this.query(query, { query: searchQuery });
|
|
188
|
+
const results = data.pages.search;
|
|
189
|
+
const { pages: activePages } = await this.listPages(locale, -1, 0, path);
|
|
190
|
+
const activePageKeys = new Set(activePages.map((p) => `${p.locale}:${p.path}`));
|
|
191
|
+
results.results = results.results.filter((r) => activePageKeys.has(`${r.locale}:${r.path}`));
|
|
192
|
+
results.results = results.results.sort((left, right) => compareValues(left.title, right.title, 'ASC'));
|
|
193
|
+
results.totalHits = results.results.length;
|
|
194
|
+
return results;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get the hierarchical Wiki.js page tree
|
|
198
|
+
*/
|
|
199
|
+
async getPageTree(path = null, parent = null, mode = 'ALL', locale = 'en', includeAncestors = false) {
|
|
200
|
+
const query = `
|
|
201
|
+
query($path: String, $parent: Int, $mode: PageTreeMode!, $locale: String!, $includeAncestors: Boolean) {
|
|
202
|
+
pages {
|
|
203
|
+
tree(path: $path, parent: $parent, mode: $mode, locale: $locale, includeAncestors: $includeAncestors) {
|
|
204
|
+
id
|
|
205
|
+
path
|
|
206
|
+
depth
|
|
207
|
+
title
|
|
208
|
+
isPrivate
|
|
209
|
+
isFolder
|
|
210
|
+
privateNS
|
|
211
|
+
parent
|
|
212
|
+
pageId
|
|
213
|
+
locale
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
`;
|
|
218
|
+
const data = await this.query(query, {
|
|
219
|
+
path,
|
|
220
|
+
parent,
|
|
221
|
+
mode,
|
|
222
|
+
locale,
|
|
223
|
+
includeAncestors,
|
|
224
|
+
});
|
|
225
|
+
const { pages: activePages } = await this.listPages(locale, -1, 0, path ?? null);
|
|
226
|
+
const activePagePaths = new Set(activePages.map((page) => page.path));
|
|
227
|
+
return data.pages.tree.filter((node) => {
|
|
228
|
+
if (!node.isFolder) {
|
|
229
|
+
return activePagePaths.has(node.path);
|
|
230
|
+
}
|
|
231
|
+
return activePages.some((page) => page.path === node.path || page.path.startsWith(`${node.path}/`));
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/services/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAe/D,SAAS,aAAa,CAAC,IAAiC,EAAE,KAAkC,EAAE,SAAwB;IACpH,MAAM,UAAU,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC1D,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,UAAU,CAAC;IACrC,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE;QACtE,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,MAAM;KACpB,CAAC,GAAG,UAAU,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,YAAY;IACf,MAAM,CAAS;IACf,QAAQ,CAAS;IAEzB,YAAY,MAAc,EAAE,QAAgB;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAI,KAAa,EAAE,YAAqC,EAAE;QACnE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,WAAW,CAAC,CAAC;QAEpE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;gBACxC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,QAAQ,EAAE;oBACxC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;gBAC1C,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5D,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;YAE7D,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,+DAA+D;gBAC/D,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChE,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;YAED,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC1D,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CACb,SAAwB,IAAI,EAC5B,QAAgB,GAAG,EACnB,SAAiB,CAAC,EAClB,OAAsB,IAAI;QAE1B,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;KAiBb,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAA0C,KAAK,CAAC,CAAC;QAC9E,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAE5B,+BAA+B;QAC/B,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACnD,CAAC;QAED,2DAA2D;QAC3D,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAE3C,wDAAwD;QACxD,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAEnF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAE3B,MAAM,cAAc,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;QAE/E,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;KAiBb,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAyC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACrF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAE/B,6BAA6B;QAC7B,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YAC3D,IAAI,CAAC,OAAO;gBACV,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC;oBAC1C,4CAA4C,IAAI,CAAC,OAAO,CAAC,MAAM,kDAAkD,CAAC;QACtH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,SAAiB,IAAI;QACrD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;KAiBb,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAA+C,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACrG,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;QAErC,6BAA6B;QAC7B,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YAC3D,IAAI,CAAC,OAAO;gBACV,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC;oBAC1C,4CAA4C,IAAI,CAAC,OAAO,CAAC,MAAM,SAAS,CAAC;QAC7E,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,WAAmB,EACnB,SAAwB,IAAI,EAC5B,OAAsB,IAAI;QAE1B,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;KAgBb,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAwC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACpG,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAElC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACzE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7F,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACvG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QAE3C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,OAAsB,IAAI,EAC1B,SAAwB,IAAI,EAC5B,OAAoC,KAAK,EACzC,SAAiB,IAAI,EACrB,mBAA4B,KAAK;QAEjC,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;KAiBb,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAA0C,KAAK,EAAE;YAC5E,IAAI;YACJ,MAAM;YACN,IAAI;YACJ,MAAM;YACN,gBAAgB;SACjB,CAAC,CAAC;QAEH,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;QACjF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEtE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;YAED,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC;IACL,CAAC;CAEF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized Error Handler for Wiki.js MCP Server
|
|
3
|
+
*/
|
|
4
|
+
export interface ToolErrorResponse {
|
|
5
|
+
content: Array<{
|
|
6
|
+
type: 'text';
|
|
7
|
+
text: string;
|
|
8
|
+
}>;
|
|
9
|
+
isError: true;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Handle tool errors and return a consistent error response
|
|
13
|
+
*/
|
|
14
|
+
export declare function handleToolError(error: unknown, toolName: string): ToolErrorResponse;
|
|
15
|
+
/**
|
|
16
|
+
* Helper to create success response
|
|
17
|
+
*/
|
|
18
|
+
export declare function successResponse(data: Record<string, unknown>): {
|
|
19
|
+
content: Array<{
|
|
20
|
+
type: 'text';
|
|
21
|
+
text: string;
|
|
22
|
+
}>;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Format a markdown table from page list
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatPageListMarkdown(pages: Array<{
|
|
28
|
+
id: number;
|
|
29
|
+
title: string;
|
|
30
|
+
path: string;
|
|
31
|
+
locale: string;
|
|
32
|
+
updatedAt?: string;
|
|
33
|
+
}>, totalCount: number): string;
|
|
34
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/services/error-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,OAAO,EAAE,IAAI,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAiCnF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC9D,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD,CAgBA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAC7F,UAAU,EAAE,MAAM,GACjB,MAAM,CAkBR"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized Error Handler for Wiki.js MCP Server
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
/**
|
|
6
|
+
* Handle tool errors and return a consistent error response
|
|
7
|
+
*/
|
|
8
|
+
export function handleToolError(error, toolName) {
|
|
9
|
+
let errorMessage;
|
|
10
|
+
if (error instanceof z.ZodError) {
|
|
11
|
+
// Zod validation errors - provide detailed field information
|
|
12
|
+
const issues = error.issues.map((issue) => ` - ${issue.path.join('.')}: ${issue.message}`).join('\n');
|
|
13
|
+
errorMessage = `Validation error in ${toolName}:\n${issues}`;
|
|
14
|
+
}
|
|
15
|
+
else if (error instanceof Error) {
|
|
16
|
+
errorMessage = error.message;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
errorMessage = String(error);
|
|
20
|
+
}
|
|
21
|
+
// Log error to stderr for debugging (stdio servers should log to stderr)
|
|
22
|
+
console.error(`[${toolName}] Error:`, errorMessage);
|
|
23
|
+
return {
|
|
24
|
+
content: [
|
|
25
|
+
{
|
|
26
|
+
type: 'text',
|
|
27
|
+
text: JSON.stringify({
|
|
28
|
+
success: false,
|
|
29
|
+
error: errorMessage,
|
|
30
|
+
tool: toolName,
|
|
31
|
+
}, null, 2),
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
isError: true,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Helper to create success response
|
|
39
|
+
*/
|
|
40
|
+
export function successResponse(data) {
|
|
41
|
+
return {
|
|
42
|
+
content: [
|
|
43
|
+
{
|
|
44
|
+
type: 'text',
|
|
45
|
+
text: JSON.stringify({
|
|
46
|
+
success: true,
|
|
47
|
+
...data,
|
|
48
|
+
}, null, 2),
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Format a markdown table from page list
|
|
55
|
+
*/
|
|
56
|
+
export function formatPageListMarkdown(pages, totalCount) {
|
|
57
|
+
if (pages.length === 0) {
|
|
58
|
+
return '# Pages\n\nNo pages found.';
|
|
59
|
+
}
|
|
60
|
+
const lines = [
|
|
61
|
+
`# Pages (showing ${pages.length} of ${totalCount})`,
|
|
62
|
+
'',
|
|
63
|
+
'| ID | Title | Path | Locale | Updated |',
|
|
64
|
+
'|-----|-------|------|--------|---------|',
|
|
65
|
+
];
|
|
66
|
+
for (const page of pages) {
|
|
67
|
+
const updated = page.updatedAt ? new Date(page.updatedAt).toLocaleDateString() : 'N/A';
|
|
68
|
+
lines.push(`| ${page.id} | ${page.title} | ${page.path} | ${page.locale} | ${updated} |`);
|
|
69
|
+
}
|
|
70
|
+
return lines.join('\n');
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/services/error-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,QAAgB;IAC9D,IAAI,YAAoB,CAAC;IAEzB,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChC,6DAA6D;QAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvG,YAAY,GAAG,uBAAuB,QAAQ,MAAM,MAAM,EAAE,CAAC;IAC/D,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,yEAAyE;IACzE,OAAO,CAAC,KAAK,CAAC,IAAI,QAAQ,UAAU,EAAE,YAAY,CAAC,CAAC;IAEpD,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,YAAY;oBACnB,IAAI,EAAE,QAAQ;iBACf,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;QACD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAA6B;IAG3D,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,OAAO,EAAE,IAAI;oBACb,GAAG,IAAI;iBACR,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAA6F,EAC7F,UAAkB;IAElB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,4BAA4B,CAAC;IACtC,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,oBAAoB,KAAK,CAAC,MAAM,OAAO,UAAU,GAAG;QACpD,EAAE;QACF,0CAA0C;QAC1C,2CAA2C;KAC5C,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACvF,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,MAAM,OAAO,IAAI,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wikijs_get_page Tool
|
|
3
|
+
*
|
|
4
|
+
* Retrieves a page from Wiki.js by ID or path
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import type { WikiJsClient } from '../services/client.js';
|
|
8
|
+
import { getPageSchema } from '../schemas/index.js';
|
|
9
|
+
export declare const getPageToolDefinition: {
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
inputSchema: z.ZodObject<{
|
|
13
|
+
id: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
path: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
|
|
15
|
+
locale: z.ZodDefault<z.ZodString>;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
locale: string;
|
|
18
|
+
id?: number | undefined;
|
|
19
|
+
path?: string | undefined;
|
|
20
|
+
}, {
|
|
21
|
+
id?: number | undefined;
|
|
22
|
+
path?: string | undefined;
|
|
23
|
+
locale?: string | undefined;
|
|
24
|
+
}>;
|
|
25
|
+
annotations: {
|
|
26
|
+
readOnlyHint: boolean;
|
|
27
|
+
destructiveHint: boolean;
|
|
28
|
+
idempotentHint: boolean;
|
|
29
|
+
openWorldHint: boolean;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
export declare function handleGetPage(client: WikiJsClient, args: z.infer<typeof getPageSchema>): Promise<{
|
|
33
|
+
content: Array<{
|
|
34
|
+
type: 'text';
|
|
35
|
+
text: string;
|
|
36
|
+
}>;
|
|
37
|
+
isError?: boolean;
|
|
38
|
+
}>;
|
|
39
|
+
//# sourceMappingURL=get-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-page.d.ts","sourceRoot":"","sources":["../../src/tools/get-page.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAC;AAGvE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;CA8BjC,CAAC;AAEF,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,GAClC,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAqChF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wikijs_get_page Tool
|
|
3
|
+
*
|
|
4
|
+
* Retrieves a page from Wiki.js by ID or path
|
|
5
|
+
*/
|
|
6
|
+
import { getPageSchema } from '../schemas/index.js';
|
|
7
|
+
import { handleToolError, successResponse } from '../services/error-handler.js';
|
|
8
|
+
export const getPageToolDefinition = {
|
|
9
|
+
name: 'wikijs_get_page',
|
|
10
|
+
description: `Get a page from Wiki.js by ID or path. Returns full page content and metadata.
|
|
11
|
+
|
|
12
|
+
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.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
- id (number, optional): Page ID (use this OR path)
|
|
16
|
+
- path (string, optional): Page path (use this OR id)
|
|
17
|
+
- locale (string): Page locale, default "en" (required when using path)
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
Full page data including:
|
|
21
|
+
- id, path, title, description
|
|
22
|
+
- content (may be truncated for very large pages)
|
|
23
|
+
- contentType, isPublished, locale
|
|
24
|
+
- createdAt, updatedAt timestamps
|
|
25
|
+
|
|
26
|
+
Note: Content over 100,000 characters will be truncated with a notice.
|
|
27
|
+
|
|
28
|
+
Examples:
|
|
29
|
+
- Get by ID: id=42
|
|
30
|
+
- Get by path: path="osticket/api-endpoints", locale="en"`,
|
|
31
|
+
inputSchema: getPageSchema,
|
|
32
|
+
annotations: {
|
|
33
|
+
readOnlyHint: true,
|
|
34
|
+
destructiveHint: false,
|
|
35
|
+
idempotentHint: true,
|
|
36
|
+
openWorldHint: true,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
export async function handleGetPage(client, args) {
|
|
40
|
+
try {
|
|
41
|
+
// Validate input with Zod
|
|
42
|
+
const validated = getPageSchema.parse(args);
|
|
43
|
+
if (!validated.id && !validated.path) {
|
|
44
|
+
throw new Error('Either "id" or "path" must be provided');
|
|
45
|
+
}
|
|
46
|
+
let page;
|
|
47
|
+
if (validated.id) {
|
|
48
|
+
page = await client.getPageById(validated.id);
|
|
49
|
+
}
|
|
50
|
+
else if (validated.path) {
|
|
51
|
+
page = await client.getPageByPath(validated.path, validated.locale);
|
|
52
|
+
}
|
|
53
|
+
if (!page) {
|
|
54
|
+
throw new Error(`Page not found${validated.path ? ` at path: ${validated.path}` : ` with ID: ${validated.id}`}`);
|
|
55
|
+
}
|
|
56
|
+
return successResponse({
|
|
57
|
+
page: {
|
|
58
|
+
id: page.id,
|
|
59
|
+
path: page.path,
|
|
60
|
+
title: page.title,
|
|
61
|
+
description: page.description,
|
|
62
|
+
content: page.content,
|
|
63
|
+
contentType: page.contentType,
|
|
64
|
+
isPublished: page.isPublished,
|
|
65
|
+
locale: page.locale,
|
|
66
|
+
createdAt: page.createdAt,
|
|
67
|
+
updatedAt: page.updatedAt,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
return handleToolError(error, 'wikijs_get_page');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=get-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-page.js","sourceRoot":"","sources":["../../src/tools/get-page.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEhF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;4DAoB6C;IAC1D,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE;QACX,YAAY,EAAE,IAAI;QAClB,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;KACpB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAoB,EACpB,IAAmC;IAEnC,IAAI,CAAC;QACH,0BAA0B;QAC1B,MAAM,SAAS,GAAiB,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE1D,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,IAAI,CAAC;QACT,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,iBAAiB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,aAAa,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACnH,CAAC;QAED,OAAO,eAAe,CAAC;YACrB,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,eAAe,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wikijs_get_tree Tool
|
|
3
|
+
*
|
|
4
|
+
* Retrieves the hierarchical Wiki.js page tree
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import type { WikiJsClient } from '../services/client.js';
|
|
8
|
+
import { getTreeSchema } from '../schemas/index.js';
|
|
9
|
+
export declare const getTreeToolDefinition: {
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
inputSchema: z.ZodObject<{
|
|
13
|
+
parent_path: z.ZodOptional<z.ZodString>;
|
|
14
|
+
parent_id: z.ZodOptional<z.ZodNumber>;
|
|
15
|
+
mode: z.ZodDefault<z.ZodEnum<["ALL", "FOLDERS", "PAGES"]>>;
|
|
16
|
+
locale: z.ZodDefault<z.ZodString>;
|
|
17
|
+
includeAncestors: z.ZodDefault<z.ZodBoolean>;
|
|
18
|
+
}, "strip", z.ZodTypeAny, {
|
|
19
|
+
locale: string;
|
|
20
|
+
mode: "ALL" | "FOLDERS" | "PAGES";
|
|
21
|
+
includeAncestors: boolean;
|
|
22
|
+
parent_path?: string | undefined;
|
|
23
|
+
parent_id?: number | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
locale?: string | undefined;
|
|
26
|
+
mode?: "ALL" | "FOLDERS" | "PAGES" | undefined;
|
|
27
|
+
includeAncestors?: boolean | undefined;
|
|
28
|
+
parent_path?: string | undefined;
|
|
29
|
+
parent_id?: number | undefined;
|
|
30
|
+
}>;
|
|
31
|
+
annotations: {
|
|
32
|
+
readOnlyHint: boolean;
|
|
33
|
+
destructiveHint: boolean;
|
|
34
|
+
idempotentHint: boolean;
|
|
35
|
+
openWorldHint: boolean;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export declare function handleGetTree(client: WikiJsClient, args: z.infer<typeof getTreeSchema>): Promise<{
|
|
39
|
+
content: Array<{
|
|
40
|
+
type: 'text';
|
|
41
|
+
text: string;
|
|
42
|
+
}>;
|
|
43
|
+
isError?: boolean;
|
|
44
|
+
}>;
|
|
45
|
+
//# sourceMappingURL=get-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-tree.d.ts","sourceRoot":"","sources":["../../src/tools/get-tree.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAC;AAGvE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BjC,CAAC;AAEF,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,GAClC,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAiDhF"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wikijs_get_tree Tool
|
|
3
|
+
*
|
|
4
|
+
* Retrieves the hierarchical Wiki.js page tree
|
|
5
|
+
*/
|
|
6
|
+
import { getTreeSchema } from '../schemas/index.js';
|
|
7
|
+
import { handleToolError } from '../services/error-handler.js';
|
|
8
|
+
export const getTreeToolDefinition = {
|
|
9
|
+
name: 'wikijs_get_tree',
|
|
10
|
+
description: `Get the hierarchical Wiki.js page tree.
|
|
11
|
+
|
|
12
|
+
This read-only tool helps support agents understand the published knowledge base structure before retrieving individual pages.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
- parent_path (string, optional): Parent path to start from. Omit for wiki root.
|
|
16
|
+
- parent_id (number, optional): Parent tree node ID to start from.
|
|
17
|
+
- mode (string): ALL, FOLDERS, or PAGES. Default "ALL".
|
|
18
|
+
- locale (string): Page locale, default "en".
|
|
19
|
+
- includeAncestors (boolean): Include ancestor nodes, default false.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
A readable depth-indented tree of published pages. Folders are shown only when they contain published pages.
|
|
23
|
+
|
|
24
|
+
Examples:
|
|
25
|
+
- Get whole English tree: locale="en"
|
|
26
|
+
- Get only folders: mode="FOLDERS", locale="en"
|
|
27
|
+
- Get subtree: parent_path="osticket", locale="en"`,
|
|
28
|
+
inputSchema: getTreeSchema,
|
|
29
|
+
annotations: {
|
|
30
|
+
readOnlyHint: true,
|
|
31
|
+
destructiveHint: false,
|
|
32
|
+
idempotentHint: true,
|
|
33
|
+
openWorldHint: true,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
export async function handleGetTree(client, args) {
|
|
37
|
+
try {
|
|
38
|
+
const validated = getTreeSchema.parse(args);
|
|
39
|
+
const tree = await client.getPageTree(validated.parent_path || null, validated.parent_id ?? null, validated.mode, validated.locale, validated.includeAncestors);
|
|
40
|
+
if (tree.length === 0) {
|
|
41
|
+
return {
|
|
42
|
+
content: [
|
|
43
|
+
{
|
|
44
|
+
type: 'text',
|
|
45
|
+
text: 'No pages found in tree',
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const parentLabel = validated.parent_path?.trim() || 'root';
|
|
51
|
+
const lines = [
|
|
52
|
+
`Wiki page tree from '${parentLabel}' (mode: ${validated.mode}, locale: ${validated.locale}):`,
|
|
53
|
+
'',
|
|
54
|
+
];
|
|
55
|
+
for (const item of tree) {
|
|
56
|
+
const indent = ' '.repeat(Math.max(0, item.depth));
|
|
57
|
+
if (item.isFolder) {
|
|
58
|
+
lines.push(`${indent}📁 ${item.title}/`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
lines.push(`${indent}📄 ${item.title} (${item.path})`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
content: [
|
|
66
|
+
{
|
|
67
|
+
type: 'text',
|
|
68
|
+
text: lines.join('\n'),
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
return handleToolError(error, 'wikijs_get_tree');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=get-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-tree.js","sourceRoot":"","sources":["../../src/tools/get-tree.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE;;;;;;;;;;;;;;;;;qDAiBsC;IACnD,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE;QACX,YAAY,EAAE,IAAI;QAClB,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;KACpB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAoB,EACpB,IAAmC;IAEnC,IAAI,CAAC;QACH,MAAM,SAAS,GAAiB,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE1D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CACnC,SAAS,CAAC,WAAW,IAAI,IAAI,EAC7B,SAAS,CAAC,SAAS,IAAI,IAAI,EAC3B,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,MAAM,EAChB,SAAS,CAAC,gBAAgB,CAC3B,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,wBAAwB;qBAC/B;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC;QAC5D,MAAM,KAAK,GAAG;YACZ,wBAAwB,WAAW,YAAY,SAAS,CAAC,IAAI,aAAa,SAAS,CAAC,MAAM,IAAI;YAC9F,EAAE;SACH,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACpD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;iBACvB;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,eAAe,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool exports for Wiki.js MCP Server
|
|
3
|
+
*/
|
|
4
|
+
export { getPageToolDefinition, handleGetPage } from './get-page.js';
|
|
5
|
+
export { getTreeToolDefinition, handleGetTree } from './get-tree.js';
|
|
6
|
+
export { listPagesToolDefinition, handleListPages } from './list-pages.js';
|
|
7
|
+
export { searchPagesToolDefinition, handleSearchPages } from './search-pages.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool exports for Wiki.js MCP Server
|
|
3
|
+
*/
|
|
4
|
+
export { getPageToolDefinition, handleGetPage } from './get-page.js';
|
|
5
|
+
export { getTreeToolDefinition, handleGetTree } from './get-tree.js';
|
|
6
|
+
export { listPagesToolDefinition, handleListPages } from './list-pages.js';
|
|
7
|
+
export { searchPagesToolDefinition, handleSearchPages } from './search-pages.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|