schemeog-mcp 3.4.0 → 3.6.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.
Files changed (2) hide show
  1. package/index.js +359 -10
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * SchemeOG MCP Server v2.9.3
4
+ * SchemeOG MCP Server v3.0.0
5
5
  *
6
- * MCP сервер для работы со схемами, проектами и тегами в SchemeOG Cloud.
6
+ * MCP сервер для работы со схемами, проектами, тегами и версиями в SchemeOG Cloud.
7
7
  *
8
8
  * Команды для схем:
9
9
  * - list_schemas: Список всех схем
@@ -29,6 +29,12 @@
29
29
  * - add_tag: Добавить тег в схему
30
30
  * - remove_tag: Удалить тег из схемы
31
31
  * - tag_element: Присвоить/убрать тег с элемента
32
+ *
33
+ * Команды для версий (история):
34
+ * - list_versions: Список версий схемы
35
+ * - get_version: Получить данные конкретной версии
36
+ * - restore_version: Восстановить схему из версии
37
+ * - create_version: Создать ручную версию (checkpoint)
32
38
  */
33
39
 
34
40
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
@@ -1131,6 +1137,10 @@ Claude урезает большие параметры, но file_path чита
1131
1137
  - "full" (по умолчанию) — полный экспорт с метаданными
1132
1138
  - "compact" — только elements, connections, tagsDictionary
1133
1139
  - "elements_only" — только массив elements (с connections внутри)
1140
+ - file_path: Путь для сохранения JSON файла (опционально)
1141
+ - Если указан — JSON сохраняется в файл, возвращается только путь и статистика
1142
+ - Если не указан — JSON возвращается в ответе (как раньше)
1143
+ - РЕКОМЕНДУЕТСЯ для больших схем (>20 элементов) — экономит токены!
1134
1144
 
1135
1145
  Пример ответа (format: "full"):
1136
1146
  {
@@ -1158,6 +1168,141 @@ Claude урезает большие параметры, но file_path чита
1158
1168
  enum: ["full", "compact", "elements_only"],
1159
1169
  description: "Формат экспорта: full (с метаданными), compact (только данные), elements_only (только элементы)",
1160
1170
  },
1171
+ file_path: {
1172
+ type: "string",
1173
+ description: "Путь для сохранения JSON файла. Если указан — JSON сохраняется в файл, Claude получает только путь (экономит токены!)",
1174
+ },
1175
+ },
1176
+ required: ["schema_id"],
1177
+ },
1178
+ },
1179
+
1180
+ // ========== ВЕРСИИ ==========
1181
+ {
1182
+ name: "list_versions",
1183
+ description: `Получить список версий (истории) схемы.
1184
+
1185
+ Возвращает список всех сохранённых версий схемы — как автоматических (автосохранение),
1186
+ так и ручных (созданных пользователем).
1187
+
1188
+ Каждая версия содержит:
1189
+ - id: уникальный ID версии
1190
+ - versionNumber: номер версии (1, 2, 3...)
1191
+ - createdAt: дата создания
1192
+ - isManual: true если создана вручную, false если автосохранение
1193
+ - comment: комментарий (только для ручных версий)
1194
+ - elementsCount: количество элементов в этой версии
1195
+
1196
+ Используй для:
1197
+ - Просмотра истории изменений схемы
1198
+ - Поиска версии для восстановления
1199
+ - Аудита изменений`,
1200
+ inputSchema: {
1201
+ type: "object",
1202
+ properties: {
1203
+ schema_id: {
1204
+ type: "string",
1205
+ description: "ID схемы",
1206
+ },
1207
+ limit: {
1208
+ type: "number",
1209
+ description: "Максимальное количество версий (по умолчанию 50, максимум 100)",
1210
+ },
1211
+ offset: {
1212
+ type: "number",
1213
+ description: "Смещение для пагинации (по умолчанию 0)",
1214
+ },
1215
+ },
1216
+ required: ["schema_id"],
1217
+ },
1218
+ },
1219
+ {
1220
+ name: "get_version",
1221
+ description: `Получить данные конкретной версии схемы.
1222
+
1223
+ Возвращает полные данные версии, включая:
1224
+ - Все элементы на момент создания версии
1225
+ - Все связи
1226
+ - Viewport (позиция камеры)
1227
+ - Метаданные (дата, автор, комментарий)
1228
+
1229
+ Используй для:
1230
+ - Просмотра содержимого конкретной версии перед восстановлением
1231
+ - Сравнения версий
1232
+ - Анализа изменений`,
1233
+ inputSchema: {
1234
+ type: "object",
1235
+ properties: {
1236
+ schema_id: {
1237
+ type: "string",
1238
+ description: "ID схемы",
1239
+ },
1240
+ version_id: {
1241
+ type: "string",
1242
+ description: "ID версии",
1243
+ },
1244
+ },
1245
+ required: ["schema_id", "version_id"],
1246
+ },
1247
+ },
1248
+ {
1249
+ name: "restore_version",
1250
+ description: `Восстановить схему из указанной версии.
1251
+
1252
+ ⚠️ ВАЖНО: Перед восстановлением автоматически создаётся резервная копия текущего состояния!
1253
+
1254
+ Процесс:
1255
+ 1. Создаётся версия с текущим состоянием схемы (как backup)
1256
+ 2. Данные схемы заменяются на данные из выбранной версии
1257
+ 3. Позиция камеры (viewport) также восстанавливается
1258
+
1259
+ Используй когда нужно:
1260
+ - Откатить нежелательные изменения
1261
+ - Восстановить случайно удалённые элементы
1262
+ - Вернуться к предыдущей версии схемы`,
1263
+ inputSchema: {
1264
+ type: "object",
1265
+ properties: {
1266
+ schema_id: {
1267
+ type: "string",
1268
+ description: "ID схемы",
1269
+ },
1270
+ version_id: {
1271
+ type: "string",
1272
+ description: "ID версии для восстановления",
1273
+ },
1274
+ },
1275
+ required: ["schema_id", "version_id"],
1276
+ },
1277
+ },
1278
+ {
1279
+ name: "create_version",
1280
+ description: `Создать ручную версию (checkpoint) схемы.
1281
+
1282
+ Используй для создания именованной точки восстановления перед важными изменениями.
1283
+
1284
+ Параметры:
1285
+ - schema_id: ID схемы (обязательно)
1286
+ - comment: комментарий к версии (опционально, рекомендуется)
1287
+
1288
+ Примеры комментариев:
1289
+ - "Перед рефакторингом структуры"
1290
+ - "Стабильная версия v1.0"
1291
+ - "До добавления новых экранов"
1292
+
1293
+ Автоматические версии создаются при каждом сохранении схемы.
1294
+ Ручные версии отмечаются специальным флагом и не удаляются при очистке старых автосохранений.`,
1295
+ inputSchema: {
1296
+ type: "object",
1297
+ properties: {
1298
+ schema_id: {
1299
+ type: "string",
1300
+ description: "ID схемы",
1301
+ },
1302
+ comment: {
1303
+ type: "string",
1304
+ description: "Комментарий к версии (опционально, но рекомендуется)",
1305
+ },
1161
1306
  },
1162
1307
  required: ["schema_id"],
1163
1308
  },
@@ -2197,7 +2342,7 @@ URL: ${API_BASE_URL}/canvas?schema=${result.schema.id}${warningsText}`,
2197
2342
  }
2198
2343
 
2199
2344
  case "export_schema_to_json": {
2200
- const { schema_id, format = "full" } = args;
2345
+ const { schema_id, format = "full", file_path } = args;
2201
2346
 
2202
2347
  // Получаем схему
2203
2348
  const result = await apiRequest(`/schemas/${schema_id}`);
@@ -2208,7 +2353,6 @@ URL: ${API_BASE_URL}/canvas?schema=${result.schema.id}${warningsText}`,
2208
2353
  const tagsDictionary = schema.data?.tagsDictionary || [];
2209
2354
 
2210
2355
  let exportData;
2211
- let exportText;
2212
2356
 
2213
2357
  switch (format) {
2214
2358
  case "compact":
@@ -2220,7 +2364,6 @@ URL: ${API_BASE_URL}/canvas?schema=${result.schema.id}${warningsText}`,
2220
2364
  connections,
2221
2365
  tagsDictionary,
2222
2366
  };
2223
- exportText = `Компактный экспорт схемы "${schema.name}":\n\n\`\`\`json\n${JSON.stringify(exportData, null, 2)}\n\`\`\``;
2224
2367
  break;
2225
2368
 
2226
2369
  case "elements_only":
@@ -2242,7 +2385,6 @@ URL: ${API_BASE_URL}/canvas?schema=${result.schema.id}${warningsText}`,
2242
2385
  if (tagsDictionary.length > 0) {
2243
2386
  exportData.tagsDictionary = tagsDictionary;
2244
2387
  }
2245
- exportText = `Элементы схемы "${schema.name}" (локальный формат):\n\n\`\`\`json\n${JSON.stringify(exportData, null, 2)}\n\`\`\``;
2246
2388
  break;
2247
2389
 
2248
2390
  case "full":
@@ -2262,10 +2404,52 @@ URL: ${API_BASE_URL}/canvas?schema=${result.schema.id}${warningsText}`,
2262
2404
  tagsDictionary,
2263
2405
  },
2264
2406
  };
2265
- exportText = `Полный экспорт схемы "${schema.name}":\n\n\`\`\`json\n${JSON.stringify(exportData, null, 2)}\n\`\`\``;
2266
2407
  break;
2267
2408
  }
2268
2409
 
2410
+ // Если указан file_path — сохраняем в файл
2411
+ if (file_path) {
2412
+ const fs = require('fs');
2413
+ const path = require('path');
2414
+
2415
+ // Создаём директорию если не существует
2416
+ const dir = path.dirname(file_path);
2417
+ if (!fs.existsSync(dir)) {
2418
+ fs.mkdirSync(dir, { recursive: true });
2419
+ }
2420
+
2421
+ // Сохраняем JSON в файл
2422
+ const jsonContent = JSON.stringify(exportData, null, 2);
2423
+ fs.writeFileSync(file_path, jsonContent, 'utf8');
2424
+
2425
+ const fileSizeKB = Math.round(jsonContent.length / 1024);
2426
+
2427
+ return {
2428
+ content: [{
2429
+ type: "text",
2430
+ text: `✅ Схема "${schema.name}" экспортирована в файл!
2431
+
2432
+ 📁 Путь: ${file_path}
2433
+ 📊 Размер: ${fileSizeKB}KB
2434
+
2435
+ Статистика:
2436
+ • Элементов: ${elements.length}
2437
+ • Связей: ${connections.length}
2438
+ • Тегов: ${tagsDictionary.length}
2439
+
2440
+ Используй Read tool чтобы прочитать файл, или import_schema_from_json с file_path для импорта в другую схему.`,
2441
+ }],
2442
+ };
2443
+ }
2444
+
2445
+ // Без file_path — возвращаем JSON в ответе (как раньше)
2446
+ const formatNames = {
2447
+ full: "Полный экспорт",
2448
+ compact: "Компактный экспорт",
2449
+ elements_only: "Элементы"
2450
+ };
2451
+ const exportText = `${formatNames[format] || "Экспорт"} схемы "${schema.name}":\n\n\`\`\`json\n${JSON.stringify(exportData, null, 2)}\n\`\`\``;
2452
+
2269
2453
  return {
2270
2454
  content: [{
2271
2455
  type: "text",
@@ -2278,13 +2462,178 @@ URL: ${API_BASE_URL}/canvas?schema=${result.schema.id}${warningsText}`,
2278
2462
  • Тегов: ${tagsDictionary.length}
2279
2463
 
2280
2464
  Этот JSON можно:
2281
- • Сохранить в файл
2465
+ • Сохранить в файл (укажи file_path в следующий раз!)
2282
2466
  • Импортировать через import_schema_from_json
2283
2467
  • Передать в другую систему`,
2284
2468
  }],
2285
2469
  };
2286
2470
  }
2287
2471
 
2472
+ // ========== ВЕРСИИ ==========
2473
+ case "list_versions": {
2474
+ const { schema_id, limit = 50, offset = 0 } = args;
2475
+
2476
+ const result = await apiRequest(`/schemas/${schema_id}/versions?limit=${Math.min(limit, 100)}&offset=${offset}`);
2477
+
2478
+ if (!result.versions || result.versions.length === 0) {
2479
+ return {
2480
+ content: [{
2481
+ type: "text",
2482
+ text: `История схемы пуста.
2483
+
2484
+ Версии создаются автоматически при каждом сохранении схемы.
2485
+ Также можно создать ручную версию (checkpoint) с помощью create_version.`,
2486
+ }],
2487
+ };
2488
+ }
2489
+
2490
+ const versionsList = result.versions.map(v => {
2491
+ const date = new Date(v.createdAt);
2492
+ const dateStr = date.toLocaleDateString('ru-RU');
2493
+ const timeStr = date.toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' });
2494
+ const typeLabel = v.isManual ? '📌 Ручная' : '⏱️ Авто';
2495
+ const commentText = v.comment ? ` — "${v.comment}"` : '';
2496
+ return `#${v.versionNumber} | ${dateStr} ${timeStr} | ${typeLabel} | ${v.elementsCount} элем.${commentText}\n ID: ${v.id}`;
2497
+ });
2498
+
2499
+ return {
2500
+ content: [{
2501
+ type: "text",
2502
+ text: `📜 История схемы (${result.versions.length} из ${result.total} версий)
2503
+
2504
+ ${versionsList.join('\n\n')}
2505
+
2506
+ ${result.hasMore ? `\n⏩ Есть ещё версии. Используй offset=${offset + result.versions.length} для продолжения.` : ''}
2507
+
2508
+ Команды:
2509
+ • get_version — посмотреть содержимое версии
2510
+ • restore_version — восстановить схему из версии
2511
+ • create_version — создать ручную версию (checkpoint)`,
2512
+ }],
2513
+ };
2514
+ }
2515
+
2516
+ case "get_version": {
2517
+ const { schema_id, version_id } = args;
2518
+
2519
+ const result = await apiRequest(`/schemas/${schema_id}/versions/${version_id}`);
2520
+ const version = result.version;
2521
+
2522
+ // Парсим данные версии
2523
+ let versionData = {};
2524
+ try {
2525
+ versionData = JSON.parse(version.data);
2526
+ } catch (e) {
2527
+ versionData = { elements: [], connections: [] };
2528
+ }
2529
+
2530
+ const elementsCount = versionData.elements?.length || 0;
2531
+ const connectionsCount = versionData.connections?.length || 0;
2532
+ const dataSize = version.data?.length || 0;
2533
+ const isLargeVersion = dataSize > 50000 || elementsCount > 100;
2534
+
2535
+ const date = new Date(version.createdAt);
2536
+ const dateStr = date.toLocaleDateString('ru-RU');
2537
+ const timeStr = date.toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' });
2538
+ const typeLabel = version.isManual ? '📌 Ручная версия' : '⏱️ Автосохранение';
2539
+
2540
+ let elementsText;
2541
+ if (isLargeVersion) {
2542
+ const previewElements = (versionData.elements || []).slice(0, 5);
2543
+ elementsText = `⚠️ Большая версия: ${elementsCount} элементов, ~${Math.round(dataSize / 1024)}KB
2544
+
2545
+ Первые 5 элементов:
2546
+ ${JSON.stringify(previewElements, null, 2)}`;
2547
+ } else {
2548
+ elementsText = JSON.stringify(versionData.elements || [], null, 2);
2549
+ }
2550
+
2551
+ return {
2552
+ content: [{
2553
+ type: "text",
2554
+ text: `📋 Версия #${version.versionNumber}
2555
+
2556
+ ID версии: ${version.id}
2557
+ Тип: ${typeLabel}
2558
+ Дата: ${dateStr} ${timeStr}
2559
+ ${version.comment ? `Комментарий: "${version.comment}"` : ''}
2560
+
2561
+ Статистика:
2562
+ • Элементов: ${elementsCount}
2563
+ • Связей: ${connectionsCount}
2564
+ • Размер: ~${Math.round(dataSize / 1024)}KB
2565
+
2566
+ Элементы:
2567
+ ${elementsText}
2568
+
2569
+ Команды:
2570
+ • restore_version — восстановить схему из этой версии
2571
+ • list_versions — вернуться к списку версий`,
2572
+ }],
2573
+ };
2574
+ }
2575
+
2576
+ case "restore_version": {
2577
+ const { schema_id, version_id } = args;
2578
+
2579
+ const result = await apiRequest(`/schemas/${schema_id}/versions/${version_id}/restore`, {
2580
+ method: "POST",
2581
+ });
2582
+
2583
+ const restored = result.restoredVersion;
2584
+ const date = new Date(restored.createdAt);
2585
+ const dateStr = date.toLocaleDateString('ru-RU');
2586
+ const timeStr = date.toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' });
2587
+
2588
+ return {
2589
+ content: [{
2590
+ type: "text",
2591
+ text: `✅ Схема восстановлена!
2592
+
2593
+ Восстановлено из версии #${restored.versionNumber}
2594
+ Дата версии: ${dateStr} ${timeStr}
2595
+
2596
+ ⚠️ Перед восстановлением была автоматически создана резервная копия текущего состояния.
2597
+
2598
+ URL: ${API_BASE_URL}/canvas?schema=${schema_id}
2599
+
2600
+ Совет: используй list_versions чтобы увидеть обновлённую историю.`,
2601
+ }],
2602
+ };
2603
+ }
2604
+
2605
+ case "create_version": {
2606
+ const { schema_id, comment } = args;
2607
+
2608
+ const result = await apiRequest(`/schemas/${schema_id}/versions`, {
2609
+ method: "POST",
2610
+ body: JSON.stringify({
2611
+ isManual: true,
2612
+ comment: comment || null,
2613
+ }),
2614
+ });
2615
+
2616
+ const version = result.version;
2617
+ const date = new Date(version.createdAt);
2618
+ const dateStr = date.toLocaleDateString('ru-RU');
2619
+ const timeStr = date.toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' });
2620
+
2621
+ return {
2622
+ content: [{
2623
+ type: "text",
2624
+ text: `✅ Ручная версия создана!
2625
+
2626
+ Версия: #${version.versionNumber}
2627
+ Дата: ${dateStr} ${timeStr}
2628
+ ${version.comment ? `Комментарий: "${version.comment}"` : ''}
2629
+
2630
+ 📌 Ручные версии не удаляются при очистке старых автосохранений.
2631
+
2632
+ Используй restore_version чтобы восстановить схему из этой версии в будущем.`,
2633
+ }],
2634
+ };
2635
+ }
2636
+
2288
2637
  default:
2289
2638
  throw new Error(`Неизвестная команда: ${name}`);
2290
2639
  }
@@ -2323,7 +2672,7 @@ async function main() {
2323
2672
  const server = new Server(
2324
2673
  {
2325
2674
  name: "schemeog-mcp",
2326
- version: "2.9.3",
2675
+ version: "3.0.0",
2327
2676
  },
2328
2677
  {
2329
2678
  capabilities: {
@@ -2353,7 +2702,7 @@ async function main() {
2353
2702
  const transport = new StdioServerTransport();
2354
2703
  await server.connect(transport);
2355
2704
 
2356
- console.error("SchemeOG MCP Server v2.9.3 запущен");
2705
+ console.error("SchemeOG MCP Server v3.0.0 запущен");
2357
2706
  }
2358
2707
 
2359
2708
  main().catch(console.error);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "schemeog-mcp",
3
- "version": "3.4.0",
3
+ "version": "3.6.0",
4
4
  "description": "MCP Server for Diagrams.love - Create and manage visual diagrams and flowcharts with AI assistance",
5
5
  "type": "module",
6
6
  "main": "index.js",