schemeog-mcp 2.9.1 → 2.9.3

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 +113 -19
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * SchemeOG MCP Server v2.9.1
4
+ * SchemeOG MCP Server v2.9.3
5
5
  *
6
6
  * MCP сервер для работы со схемами, проектами и тегами в SchemeOG Cloud.
7
7
  *
@@ -692,16 +692,26 @@ const TOOLS = [
692
692
  - Изменить связи
693
693
 
694
694
  ВАЖНО: Эта команда ЗАМЕНЯЕТ все данные схемы!
695
- Сначала получи текущую схему через get_schema,
696
- модифицируй данные, затем отправь через replace_schema.
695
+
696
+ ⚠️ ДЛЯ БОЛЬШИХ СХЕМ (>50KB) используй file_path вместо elements!
697
+ Claude обрезает большие параметры, но file_path читает файл напрямую.
697
698
 
698
699
  Параметры:
699
700
  - schema_id: ID схемы (обязательно)
700
701
  - name: новое название (опционально)
701
702
  - description: новое описание (опционально)
702
- - elements: новый массив элементов со связями внутри (опционально)
703
+ - elements: массив элементов (опционально) для небольших схем
704
+ - file_path: путь к JSON файлу (опционально) — для БОЛЬШИХ схем (>50KB)
705
+
706
+ Если указан file_path — elements игнорируется, данные берутся из файла.
703
707
 
704
- Формат элемента (такой же как в create_schema):
708
+ Поддерживаемые форматы JSON файла:
709
+ 1. { exportVersion, schema: {...} } — экспорт SchemeOG
710
+ 2. { name, data: { elements: [...] } } — вложенный формат
711
+ 3. { name, elements, connections } — простой формат
712
+ 4. { elements: [...] } — только элементы
713
+
714
+ Формат элемента:
705
715
  {
706
716
  "id": "unique_id",
707
717
  "type": "card", // card или condition
@@ -713,7 +723,7 @@ const TOOLS = [
713
723
  "connections": [{"to": "target_id", "label": "подпись"}] // ИСХОДЯЩИЕ СВЯЗИ внутри элемента
714
724
  }
715
725
 
716
- Если elements не указаны - они останутся прежними.`,
726
+ Если elements и file_path не указаны - элементы останутся прежними.`,
717
727
  inputSchema: {
718
728
  type: "object",
719
729
  properties: {
@@ -731,9 +741,13 @@ const TOOLS = [
731
741
  },
732
742
  elements: {
733
743
  type: "array",
734
- description: "Новый массив элементов со связями внутри (заменяет все существующие)",
744
+ description: "Массив элементов (для небольших схем). Для больших используй file_path!",
735
745
  items: { type: "object" },
736
746
  },
747
+ file_path: {
748
+ type: "string",
749
+ description: "Путь к локальному JSON файлу (для БОЛЬШИХ схем >50KB). Обходит лимит Claude на размер параметров.",
750
+ },
737
751
  },
738
752
  required: ["schema_id"],
739
753
  },
@@ -1413,7 +1427,7 @@ URL: ${API_BASE_URL}/canvas?schema=${result.schema.id}
1413
1427
  }
1414
1428
 
1415
1429
  case "replace_schema": {
1416
- const { schema_id, name, description, elements } = args;
1430
+ const { schema_id, name, description, elements, file_path } = args;
1417
1431
 
1418
1432
  // Получаем текущую схему
1419
1433
  const currentResult = await apiRequest(`/schemas/${schema_id}`);
@@ -1423,14 +1437,83 @@ URL: ${API_BASE_URL}/canvas?schema=${result.schema.id}
1423
1437
  // Формируем обновление
1424
1438
  const updateBody = {};
1425
1439
  let warnings = [];
1440
+ let finalElements = elements;
1441
+ let fileSize = null;
1442
+ let fileNameFromJson = null;
1443
+ let fileDescFromJson = null;
1426
1444
 
1427
- if (name) updateBody.name = name;
1428
- if (description !== undefined) updateBody.description = description;
1445
+ // Если указан file_path — читаем элементы из файла (обходит лимит Claude)
1446
+ if (file_path) {
1447
+ try {
1448
+ const fileContent = fs.readFileSync(file_path, "utf-8");
1449
+ fileSize = fileContent.length;
1450
+ const parsedContent = JSON.parse(fileContent);
1451
+
1452
+ // Парсим разные форматы JSON
1453
+ let schemaData;
1454
+
1455
+ // Формат 1: Полный экспорт SchemeOG { exportVersion, schema: {...} }
1456
+ if (parsedContent.exportVersion && parsedContent.schema) {
1457
+ schemaData = parsedContent.schema;
1458
+ fileNameFromJson = schemaData.name;
1459
+ fileDescFromJson = schemaData.description;
1460
+ }
1461
+ // Формат 2: Вложенный формат { name, data: { elements: [...] } }
1462
+ else if (parsedContent.data && parsedContent.data.elements) {
1463
+ schemaData = parsedContent.data;
1464
+ fileNameFromJson = parsedContent.name;
1465
+ fileDescFromJson = parsedContent.description;
1466
+ }
1467
+ // Формат 3: Простой { name, elements, connections }
1468
+ else if (parsedContent.elements || parsedContent.name) {
1469
+ schemaData = parsedContent;
1470
+ fileNameFromJson = parsedContent.name;
1471
+ fileDescFromJson = parsedContent.description;
1472
+ }
1473
+ // Формат 4: Только массив элементов
1474
+ else if (Array.isArray(parsedContent)) {
1475
+ schemaData = { elements: parsedContent };
1476
+ }
1477
+ else {
1478
+ return {
1479
+ content: [{
1480
+ type: "text",
1481
+ text: `❌ Неизвестный формат JSON файла.\n\nПоддерживаемые форматы:\n• {exportVersion, schema: {...}}\n• {name, data: {elements: [...]}}\n• {name, elements, connections}\n• {elements: [...]}`,
1482
+ }],
1483
+ isError: true,
1484
+ };
1485
+ }
1486
+
1487
+ finalElements = schemaData.elements || [];
1488
+ } catch (readError) {
1489
+ return {
1490
+ content: [{
1491
+ type: "text",
1492
+ text: `❌ Ошибка чтения файла: ${readError.message}`,
1493
+ }],
1494
+ isError: true,
1495
+ };
1496
+ }
1497
+ }
1429
1498
 
1430
- // Обновляем данные только если переданы
1499
+ // Используем name из параметра, или из файла, или оставляем текущее
1500
+ if (name) {
1501
+ updateBody.name = name;
1502
+ } else if (fileNameFromJson) {
1503
+ updateBody.name = fileNameFromJson;
1504
+ }
1505
+
1506
+ // Аналогично для description
1507
+ if (description !== undefined) {
1508
+ updateBody.description = description;
1509
+ } else if (fileDescFromJson !== undefined) {
1510
+ updateBody.description = fileDescFromJson;
1511
+ }
1512
+
1513
+ // Обновляем данные только если переданы элементы
1431
1514
  const newData = { ...currentData };
1432
- if (elements !== undefined) {
1433
- const normalized = prepareElements(elements);
1515
+ if (finalElements !== undefined) {
1516
+ const normalized = prepareElements(finalElements);
1434
1517
 
1435
1518
  // Проверка на ошибки (дубликаты ID и т.д.)
1436
1519
  if (normalized.error) {
@@ -1486,10 +1569,15 @@ URL: ${API_BASE_URL}/canvas?schema=${result.schema.id}
1486
1569
  warningsText += `\n\n💡 Подсказка: используй type "card"/"condition", цвета light_blue/light_green/etc`;
1487
1570
  }
1488
1571
 
1572
+ // Формируем сообщение об источнике данных
1573
+ const sourceInfo = file_path
1574
+ ? ` (из файла ${file_path}, ${Math.round(fileSize / 1024)}KB)`
1575
+ : "";
1576
+
1489
1577
  return {
1490
1578
  content: [{
1491
1579
  type: "text",
1492
- text: `Схема "${result.schema.name}" обновлена!
1580
+ text: `✅ Схема "${result.schema.name}" обновлена${sourceInfo}!
1493
1581
 
1494
1582
  Элементов: ${result.schema.data?.elements?.length || 0}
1495
1583
  Связей: ${result.schema.data?.connections?.length || 0}
@@ -1825,20 +1913,26 @@ URL: ${API_BASE_URL}/canvas?schema=${schema_id}${warningsText}`,
1825
1913
  schemaName = schemaData.name;
1826
1914
  schemaDescription = schemaData.description;
1827
1915
  }
1828
- // Формат 2: Простой { name, elements, connections }
1916
+ // Формат 2: Вложенный формат { name, data: { elements: [...] } }
1917
+ else if (parsedContent.data && parsedContent.data.elements) {
1918
+ schemaData = parsedContent.data;
1919
+ schemaName = parsedContent.name;
1920
+ schemaDescription = parsedContent.description;
1921
+ }
1922
+ // Формат 3: Простой { name, elements, connections }
1829
1923
  else if (parsedContent.elements || parsedContent.name) {
1830
1924
  schemaData = parsedContent;
1831
1925
  schemaName = parsedContent.name;
1832
1926
  schemaDescription = parsedContent.description;
1833
1927
  }
1834
- // Формат 3: Только { elements: [...] }
1928
+ // Формат 4: Только { elements: [...] }
1835
1929
  else if (Array.isArray(parsedContent)) {
1836
1930
  schemaData = { elements: parsedContent };
1837
1931
  }
1838
1932
  else {
1839
1933
  const error = createError(
1840
1934
  ErrorCodes.VALIDATION_ERROR,
1841
- `Неизвестный формат JSON.\n\nПоддерживаемые форматы:\n• {exportVersion, schema: {...}} — экспорт SchemeOG\n• {name, elements, connections} — простой формат\n• {elements: [...]} — только элементы`
1935
+ `Неизвестный формат JSON.\n\nПоддерживаемые форматы:\n• {exportVersion, schema: {...}} — экспорт SchemeOG\n• {name, data: {elements: [...]}} — вложенный формат\n• {name, elements, connections} — простой формат\n• {elements: [...]} — только элементы`
1842
1936
  );
1843
1937
  throw new Error(error.message);
1844
1938
  }
@@ -2071,7 +2165,7 @@ async function main() {
2071
2165
  const server = new Server(
2072
2166
  {
2073
2167
  name: "schemeog-mcp",
2074
- version: "2.9.1",
2168
+ version: "2.9.3",
2075
2169
  },
2076
2170
  {
2077
2171
  capabilities: {
@@ -2101,7 +2195,7 @@ async function main() {
2101
2195
  const transport = new StdioServerTransport();
2102
2196
  await server.connect(transport);
2103
2197
 
2104
- console.error("SchemeOG MCP Server v2.8.1 запущен");
2198
+ console.error("SchemeOG MCP Server v2.9.3 запущен");
2105
2199
  }
2106
2200
 
2107
2201
  main().catch(console.error);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "schemeog-mcp",
3
- "version": "2.9.1",
3
+ "version": "2.9.3",
4
4
  "description": "MCP Server for SchemeOG Cloud - Create and manage visual diagrams and flowcharts with AI assistance",
5
5
  "type": "module",
6
6
  "main": "index.js",