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.
- package/index.js +113 -19
- 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.
|
|
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
|
-
|
|
696
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1428
|
-
if (
|
|
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 (
|
|
1433
|
-
const normalized = prepareElements(
|
|
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:
|
|
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:
|
|
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
|
-
// Формат
|
|
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.
|
|
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.
|
|
2198
|
+
console.error("SchemeOG MCP Server v2.9.3 запущен");
|
|
2105
2199
|
}
|
|
2106
2200
|
|
|
2107
2201
|
main().catch(console.error);
|