yandex-wiki-mcp 0.1.0

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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Brekhov Ilya
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,116 @@
1
+ # yandex-wiki-mcp
2
+
3
+ MCP-сервер для [Yandex Wiki](https://wiki.yandex.ru/) API. Позволяет AI-ассистентам (Claude Code и совместимые клиенты) читать, создавать и редактировать страницы корпоративной вики — удобно для автоматического ведения документации к сервисам.
4
+
5
+ ## Подключение
6
+
7
+ Порядок одинаковый для любого MCP-клиента:
8
+
9
+ 1. Получить OAuth-токен (один раз, локально).
10
+ 2. Прописать сервер в конфиге клиента.
11
+ 3. Перезапустить клиент.
12
+
13
+ ### Шаг 1. Получите OAuth-токен и ID организации
14
+
15
+ Определите тип организации:
16
+
17
+ - **Яндекс 360 для бизнеса** — нужен `org-id` (узнать: `https://admin.yandex.ru/` → «Об организации»)
18
+ - **Yandex Cloud Organization** — нужен `cloud-org-id` (узнать: `https://console.yandex.cloud/` → «Все организации»)
19
+
20
+ Запустите один раз локально — откроется браузер с авторизацией Яндекса:
21
+
22
+ ```bash
23
+ npx -y yandex-wiki-mcp --org-id YOUR_ORG_ID --auth
24
+ # или
25
+ npx -y yandex-wiki-mcp --cloud-org-id YOUR_CLOUD_ORG_ID --auth
26
+ ```
27
+
28
+ CLI использует PKCE (RFC 7636) — без `client_secret`. Если хотите использовать собственное OAuth-приложение, зарегистрируйте его на [oauth.yandex.ru](https://oauth.yandex.ru/) с Redirect URI `http://localhost:27312/callback` и правами `wiki:read`, `wiki:write`, после чего передайте `--client-id YOUR_APP_ID`.
29
+
30
+ Токен сохраняется в `~/.config/yandex-wiki-mcp/token.json` (права `0600`) и оттуда же читается при последующих запусках. При истечении срока сервер сам обновит токен через `refresh_token`.
31
+
32
+ ### Шаг 2. Пропишите сервер в конфиге клиента
33
+
34
+ Базовый пример для **Яндекс 360 для бизнеса**:
35
+
36
+ ```json
37
+ {
38
+ "mcpServers": {
39
+ "yandex-wiki": {
40
+ "command": "npx",
41
+ "args": ["-y", "yandex-wiki-mcp"],
42
+ "env": {
43
+ "YANDEX_ORG_ID": "1234567"
44
+ }
45
+ }
46
+ }
47
+ }
48
+ ```
49
+
50
+ Для **Yandex Cloud Organization** замените `YANDEX_ORG_ID` на `YANDEX_CLOUD_ORG_ID`.
51
+
52
+ #### Claude Code
53
+
54
+ Файл `.mcp.json` в корне проекта (project-scoped). Положите в него JSON-пример выше.
55
+
56
+ Альтернатива через CLI (user-scoped):
57
+
58
+ ```bash
59
+ claude mcp add yandex-wiki --transport stdio \
60
+ --env YANDEX_ORG_ID=1234567 \
61
+ -- npx -y yandex-wiki-mcp
62
+ ```
63
+
64
+ #### Claude Desktop
65
+
66
+ - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
67
+ - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
68
+
69
+ #### Cursor
70
+
71
+ - **Проект**: `.cursor/mcp.json`
72
+ - **Глобально**: `~/.cursor/mcp.json`
73
+
74
+ #### Codex CLI / IDE extension
75
+
76
+ ```toml
77
+ [mcp_servers.yandex-wiki]
78
+ command = "npx"
79
+ args = ["-y", "yandex-wiki-mcp"]
80
+
81
+ [mcp_servers.yandex-wiki.env]
82
+ YANDEX_ORG_ID = "1234567"
83
+ ```
84
+
85
+ ### Совместная работа с `yandex-tracker-mcp`
86
+
87
+ Если у вас одновременно установлены `yandex-tracker-mcp` и `yandex-wiki-mcp` и OAuth-приложение настроено с правами и `tracker:*`, и `wiki:*`, можно задать общий токен через `YANDEX_OAUTH_TOKEN` — он будет использован обоими серверами. Конфигурационные каталоги (`~/.config/yandex-tracker-mcp/` и `~/.config/yandex-wiki-mcp/`) не конфликтуют.
88
+
89
+ ## Переменные окружения
90
+
91
+ | Переменная | Назначение |
92
+ |---|---|
93
+ | `YANDEX_ORG_ID` | ID организации Яндекс 360 для бизнеса (заголовок `X-Org-ID`) |
94
+ | `YANDEX_CLOUD_ORG_ID` | ID Yandex Cloud Organization (заголовок `X-Cloud-Org-ID`) |
95
+ | `YANDEX_OAUTH_TOKEN` | Опционально. Переопределяет токен из `~/.config/yandex-wiki-mcp/token.json` |
96
+ | `WIKI_DEFAULT_PARENT_SLUG` | Опционально. Slug родительской страницы по умолчанию для `create_page` |
97
+
98
+ Указывайте ровно один из `YANDEX_ORG_ID` / `YANDEX_CLOUD_ORG_ID`.
99
+
100
+ ## Доступные инструменты
101
+
102
+ | Инструмент | Описание |
103
+ |---|---|
104
+ | `get_page` | Получить страницу по slug |
105
+ | `get_page_by_id` | Получить страницу по числовому ID |
106
+ | `get_descendants` | Список дочерних страниц по slug родителя (пагинация) |
107
+ | `create_page` | Создать новую страницу (Markdown content + parent) |
108
+ | `update_page` | Обновить заголовок и/или содержимое страницы |
109
+ | `move_page` | Переместить страницу или переименовать её slug |
110
+ | `get_page_resources` | Получить вложения и ресурсы страницы |
111
+ | `get_page_grids` | Список динамических таблиц на странице |
112
+ | `get_grid` | Получить таблицу с колонками и строками |
113
+
114
+ ## Лицензия
115
+
116
+ MIT
package/dist/auth.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { AuthConfig, TokenData } from "./types.js";
2
+ export declare function loadTokenFromFile(): Promise<TokenData | null>;
3
+ export declare function saveTokenToFile(token: TokenData): Promise<void>;
4
+ export declare function resolveToken(config: AuthConfig): Promise<string>;
package/dist/auth.js ADDED
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadTokenFromFile = loadTokenFromFile;
4
+ exports.saveTokenToFile = saveTokenToFile;
5
+ exports.resolveToken = resolveToken;
6
+ const node_http_1 = require("node:http");
7
+ const promises_1 = require("node:fs/promises");
8
+ const node_path_1 = require("node:path");
9
+ const node_os_1 = require("node:os");
10
+ const node_child_process_1 = require("node:child_process");
11
+ const node_crypto_1 = require("node:crypto");
12
+ const OAUTH_PORT = 27312;
13
+ const REDIRECT_URI = `http://localhost:${OAUTH_PORT}/callback`;
14
+ const OAUTH_AUTHORIZE_URL = "https://oauth.yandex.ru/authorize";
15
+ const OAUTH_TOKEN_URL = "https://oauth.yandex.ru/token";
16
+ const OAUTH_TIMEOUT_MS = 120_000;
17
+ const SUCCESS_HTML = `<!DOCTYPE html>
18
+ <html lang="ru">
19
+ <head><meta charset="utf-8"><title>Авторизация</title>
20
+ <style>body{font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;height:100vh;margin:0;background:#f5f5f5}
21
+ .card{background:#fff;padding:2rem 3rem;border-radius:12px;box-shadow:0 2px 8px rgba(0,0,0,.1);text-align:center}
22
+ h1{color:#333;margin-bottom:.5rem}p{color:#666}</style></head>
23
+ <body><div class="card"><h1>Авторизация успешна</h1><p>Можете закрыть эту вкладку.</p></div></body></html>`;
24
+ function getTokenDir() {
25
+ return (0, node_path_1.join)((0, node_os_1.homedir)(), ".config", "yandex-wiki-mcp");
26
+ }
27
+ function getTokenFilePath() {
28
+ return (0, node_path_1.join)(getTokenDir(), "token.json");
29
+ }
30
+ async function loadTokenFromFile() {
31
+ try {
32
+ const raw = await (0, promises_1.readFile)(getTokenFilePath(), "utf-8");
33
+ const data = JSON.parse(raw);
34
+ if (typeof data === "object" &&
35
+ data !== null &&
36
+ "access_token" in data &&
37
+ "refresh_token" in data &&
38
+ "expires_at" in data) {
39
+ return data;
40
+ }
41
+ return null;
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ async function saveTokenToFile(token) {
48
+ const dir = getTokenDir();
49
+ await (0, promises_1.mkdir)(dir, { recursive: true });
50
+ const filePath = getTokenFilePath();
51
+ await (0, promises_1.writeFile)(filePath, JSON.stringify(token, null, 2), "utf-8");
52
+ await (0, promises_1.chmod)(filePath, 0o600);
53
+ }
54
+ function isTokenExpired(token) {
55
+ return token.expires_at < Date.now() / 1000 + 60;
56
+ }
57
+ function toTokenData(response) {
58
+ return {
59
+ access_token: response.access_token,
60
+ refresh_token: response.refresh_token,
61
+ expires_at: Math.floor(Date.now() / 1000) + response.expires_in,
62
+ };
63
+ }
64
+ function base64UrlEncode(buffer) {
65
+ return buffer
66
+ .toString("base64")
67
+ .replace(/\+/g, "-")
68
+ .replace(/\//g, "_")
69
+ .replace(/=+$/, "");
70
+ }
71
+ function generatePkcePair() {
72
+ const verifier = base64UrlEncode((0, node_crypto_1.randomBytes)(32));
73
+ const challenge = base64UrlEncode((0, node_crypto_1.createHash)("sha256").update(verifier).digest());
74
+ return { verifier, challenge };
75
+ }
76
+ async function exchangeCodeForToken(code, clientId, codeVerifier) {
77
+ const body = new URLSearchParams({
78
+ grant_type: "authorization_code",
79
+ code,
80
+ client_id: clientId,
81
+ code_verifier: codeVerifier,
82
+ redirect_uri: REDIRECT_URI,
83
+ });
84
+ const response = await fetch(OAUTH_TOKEN_URL, {
85
+ method: "POST",
86
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
87
+ body: body.toString(),
88
+ });
89
+ if (!response.ok) {
90
+ const text = await response.text();
91
+ throw new Error(`Failed to exchange code for token (${response.status}): ${text}`);
92
+ }
93
+ const data = (await response.json());
94
+ return toTokenData(data);
95
+ }
96
+ async function refreshAccessToken(refreshToken, clientId) {
97
+ const body = new URLSearchParams({
98
+ grant_type: "refresh_token",
99
+ refresh_token: refreshToken,
100
+ client_id: clientId,
101
+ });
102
+ const response = await fetch(OAUTH_TOKEN_URL, {
103
+ method: "POST",
104
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
105
+ body: body.toString(),
106
+ });
107
+ if (!response.ok) {
108
+ const text = await response.text();
109
+ throw new Error(`Failed to refresh token (${response.status}): ${text}`);
110
+ }
111
+ const data = (await response.json());
112
+ return toTokenData(data);
113
+ }
114
+ function openBrowser(url) {
115
+ const cmd = process.platform === "darwin"
116
+ ? "open"
117
+ : process.platform === "win32"
118
+ ? "cmd"
119
+ : "xdg-open";
120
+ const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
121
+ (0, node_child_process_1.execFile)(cmd, args, (err) => {
122
+ if (err) {
123
+ process.stderr.write(`Could not open browser automatically. Open this URL manually:\n${url}\n`);
124
+ }
125
+ });
126
+ }
127
+ function performOAuthFlow(clientId) {
128
+ const { verifier, challenge } = generatePkcePair();
129
+ return new Promise((resolve, reject) => {
130
+ const server = (0, node_http_1.createServer)((req, res) => {
131
+ const url = new URL(req.url ?? "/", `http://localhost:${OAUTH_PORT}`);
132
+ if (url.pathname === "/callback") {
133
+ const code = url.searchParams.get("code");
134
+ const error = url.searchParams.get("error");
135
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
136
+ res.end(SUCCESS_HTML);
137
+ server.close();
138
+ clearTimeout(timeout);
139
+ if (error) {
140
+ reject(new Error(`OAuth error: ${error}`));
141
+ }
142
+ else if (code) {
143
+ resolve({ code, verifier });
144
+ }
145
+ else {
146
+ reject(new Error("No authorization code received in callback"));
147
+ }
148
+ }
149
+ else {
150
+ res.writeHead(404);
151
+ res.end("Not found");
152
+ }
153
+ });
154
+ const timeout = setTimeout(() => {
155
+ server.close();
156
+ reject(new Error("OAuth flow timed out (120s). Please try again."));
157
+ }, OAUTH_TIMEOUT_MS);
158
+ server.on("error", (err) => {
159
+ clearTimeout(timeout);
160
+ if (err.code === "EADDRINUSE") {
161
+ reject(new Error(`Port ${OAUTH_PORT} is already in use. Close the process occupying it and try again.`));
162
+ }
163
+ else {
164
+ reject(err);
165
+ }
166
+ });
167
+ server.listen(OAUTH_PORT, () => {
168
+ const authorizeUrl = `${OAUTH_AUTHORIZE_URL}?response_type=code&client_id=${encodeURIComponent(clientId)}&redirect_uri=${encodeURIComponent(REDIRECT_URI)}&code_challenge=${encodeURIComponent(challenge)}&code_challenge_method=S256`;
169
+ process.stderr.write("Opening browser for Yandex OAuth authorization...\n");
170
+ process.stderr.write(`If the browser didn't open, go to:\n${authorizeUrl}\n`);
171
+ openBrowser(authorizeUrl);
172
+ });
173
+ });
174
+ }
175
+ async function resolveToken(config) {
176
+ if (!config.forceAuth) {
177
+ const envToken = process.env.YANDEX_OAUTH_TOKEN;
178
+ if (envToken) {
179
+ return envToken;
180
+ }
181
+ const stored = await loadTokenFromFile();
182
+ if (stored) {
183
+ if (!isTokenExpired(stored)) {
184
+ return stored.access_token;
185
+ }
186
+ process.stderr.write("Token expired, attempting refresh...\n");
187
+ try {
188
+ const refreshed = await refreshAccessToken(stored.refresh_token, config.clientId);
189
+ await saveTokenToFile(refreshed);
190
+ return refreshed.access_token;
191
+ }
192
+ catch {
193
+ process.stderr.write("Refresh failed, starting OAuth flow...\n");
194
+ }
195
+ }
196
+ }
197
+ const { code, verifier } = await performOAuthFlow(config.clientId);
198
+ const tokenData = await exchangeCodeForToken(code, config.clientId, verifier);
199
+ await saveTokenToFile(tokenData);
200
+ process.stderr.write("Token saved successfully.\n");
201
+ return tokenData.access_token;
202
+ }
203
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,191 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
6
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
7
+ const node_http_1 = require("node:http");
8
+ const wiki_client_js_1 = require("./wiki-client.js");
9
+ const auth_js_1 = require("./auth.js");
10
+ const pages_js_1 = require("./tools/pages.js");
11
+ const resources_js_1 = require("./tools/resources.js");
12
+ const grids_js_1 = require("./tools/grids.js");
13
+ const DEFAULT_CLIENT_ID = "74e48aa0cc7c492b8a296c5d17f2cfd7";
14
+ const DEFAULT_HTTP_PORT = 3000;
15
+ const DEFAULT_HTTP_HOST = "0.0.0.0";
16
+ function parseArgs() {
17
+ const args = process.argv.slice(2);
18
+ let orgId;
19
+ let cloudOrgId;
20
+ let clientId = DEFAULT_CLIENT_ID;
21
+ let forceAuth = false;
22
+ let transport = "stdio";
23
+ let port = DEFAULT_HTTP_PORT;
24
+ let host = DEFAULT_HTTP_HOST;
25
+ let token;
26
+ for (let i = 0; i < args.length; i++) {
27
+ if (args[i] === "--org-id" && args[i + 1]) {
28
+ orgId = args[++i];
29
+ }
30
+ else if (args[i] === "--cloud-org-id" && args[i + 1]) {
31
+ cloudOrgId = args[++i];
32
+ }
33
+ else if (args[i] === "--client-id" && args[i + 1]) {
34
+ clientId = args[++i];
35
+ }
36
+ else if (args[i] === "--auth") {
37
+ forceAuth = true;
38
+ }
39
+ else if (args[i] === "--transport" && args[i + 1]) {
40
+ const value = args[++i];
41
+ if (value !== "stdio" && value !== "http") {
42
+ process.stderr.write(`Error: --transport must be "stdio" or "http", got "${value}".\n`);
43
+ process.exit(1);
44
+ }
45
+ transport = value;
46
+ }
47
+ else if (args[i] === "--port" && args[i + 1]) {
48
+ port = parseInt(args[++i], 10);
49
+ if (Number.isNaN(port) || port < 1 || port > 65535) {
50
+ process.stderr.write("Error: --port must be a valid port number (1-65535).\n");
51
+ process.exit(1);
52
+ }
53
+ }
54
+ else if (args[i] === "--host" && args[i + 1]) {
55
+ host = args[++i];
56
+ }
57
+ else if (args[i] === "--token" && args[i + 1]) {
58
+ token = args[++i];
59
+ }
60
+ }
61
+ return {
62
+ orgId,
63
+ cloudOrgId,
64
+ clientId,
65
+ forceAuth,
66
+ transport,
67
+ port,
68
+ host,
69
+ token,
70
+ };
71
+ }
72
+ function createConfiguredServer(client, config = {}) {
73
+ const server = new mcp_js_1.McpServer({
74
+ name: "yandex-wiki-mcp",
75
+ version: "0.1.0",
76
+ });
77
+ (0, pages_js_1.registerPageTools)(server, client, {
78
+ defaultParentSlug: config.defaultParentSlug,
79
+ });
80
+ (0, resources_js_1.registerResourceTools)(server, client);
81
+ (0, grids_js_1.registerGridTools)(server, client);
82
+ return server;
83
+ }
84
+ async function parseJsonBody(req) {
85
+ return new Promise((resolve, reject) => {
86
+ const chunks = [];
87
+ req.on("data", (chunk) => chunks.push(chunk));
88
+ req.on("end", () => {
89
+ try {
90
+ const body = JSON.parse(Buffer.concat(chunks).toString("utf-8"));
91
+ resolve(body);
92
+ }
93
+ catch {
94
+ reject(new Error("Invalid JSON body"));
95
+ }
96
+ });
97
+ req.on("error", reject);
98
+ });
99
+ }
100
+ function sendJsonError(res, status, code, message) {
101
+ res.writeHead(status, { "Content-Type": "application/json" });
102
+ res.end(JSON.stringify({ jsonrpc: "2.0", error: { code, message }, id: null }));
103
+ }
104
+ async function handleMcpRequest(req, res, transport) {
105
+ const parsedUrl = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
106
+ if (parsedUrl.pathname !== "/mcp") {
107
+ res.writeHead(404, { "Content-Type": "application/json" });
108
+ res.end(JSON.stringify({ error: "Not found" }));
109
+ return;
110
+ }
111
+ const method = req.method?.toUpperCase();
112
+ if (method === "POST") {
113
+ let body;
114
+ try {
115
+ body = await parseJsonBody(req);
116
+ }
117
+ catch {
118
+ sendJsonError(res, 400, -32700, "Parse error");
119
+ return;
120
+ }
121
+ await transport.handleRequest(req, res, body);
122
+ }
123
+ else if (method === "GET") {
124
+ await transport.handleRequest(req, res);
125
+ }
126
+ else if (method === "DELETE") {
127
+ await transport.handleRequest(req, res);
128
+ }
129
+ else {
130
+ res.writeHead(405, { "Content-Type": "application/json" });
131
+ res.end(JSON.stringify({ error: "Method not allowed" }));
132
+ }
133
+ }
134
+ async function startHttpServer(client, port, host, config) {
135
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
136
+ sessionIdGenerator: undefined,
137
+ });
138
+ const server = createConfiguredServer(client, config);
139
+ await server.connect(transport);
140
+ const httpServer = (0, node_http_1.createServer)((req, res) => {
141
+ handleMcpRequest(req, res, transport).catch((err) => {
142
+ process.stderr.write(`Unhandled error: ${err instanceof Error ? err.message : String(err)}\n`);
143
+ if (!res.headersSent) {
144
+ sendJsonError(res, 500, -32603, "Internal server error");
145
+ }
146
+ });
147
+ });
148
+ httpServer.listen(port, host, () => {
149
+ process.stderr.write(`MCP HTTP server listening on http://${host}:${port}/mcp\n`);
150
+ });
151
+ }
152
+ async function main() {
153
+ const { orgId: cliOrgId, cloudOrgId: cliCloudOrgId, clientId, forceAuth, transport, port, host, token: cliToken, } = parseArgs();
154
+ const orgId = cliOrgId ?? process.env.YANDEX_ORG_ID;
155
+ const cloudOrgId = cliCloudOrgId ?? process.env.YANDEX_CLOUD_ORG_ID;
156
+ if (orgId && cloudOrgId) {
157
+ process.stderr.write("Error: Specify either --org-id / YANDEX_ORG_ID or --cloud-org-id / YANDEX_CLOUD_ORG_ID, not both.\n");
158
+ process.exit(1);
159
+ }
160
+ if (!orgId && !cloudOrgId) {
161
+ process.stderr.write("Error: You must specify either --org-id <value> / YANDEX_ORG_ID or --cloud-org-id <value> / YANDEX_CLOUD_ORG_ID.\n");
162
+ process.exit(1);
163
+ }
164
+ let token;
165
+ if (cliToken) {
166
+ token = cliToken;
167
+ }
168
+ else {
169
+ token = await (0, auth_js_1.resolveToken)({ clientId, forceAuth });
170
+ }
171
+ if (forceAuth) {
172
+ process.stderr.write(`Token is stored in ~/.config/yandex-wiki-mcp/token.json. You can now start the server without --auth.\n`);
173
+ return;
174
+ }
175
+ const client = new wiki_client_js_1.WikiClient({ token, orgId, cloudOrgId });
176
+ const defaultParentSlug = process.env.WIKI_DEFAULT_PARENT_SLUG?.trim() || undefined;
177
+ const serverConfig = { defaultParentSlug };
178
+ if (transport === "http") {
179
+ await startHttpServer(client, port, host, serverConfig);
180
+ }
181
+ else {
182
+ const server = createConfiguredServer(client, serverConfig);
183
+ const stdioTransport = new stdio_js_1.StdioServerTransport();
184
+ await server.connect(stdioTransport);
185
+ }
186
+ }
187
+ main().catch((error) => {
188
+ process.stderr.write(`Fatal error: ${error instanceof Error ? error.message : String(error)}\n`);
189
+ process.exit(1);
190
+ });
191
+ //# 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,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { WikiClient } from "../wiki-client.js";
3
+ export declare function registerGridTools(server: McpServer, client: WikiClient): void;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerGridTools = registerGridTools;
4
+ const zod_1 = require("zod");
5
+ function registerGridTools(server, client) {
6
+ server.registerTool("get_page_grids", {
7
+ description: "List dynamic tables (grids) embedded on a Yandex Wiki page.",
8
+ inputSchema: zod_1.z.object({
9
+ pageId: zod_1.z.string().describe("Numeric page ID"),
10
+ }),
11
+ }, async ({ pageId }) => {
12
+ const result = await client.getPageGrids(pageId);
13
+ return {
14
+ content: [
15
+ { type: "text", text: JSON.stringify(result, null, 2) },
16
+ ],
17
+ };
18
+ });
19
+ server.registerTool("get_grid", {
20
+ description: "Get a Yandex Wiki dynamic table (grid) with its columns and rows.",
21
+ inputSchema: zod_1.z.object({
22
+ gridId: zod_1.z.string().describe("Grid ID"),
23
+ filter: zod_1.z
24
+ .string()
25
+ .optional()
26
+ .describe("Filter expression over rows (e.g. column slug + operator: '~', '=', '>', '<')"),
27
+ sort: zod_1.z.string().optional().describe("Sort expression"),
28
+ onlyCols: zod_1.z
29
+ .string()
30
+ .optional()
31
+ .describe("Comma-separated column slugs to include"),
32
+ onlyRows: zod_1.z
33
+ .string()
34
+ .optional()
35
+ .describe("Comma-separated row IDs to include"),
36
+ revision: zod_1.z
37
+ .string()
38
+ .optional()
39
+ .describe("Specific grid revision to fetch"),
40
+ }),
41
+ }, async ({ gridId, filter, sort, onlyCols, onlyRows, revision }) => {
42
+ const result = await client.getGrid(gridId, {
43
+ filter,
44
+ sort,
45
+ only_cols: onlyCols,
46
+ only_rows: onlyRows,
47
+ revision,
48
+ });
49
+ return {
50
+ content: [
51
+ { type: "text", text: JSON.stringify(result, null, 2) },
52
+ ],
53
+ };
54
+ });
55
+ }
56
+ //# sourceMappingURL=grids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grids.js","sourceRoot":"","sources":["../../src/tools/grids.ts"],"names":[],"mappings":";;AAIA,8CAkEC;AArED,6BAAwB;AAGxB,SAAgB,iBAAiB,CAC/B,MAAiB,EACjB,MAAkB;IAElB,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EACT,6DAA6D;QAC/D,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;SAC/C,CAAC;KACH,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACjD,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACjE;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,UAAU,EACV;QACE,WAAW,EACT,mEAAmE;QACrE,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;YACtC,MAAM,EAAE,OAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,+EAA+E,CAChF;YACH,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YACvD,QAAQ,EAAE,OAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,yCAAyC,CAAC;YACtD,QAAQ,EAAE,OAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,oCAAoC,CAAC;YACjD,QAAQ,EAAE,OAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,iCAAiC,CAAC;SAC/C,CAAC;KACH,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC/D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;YAC1C,MAAM;YACN,IAAI;YACJ,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,QAAQ;YACnB,QAAQ;SACT,CAAC,CAAC;QACH,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACjE;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { WikiClient } from "../wiki-client.js";
3
+ export interface PageToolsOptions {
4
+ defaultParentSlug?: string;
5
+ }
6
+ export declare function registerPageTools(server: McpServer, client: WikiClient, options?: PageToolsOptions): void;
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerPageTools = registerPageTools;
4
+ const zod_1 = require("zod");
5
+ const fieldsSchema = zod_1.z
6
+ .array(zod_1.z.enum(["attributes", "breadcrumbs", "content", "redirect"]))
7
+ .optional()
8
+ .describe("Which extra fields to include. Common: 'content' (Markdown body), 'attributes' (meta), 'breadcrumbs'.");
9
+ function registerPageTools(server, client, options = {}) {
10
+ const { defaultParentSlug } = options;
11
+ const parentDefaultNote = defaultParentSlug
12
+ ? ` Default parent slug is "${defaultParentSlug}" — when the user does not name a parent, OMIT this field and the server will use the default.`
13
+ : "";
14
+ server.registerTool("get_page", {
15
+ description: "Get a Yandex Wiki page by its slug (URL-friendly path, e.g. 'team/onboarding'). " +
16
+ "Returns title, Markdown content and metadata. Set fields=['content','attributes'] to include body and meta.",
17
+ inputSchema: zod_1.z.object({
18
+ slug: zod_1.z.string().describe("Page slug, e.g. 'team/onboarding'"),
19
+ fields: fieldsSchema,
20
+ }),
21
+ }, async ({ slug, fields }) => {
22
+ const page = await client.getPageBySlug(slug, fields);
23
+ return {
24
+ content: [{ type: "text", text: JSON.stringify(page, null, 2) }],
25
+ };
26
+ });
27
+ server.registerTool("get_page_by_id", {
28
+ description: "Get a Yandex Wiki page by its numeric ID. Returns title, Markdown content and metadata.",
29
+ inputSchema: zod_1.z.object({
30
+ pageId: zod_1.z.string().describe("Numeric page ID"),
31
+ fields: fieldsSchema,
32
+ }),
33
+ }, async ({ pageId, fields }) => {
34
+ const page = await client.getPageById(pageId, fields);
35
+ return {
36
+ content: [{ type: "text", text: JSON.stringify(page, null, 2) }],
37
+ };
38
+ });
39
+ server.registerTool("get_descendants", {
40
+ description: "List direct child pages by parent slug. Pass empty slug for root pages. Use cursor for pagination.",
41
+ inputSchema: zod_1.z.object({
42
+ slug: zod_1.z
43
+ .string()
44
+ .describe("Parent slug. Use empty string '' to list root pages."),
45
+ cursor: zod_1.z
46
+ .string()
47
+ .optional()
48
+ .describe("Pagination cursor from previous response (next_cursor)"),
49
+ pageSize: zod_1.z
50
+ .number()
51
+ .optional()
52
+ .describe("Page size, max 50"),
53
+ q: zod_1.z
54
+ .string()
55
+ .optional()
56
+ .describe("Filter descendants by title substring"),
57
+ }),
58
+ }, async ({ slug, cursor, pageSize, q }) => {
59
+ const result = await client.getDescendantsBySlug(slug, {
60
+ cursor,
61
+ page_size: pageSize,
62
+ q,
63
+ });
64
+ return {
65
+ content: [
66
+ { type: "text", text: JSON.stringify(result, null, 2) },
67
+ ],
68
+ };
69
+ });
70
+ server.registerTool("create_page", {
71
+ description: "Create a new Yandex Wiki page. Content is Markdown (Yandex Flavored Markdown). " +
72
+ "Specify the parent via parentSlug or parentId." +
73
+ parentDefaultNote,
74
+ inputSchema: zod_1.z.object({
75
+ title: zod_1.z.string().describe("Page title"),
76
+ content: zod_1.z
77
+ .string()
78
+ .optional()
79
+ .describe("Markdown body of the page"),
80
+ parentSlug: zod_1.z
81
+ .string()
82
+ .optional()
83
+ .describe(defaultParentSlug
84
+ ? `Parent page slug. Optional — defaults to "${defaultParentSlug}".`
85
+ : "Parent page slug (where to place the new page)"),
86
+ parentId: zod_1.z
87
+ .string()
88
+ .optional()
89
+ .describe("Parent page numeric ID (alternative to parentSlug)"),
90
+ slug: zod_1.z
91
+ .string()
92
+ .optional()
93
+ .describe("Custom slug segment for the new page. If omitted, derived from title."),
94
+ pageType: zod_1.z
95
+ .enum(["doc", "grid"])
96
+ .optional()
97
+ .describe("Page type. Default: 'doc' (Markdown document)."),
98
+ }),
99
+ }, async ({ title, content, parentSlug, parentId, slug, pageType }) => {
100
+ const params = { title };
101
+ if (content !== undefined)
102
+ params.content = content;
103
+ if (parentId) {
104
+ params.parent_id = parentId;
105
+ }
106
+ else if (parentSlug !== undefined) {
107
+ params.parent_slug = parentSlug;
108
+ }
109
+ else if (defaultParentSlug) {
110
+ params.parent_slug = defaultParentSlug;
111
+ }
112
+ if (slug)
113
+ params.slug = slug;
114
+ if (pageType)
115
+ params.page_type = pageType;
116
+ const page = await client.createPage(params);
117
+ return {
118
+ content: [{ type: "text", text: JSON.stringify(page, null, 2) }],
119
+ };
120
+ });
121
+ server.registerTool("update_page", {
122
+ description: "Update an existing Yandex Wiki page. Pass only fields you want to change. " +
123
+ "Content is full Markdown body (replaces existing).",
124
+ inputSchema: zod_1.z.object({
125
+ pageId: zod_1.z.string().describe("Numeric page ID to update"),
126
+ title: zod_1.z.string().optional().describe("New page title"),
127
+ content: zod_1.z.string().optional().describe("New Markdown body (replaces existing)"),
128
+ }),
129
+ }, async ({ pageId, title, content }) => {
130
+ const params = {};
131
+ if (title !== undefined)
132
+ params.title = title;
133
+ if (content !== undefined)
134
+ params.content = content;
135
+ const page = await client.updatePage(pageId, params);
136
+ return {
137
+ content: [{ type: "text", text: JSON.stringify(page, null, 2) }],
138
+ };
139
+ });
140
+ server.registerTool("move_page", {
141
+ description: "Move a Yandex Wiki page to a new parent and/or rename its slug.",
142
+ inputSchema: zod_1.z.object({
143
+ pageId: zod_1.z.string().describe("Numeric page ID to move"),
144
+ newParentSlug: zod_1.z.string().optional().describe("New parent slug"),
145
+ newParentId: zod_1.z.string().optional().describe("New parent numeric ID"),
146
+ newSlug: zod_1.z.string().optional().describe("New slug segment for the page"),
147
+ }),
148
+ }, async ({ pageId, newParentSlug, newParentId, newSlug }) => {
149
+ const params = {};
150
+ if (newParentId)
151
+ params.new_parent_id = newParentId;
152
+ else if (newParentSlug !== undefined)
153
+ params.new_parent_slug = newParentSlug;
154
+ if (newSlug)
155
+ params.new_slug = newSlug;
156
+ const page = await client.movePage(pageId, params);
157
+ return {
158
+ content: [{ type: "text", text: JSON.stringify(page, null, 2) }],
159
+ };
160
+ });
161
+ }
162
+ //# sourceMappingURL=pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/tools/pages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { WikiClient } from "../wiki-client.js";
3
+ export declare function registerResourceTools(server: McpServer, client: WikiClient): void;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerResourceTools = registerResourceTools;
4
+ const zod_1 = require("zod");
5
+ function registerResourceTools(server, client) {
6
+ server.registerTool("get_page_resources", {
7
+ description: "List resources attached to a Yandex Wiki page (attachments, SharePoint docs, grids).",
8
+ inputSchema: zod_1.z.object({
9
+ pageId: zod_1.z.string().describe("Numeric page ID"),
10
+ types: zod_1.z
11
+ .string()
12
+ .optional()
13
+ .describe("Comma-separated resource types to include: 'attachment', 'sharepoint', 'grid'"),
14
+ q: zod_1.z.string().optional().describe("Filter resources by name substring"),
15
+ orderBy: zod_1.z
16
+ .string()
17
+ .optional()
18
+ .describe("Sort field, e.g. 'created_at'"),
19
+ orderDirection: zod_1.z.enum(["asc", "desc"]).optional(),
20
+ cursor: zod_1.z.string().optional().describe("Pagination cursor"),
21
+ pageSize: zod_1.z.number().optional().describe("Page size, max 50"),
22
+ }),
23
+ }, async ({ pageId, types, q, orderBy, orderDirection, cursor, pageSize }) => {
24
+ const result = await client.getPageResources(pageId, {
25
+ types,
26
+ q,
27
+ order_by: orderBy,
28
+ order_direction: orderDirection,
29
+ cursor,
30
+ page_size: pageSize,
31
+ });
32
+ return {
33
+ content: [
34
+ { type: "text", text: JSON.stringify(result, null, 2) },
35
+ ],
36
+ };
37
+ });
38
+ }
39
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/tools/resources.ts"],"names":[],"mappings":";;AAIA,sDA2CC;AA9CD,6BAAwB;AAGxB,SAAgB,qBAAqB,CACnC,MAAiB,EACjB,MAAkB;IAElB,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,WAAW,EACT,sFAAsF;QACxF,WAAW,EAAE,OAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAC9C,KAAK,EAAE,OAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,+EAA+E,CAChF;YACH,CAAC,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YACvE,OAAO,EAAE,OAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,+BAA+B,CAAC;YAC5C,cAAc,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;YAClD,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAC3D,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SAC9D,CAAC;KACH,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;QACxE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE;YACnD,KAAK;YACL,CAAC;YACD,QAAQ,EAAE,OAAO;YACjB,eAAe,EAAE,cAAc;YAC/B,MAAM;YACN,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;QACH,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACjE;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,106 @@
1
+ export interface WikiClientConfig {
2
+ token: string;
3
+ orgId?: string;
4
+ cloudOrgId?: string;
5
+ }
6
+ export interface TokenData {
7
+ access_token: string;
8
+ refresh_token: string;
9
+ expires_at: number;
10
+ }
11
+ export interface YandexTokenResponse {
12
+ access_token: string;
13
+ refresh_token: string;
14
+ token_type: string;
15
+ expires_in: number;
16
+ }
17
+ export interface AuthConfig {
18
+ clientId: string;
19
+ forceAuth: boolean;
20
+ }
21
+ export type WikiPageType = "doc" | "grid";
22
+ export interface WikiPageAttributes {
23
+ comments_count?: number;
24
+ comments_enabled?: boolean;
25
+ created_at?: string;
26
+ modified_at?: string;
27
+ lang?: string;
28
+ is_readonly?: boolean;
29
+ is_collaborative?: boolean;
30
+ is_draft?: boolean;
31
+ [key: string]: unknown;
32
+ }
33
+ export interface WikiPage {
34
+ id: string;
35
+ page_type?: WikiPageType | string;
36
+ slug?: string;
37
+ title?: string;
38
+ content?: string;
39
+ attributes?: WikiPageAttributes;
40
+ redirect?: unknown;
41
+ [key: string]: unknown;
42
+ }
43
+ export interface WikiDescendantsResponse {
44
+ pages?: WikiPage[];
45
+ next_cursor?: string | null;
46
+ prev_cursor?: string | null;
47
+ [key: string]: unknown;
48
+ }
49
+ export interface WikiResource {
50
+ type: string;
51
+ id: string;
52
+ name?: string;
53
+ title?: string;
54
+ size?: number;
55
+ mimetype?: string;
56
+ download_url?: string;
57
+ created_at?: string;
58
+ has_preview?: boolean;
59
+ [key: string]: unknown;
60
+ }
61
+ export interface WikiResourcesResponse {
62
+ resources?: WikiResource[];
63
+ next_cursor?: string | null;
64
+ prev_cursor?: string | null;
65
+ [key: string]: unknown;
66
+ }
67
+ export interface WikiGridColumn {
68
+ slug: string;
69
+ title?: string;
70
+ type?: string;
71
+ [key: string]: unknown;
72
+ }
73
+ export interface WikiGridRow {
74
+ id: string;
75
+ cells: Record<string, {
76
+ value: unknown;
77
+ } | unknown>;
78
+ [key: string]: unknown;
79
+ }
80
+ export interface WikiGrid {
81
+ id: string;
82
+ title?: string;
83
+ revision?: string;
84
+ rich_text_format?: boolean;
85
+ structure?: WikiGridColumn[];
86
+ rows?: WikiGridRow[];
87
+ [key: string]: unknown;
88
+ }
89
+ export interface CreatePageParams {
90
+ title: string;
91
+ content?: string;
92
+ parent_slug?: string;
93
+ parent_id?: string;
94
+ slug?: string;
95
+ page_type?: WikiPageType;
96
+ }
97
+ export interface UpdatePageParams {
98
+ title?: string;
99
+ content?: string;
100
+ }
101
+ export interface MovePageParams {
102
+ new_parent_slug?: string;
103
+ new_parent_id?: string;
104
+ new_slug?: string;
105
+ }
106
+ export type FieldsParam = "attributes" | "breadcrumbs" | "content" | "redirect";
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import type { WikiClientConfig, WikiPage, WikiDescendantsResponse, WikiResourcesResponse, WikiGrid, CreatePageParams, UpdatePageParams, MovePageParams } from "./types.js";
2
+ export interface DescendantsQuery {
3
+ cursor?: string;
4
+ page_size?: number;
5
+ q?: string;
6
+ }
7
+ export interface ResourcesQuery {
8
+ types?: string;
9
+ q?: string;
10
+ order_by?: string;
11
+ order_direction?: "asc" | "desc";
12
+ cursor?: string;
13
+ page_size?: number;
14
+ }
15
+ export interface GridQuery {
16
+ filter?: string;
17
+ sort?: string;
18
+ only_cols?: string;
19
+ only_rows?: string;
20
+ revision?: string;
21
+ }
22
+ export declare class WikiClient {
23
+ private readonly token;
24
+ private readonly orgHeader;
25
+ constructor(config: WikiClientConfig);
26
+ private request;
27
+ getPageBySlug(slug: string, fields?: string[]): Promise<WikiPage>;
28
+ getPageById(pageId: string, fields?: string[]): Promise<WikiPage>;
29
+ getDescendantsBySlug(slug: string, opts?: DescendantsQuery): Promise<WikiDescendantsResponse>;
30
+ getDescendantsById(pageId: string, opts?: DescendantsQuery): Promise<WikiDescendantsResponse>;
31
+ createPage(params: CreatePageParams): Promise<WikiPage>;
32
+ updatePage(pageId: string, params: UpdatePageParams): Promise<WikiPage>;
33
+ movePage(pageId: string, params: MovePageParams): Promise<WikiPage>;
34
+ getPageResources(pageId: string, opts?: ResourcesQuery): Promise<WikiResourcesResponse>;
35
+ getPageGrids(pageId: string): Promise<unknown>;
36
+ getGrid(gridId: string, opts?: GridQuery): Promise<WikiGrid>;
37
+ }
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WikiClient = void 0;
4
+ const BASE_URL = "https://api.wiki.yandex.net/v1";
5
+ function buildQuery(params) {
6
+ const parts = [];
7
+ for (const [key, value] of Object.entries(params)) {
8
+ if (value === undefined || value === null || value === "")
9
+ continue;
10
+ parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);
11
+ }
12
+ return parts.length > 0 ? `?${parts.join("&")}` : "";
13
+ }
14
+ class WikiClient {
15
+ token;
16
+ orgHeader;
17
+ constructor(config) {
18
+ this.token = config.token;
19
+ if (config.orgId) {
20
+ this.orgHeader = { "X-Org-ID": config.orgId };
21
+ }
22
+ else if (config.cloudOrgId) {
23
+ this.orgHeader = { "X-Cloud-Org-ID": config.cloudOrgId };
24
+ }
25
+ else {
26
+ throw new Error("Either orgId or cloudOrgId must be provided");
27
+ }
28
+ }
29
+ async request(method, path, body) {
30
+ const url = `${BASE_URL}${path}`;
31
+ const headers = {
32
+ Authorization: `OAuth ${this.token}`,
33
+ ...this.orgHeader,
34
+ "Content-Type": "application/json",
35
+ };
36
+ const response = await fetch(url, {
37
+ method,
38
+ headers,
39
+ body: body !== undefined ? JSON.stringify(body) : undefined,
40
+ });
41
+ if (!response.ok) {
42
+ const errorBody = await response.text();
43
+ const sentBody = body !== undefined ? JSON.stringify(body) : "";
44
+ const sentSuffix = sentBody ? ` | request body: ${sentBody}` : "";
45
+ throw new Error(`Wiki API error ${response.status} on ${method} ${path}: ${errorBody}${sentSuffix}`);
46
+ }
47
+ // Some endpoints (e.g. PATCH) may return an empty body
48
+ const text = await response.text();
49
+ if (!text) {
50
+ return undefined;
51
+ }
52
+ return JSON.parse(text);
53
+ }
54
+ async getPageBySlug(slug, fields) {
55
+ const query = buildQuery({
56
+ slug,
57
+ fields: fields && fields.length > 0 ? fields.join(",") : undefined,
58
+ });
59
+ return this.request("GET", `/pages${query}`);
60
+ }
61
+ async getPageById(pageId, fields) {
62
+ const query = buildQuery({
63
+ fields: fields && fields.length > 0 ? fields.join(",") : undefined,
64
+ });
65
+ return this.request("GET", `/pages/${encodeURIComponent(pageId)}${query}`);
66
+ }
67
+ async getDescendantsBySlug(slug, opts = {}) {
68
+ const query = buildQuery({ slug, ...opts });
69
+ return this.request("GET", `/pages/descendants${query}`);
70
+ }
71
+ async getDescendantsById(pageId, opts = {}) {
72
+ const query = buildQuery({ ...opts });
73
+ return this.request("GET", `/pages/${encodeURIComponent(pageId)}/descendants${query}`);
74
+ }
75
+ async createPage(params) {
76
+ return this.request("POST", `/pages`, params);
77
+ }
78
+ async updatePage(pageId, params) {
79
+ return this.request("PATCH", `/pages/${encodeURIComponent(pageId)}`, params);
80
+ }
81
+ async movePage(pageId, params) {
82
+ return this.request("POST", `/pages/${encodeURIComponent(pageId)}/move`, params);
83
+ }
84
+ async getPageResources(pageId, opts = {}) {
85
+ const query = buildQuery({ ...opts });
86
+ return this.request("GET", `/pages/${encodeURIComponent(pageId)}/resources${query}`);
87
+ }
88
+ async getPageGrids(pageId) {
89
+ return this.request("GET", `/pages/${encodeURIComponent(pageId)}/grids`);
90
+ }
91
+ async getGrid(gridId, opts = {}) {
92
+ const query = buildQuery({ ...opts });
93
+ return this.request("GET", `/grids/${encodeURIComponent(gridId)}${query}`);
94
+ }
95
+ }
96
+ exports.WikiClient = WikiClient;
97
+ //# sourceMappingURL=wiki-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-client.js","sourceRoot":"","sources":["../src/wiki-client.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "yandex-wiki-mcp",
3
+ "author": "Brekhov Ilya",
4
+ "version": "0.1.0",
5
+ "description": "MCP server for Yandex Wiki API — read, create and edit wiki pages",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "yandex-wiki-mcp": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "packageManager": "yarn@1.22.22",
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "prepublishOnly": "yarn build"
17
+ },
18
+ "keywords": [
19
+ "mcp",
20
+ "yandex",
21
+ "wiki",
22
+ "yandex-wiki",
23
+ "model-context-protocol"
24
+ ],
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/brekhov-ilya/yandex-wiki-mcp.git"
28
+ },
29
+ "bugs": {
30
+ "url": "https://github.com/brekhov-ilya/yandex-wiki-mcp/issues"
31
+ },
32
+ "homepage": "https://github.com/brekhov-ilya/yandex-wiki-mcp#readme",
33
+ "engines": {
34
+ "node": ">=18"
35
+ },
36
+ "license": "MIT",
37
+ "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^1.27.1",
39
+ "zod": "^3.25.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^22.0.0",
43
+ "typescript": "^5.8.0"
44
+ }
45
+ }