schemeog-mcp 3.6.2 → 3.7.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/README.md +14 -121
- package/index.js +74 -348
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,18 +1,15 @@
|
|
|
1
|
-
# SchemeOG MCP Server
|
|
1
|
+
# SchemeOG MCP Server v2.9
|
|
2
2
|
|
|
3
|
-
MCP server for [
|
|
3
|
+
MCP server for [SchemeOG Cloud](https://scheme.smartlaunchhub.com) — create diagrams and flowcharts with AI.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
- **
|
|
8
|
-
- **Version history**: View, restore, and create checkpoints for schemas
|
|
7
|
+
- **17 commands** for schemas, projects, tags, and import/export
|
|
9
8
|
- **Auto-refresh**: Browser automatically reloads when MCP updates schema
|
|
10
9
|
- **Smart positioning**: Existing elements keep their positions, new elements get auto-layout
|
|
11
10
|
- **No coordinate conflicts**: MCP ignores x/y to prevent overlapping cards
|
|
12
|
-
- **Shared links support**: Open schemas via public `/shared/` URLs (read-only)
|
|
13
|
-
- **Large schema handling**: Automatic detection and preview for schemas >100 elements
|
|
14
11
|
|
|
15
|
-
##
|
|
12
|
+
## 17 Commands
|
|
16
13
|
|
|
17
14
|
### Schemas (6 commands)
|
|
18
15
|
|
|
@@ -51,15 +48,6 @@ MCP server for [Diagrams.love](https://diagrams.love) — create diagrams and fl
|
|
|
51
48
|
| `remove_tag` | Remove tag from schema |
|
|
52
49
|
| `tag_element` | Assign/remove tag from element |
|
|
53
50
|
|
|
54
|
-
### Versions (4 commands)
|
|
55
|
-
|
|
56
|
-
| Command | Description |
|
|
57
|
-
|---------|-------------|
|
|
58
|
-
| `list_versions` | List schema version history (auto-saves and manual checkpoints) |
|
|
59
|
-
| `get_version` | Get full data of a specific version |
|
|
60
|
-
| `restore_version` | Restore schema from a previous version (auto-backup before restore) |
|
|
61
|
-
| `create_version` | Create manual checkpoint with optional comment |
|
|
62
|
-
|
|
63
51
|
## Installation
|
|
64
52
|
|
|
65
53
|
### Via npx (recommended)
|
|
@@ -72,7 +60,7 @@ npx schemeog-mcp
|
|
|
72
60
|
|
|
73
61
|
### 1. Get your token
|
|
74
62
|
|
|
75
|
-
1. Open https://
|
|
63
|
+
1. Open https://scheme.smartlaunchhub.com
|
|
76
64
|
2. Sign in with email
|
|
77
65
|
3. Go to Profile
|
|
78
66
|
4. Copy token from "Claude Code Integration" section
|
|
@@ -125,29 +113,6 @@ In `~/.claude.json` (or Cline settings):
|
|
|
125
113
|
**Element types:**
|
|
126
114
|
- `card` — regular process/action card
|
|
127
115
|
- `condition` — decision point (diamond shape)
|
|
128
|
-
- `ascii` — ASCII diagram card (renders monospace ASCII art)
|
|
129
|
-
|
|
130
|
-
### ASCII Card Type
|
|
131
|
-
|
|
132
|
-
The `ascii` type renders ASCII diagrams inside a card with monospace font. Requires `asciiContent` field.
|
|
133
|
-
|
|
134
|
-
```json
|
|
135
|
-
{
|
|
136
|
-
"id": "flow-1",
|
|
137
|
-
"type": "ascii",
|
|
138
|
-
"title": "Request Flow",
|
|
139
|
-
"asciiContent": "┌─────────┐ ┌─────────┐\n│ Request │────▶│ Process │\n└─────────┘ └─────────┘",
|
|
140
|
-
"borderColor": "purple"
|
|
141
|
-
}
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
**ASCII card features:**
|
|
145
|
-
- Monospace font rendering
|
|
146
|
-
- Auto-calculated width/height based on content
|
|
147
|
-
- Max 2000 characters for `asciiContent`
|
|
148
|
-
- Default border color: purple
|
|
149
|
-
- Supports box-drawing characters: `┌ ┐ └ ┘ ─ │ ├ ┤ ┬ ┴ ┼`
|
|
150
|
-
- Supports arrows: `▶ ◀ ▼ ▲ → ← ↓ ↑`
|
|
151
116
|
|
|
152
117
|
**Completion status (`completed`):**
|
|
153
118
|
- `true` — card is marked as completed (done)
|
|
@@ -191,35 +156,6 @@ Connections are defined inside each element's `connections` array:
|
|
|
191
156
|
|
|
192
157
|
**Line styles (`style`):** `solid` (default), `dashed`, `dotted`
|
|
193
158
|
|
|
194
|
-
### Connection Label Format
|
|
195
|
-
|
|
196
|
-
**RULE:** All connection labels should be in `[square brackets]`
|
|
197
|
-
|
|
198
|
-
This visually highlights transitions and user actions on the diagram:
|
|
199
|
-
|
|
200
|
-
```json
|
|
201
|
-
{
|
|
202
|
-
"connections": [
|
|
203
|
-
{"to": "home", "label": "[Login]"},
|
|
204
|
-
{"to": "register", "label": "[Register]"},
|
|
205
|
-
{"to": "error", "label": "[Error]"},
|
|
206
|
-
{"to": "success", "label": "[Success]"}
|
|
207
|
-
]
|
|
208
|
-
}
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
**Why square brackets:**
|
|
212
|
-
- Clearly distinguishes action labels from regular text
|
|
213
|
-
- Shows user actions/triggers on transitions
|
|
214
|
-
- Consistent visual style across all schemas
|
|
215
|
-
|
|
216
|
-
**Example in ASCII:**
|
|
217
|
-
```
|
|
218
|
-
┌───────────┐ [Login] ┌───────────┐
|
|
219
|
-
│ Login │──────────▶│ Home │
|
|
220
|
-
└───────────┘ └───────────┘
|
|
221
|
-
```
|
|
222
|
-
|
|
223
159
|
### Full schema example
|
|
224
160
|
|
|
225
161
|
```json
|
|
@@ -312,38 +248,15 @@ When you edit a schema via MCP while viewing it in the browser:
|
|
|
312
248
|
You can open any schema by URL using `get_schema_by_url`:
|
|
313
249
|
|
|
314
250
|
```
|
|
315
|
-
# Canvas URL (
|
|
316
|
-
https://
|
|
251
|
+
# Canvas URL (основной формат)
|
|
252
|
+
https://scheme.smartlaunchhub.com/canvas?schema=abc123
|
|
317
253
|
|
|
318
|
-
# Shared link
|
|
319
|
-
https://
|
|
254
|
+
# Shared link
|
|
255
|
+
https://scheme.smartlaunchhub.com/shared/xyz789
|
|
320
256
|
```
|
|
321
257
|
|
|
322
258
|
Just paste the URL and the MCP will extract the schema ID automatically.
|
|
323
259
|
|
|
324
|
-
### Shared Links (Read-Only)
|
|
325
|
-
|
|
326
|
-
When you open a schema via `/shared/` URL:
|
|
327
|
-
- ✅ You can **view** the schema content
|
|
328
|
-
- ✅ You can **analyze** the structure
|
|
329
|
-
- ✅ You can **count** elements and connections
|
|
330
|
-
- ❌ You **cannot edit** — need access to original schema
|
|
331
|
-
|
|
332
|
-
This is useful for:
|
|
333
|
-
- Analyzing schemas shared by others
|
|
334
|
-
- Answering questions about schema structure
|
|
335
|
-
- Getting inspiration for your own diagrams
|
|
336
|
-
|
|
337
|
-
## Large Schema Handling
|
|
338
|
-
|
|
339
|
-
For schemas with >100 elements or >50KB data:
|
|
340
|
-
|
|
341
|
-
- `get_schema` shows first 5 elements as preview
|
|
342
|
-
- `get_schema_by_url` shows statistics only
|
|
343
|
-
- Full data available via `export_schema_to_json`
|
|
344
|
-
|
|
345
|
-
This prevents context overflow in Claude Code when working with large diagrams.
|
|
346
|
-
|
|
347
260
|
## Schema Methodology
|
|
348
261
|
|
|
349
262
|
Schema = complete tree of **ACTIONS** and **CONSEQUENCES**:
|
|
@@ -440,34 +353,14 @@ import_schema_from_json(
|
|
|
440
353
|
|
|
441
354
|
## Version History
|
|
442
355
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
```
|
|
448
|
-
# List all versions
|
|
449
|
-
list_versions(schema_id: "xxx")
|
|
450
|
-
|
|
451
|
-
# View specific version
|
|
452
|
-
get_version(schema_id: "xxx", version_id: "yyy")
|
|
453
|
-
|
|
454
|
-
# Restore from version (auto-backup before restore)
|
|
455
|
-
restore_version(schema_id: "xxx", version_id: "yyy")
|
|
456
|
-
|
|
457
|
-
# Create manual checkpoint
|
|
458
|
-
create_version(schema_id: "xxx", comment: "Before refactoring")
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
### Features
|
|
462
|
-
|
|
463
|
-
- **Auto-save**: Every schema change creates a version automatically
|
|
464
|
-
- **Manual checkpoints**: Create named versions before important changes
|
|
465
|
-
- **Safe restore**: Current state is backed up before any restore
|
|
466
|
-
- **100 versions limit**: Old auto-saves are cleaned, manual checkpoints are preserved
|
|
356
|
+
MCP now automatically creates versions when updating schemas:
|
|
357
|
+
- Before each update via MCP, a snapshot is saved
|
|
358
|
+
- View version history in the web interface (History tab)
|
|
359
|
+
- Restore any previous version with one click
|
|
467
360
|
|
|
468
361
|
## Links
|
|
469
362
|
|
|
470
|
-
- [
|
|
363
|
+
- [SchemeOG Cloud](https://scheme.smartlaunchhub.com)
|
|
471
364
|
- [GitLab](https://gitlab.com/serter2069/schemeog-mcp)
|
|
472
365
|
|
|
473
366
|
## License
|
package/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* SchemeOG MCP Server v3.
|
|
4
|
+
* SchemeOG MCP Server v3.7.0
|
|
5
5
|
*
|
|
6
|
-
* MCP сервер для работы со схемами,
|
|
6
|
+
* MCP сервер для работы со схемами, проектами и тегами в SchemeOG Cloud.
|
|
7
7
|
*
|
|
8
8
|
* Команды для схем:
|
|
9
9
|
* - list_schemas: Список всех схем
|
|
@@ -29,12 +29,6 @@
|
|
|
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)
|
|
38
32
|
*/
|
|
39
33
|
|
|
40
34
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -1176,137 +1170,6 @@ Claude урезает большие параметры, но file_path чита
|
|
|
1176
1170
|
required: ["schema_id"],
|
|
1177
1171
|
},
|
|
1178
1172
|
},
|
|
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
|
-
},
|
|
1306
|
-
},
|
|
1307
|
-
required: ["schema_id"],
|
|
1308
|
-
},
|
|
1309
|
-
},
|
|
1310
1173
|
];
|
|
1311
1174
|
|
|
1312
1175
|
/**
|
|
@@ -1492,38 +1355,47 @@ async function handleTool(name, args) {
|
|
|
1492
1355
|
|
|
1493
1356
|
const schema = result.schema;
|
|
1494
1357
|
|
|
1495
|
-
// Проверяем размер данных
|
|
1358
|
+
// Проверяем размер данных
|
|
1496
1359
|
const elementsCount = schema.data?.elements?.length || 0;
|
|
1497
1360
|
const connectionsCount = schema.data?.connections?.length || 0;
|
|
1498
1361
|
const dataSize = JSON.stringify(schema.data || {}).length;
|
|
1499
|
-
const isLargeSchema = dataSize > 50000 || elementsCount > 100;
|
|
1500
1362
|
|
|
1501
|
-
//
|
|
1502
|
-
|
|
1363
|
+
// Лимит: 50 элементов или 30KB
|
|
1364
|
+
const ELEMENTS_LIMIT = 50;
|
|
1365
|
+
const SIZE_LIMIT = 30000;
|
|
1366
|
+
const isLargeSchema = elementsCount > ELEMENTS_LIMIT || dataSize > SIZE_LIMIT;
|
|
1503
1367
|
|
|
1504
1368
|
if (isLargeSchema) {
|
|
1505
|
-
// Большая схема — выводим только
|
|
1506
|
-
|
|
1507
|
-
|
|
1369
|
+
// Большая схема — НЕ выводим данные, только инструкцию
|
|
1370
|
+
return {
|
|
1371
|
+
content: [{
|
|
1372
|
+
type: "text",
|
|
1373
|
+
text: `⛔ СХЕМА СЛИШКОМ БОЛЬШАЯ ДЛЯ ПРЯМОГО ЧТЕНИЯ
|
|
1374
|
+
|
|
1375
|
+
Схема "${schema.name}"
|
|
1376
|
+
ID: ${schema.id}
|
|
1377
|
+
Элементов: ${elementsCount} (лимит: ${ELEMENTS_LIMIT})
|
|
1378
|
+
Размер: ~${Math.round(dataSize / 1024)}KB (лимит: ${Math.round(SIZE_LIMIT / 1024)}KB)
|
|
1508
1379
|
|
|
1509
|
-
|
|
1510
|
-
${JSON.stringify(previewElements, null, 2)}
|
|
1380
|
+
📋 ИНСТРУКЦИЯ ДЛЯ РАБОТЫ С БОЛЬШОЙ СХЕМОЙ:
|
|
1511
1381
|
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
• export_schema_to_json с format="elements_only" — только элементы`;
|
|
1382
|
+
1. Экспортируй в файл:
|
|
1383
|
+
export_schema_to_json(schema_id="${schema.id}", file_path="/tmp/schema.json")
|
|
1515
1384
|
|
|
1516
|
-
|
|
1385
|
+
2. Прочитай файл через Read tool:
|
|
1386
|
+
Read("/tmp/schema.json")
|
|
1517
1387
|
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1388
|
+
3. Отредактируй файл
|
|
1389
|
+
|
|
1390
|
+
4. Загрузи обратно:
|
|
1391
|
+
replace_schema(schema_id="${schema.id}", file_path="/tmp/schema.json")
|
|
1392
|
+
|
|
1393
|
+
Это экономит токены и предотвращает переполнение контекста.`,
|
|
1394
|
+
}],
|
|
1395
|
+
};
|
|
1525
1396
|
}
|
|
1526
1397
|
|
|
1398
|
+
// Маленькая схема — выводим полностью
|
|
1527
1399
|
return {
|
|
1528
1400
|
content: [{
|
|
1529
1401
|
type: "text",
|
|
@@ -1535,13 +1407,13 @@ ID: ${schema.id}
|
|
|
1535
1407
|
Элементов: ${elementsCount}
|
|
1536
1408
|
Связей: ${connectionsCount}
|
|
1537
1409
|
Размер данных: ~${Math.round(dataSize / 1024)}KB
|
|
1538
|
-
URL: ${API_BASE_URL}/canvas?schema=${schema.id}
|
|
1410
|
+
URL: ${API_BASE_URL}/canvas?schema=${schema.id}
|
|
1539
1411
|
|
|
1540
1412
|
Элементы:
|
|
1541
|
-
${
|
|
1413
|
+
${JSON.stringify(schema.data?.elements || [], null, 2)}
|
|
1542
1414
|
|
|
1543
1415
|
Связи:
|
|
1544
|
-
${
|
|
1416
|
+
${JSON.stringify(schema.data?.connections || [], null, 2)}`,
|
|
1545
1417
|
}],
|
|
1546
1418
|
};
|
|
1547
1419
|
}
|
|
@@ -1574,32 +1446,51 @@ ${connectionsText}`,
|
|
|
1574
1446
|
|
|
1575
1447
|
const schema = result.schema;
|
|
1576
1448
|
|
|
1577
|
-
// Проверяем размер данных
|
|
1449
|
+
// Проверяем размер данных
|
|
1578
1450
|
const elementsCount = schema.data?.elements?.length || 0;
|
|
1579
1451
|
const connectionsCount = schema.data?.connections?.length || 0;
|
|
1580
1452
|
const dataSize = JSON.stringify(schema.data || {}).length;
|
|
1581
|
-
const isLargeSchema = dataSize > 50000 || elementsCount > 100;
|
|
1582
|
-
|
|
1583
|
-
// Формируем вывод в зависимости от размера
|
|
1584
|
-
let elementsText, connectionsText;
|
|
1585
1453
|
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
Для работы с большой схемой используй:
|
|
1591
|
-
• export_schema_to_json с format="compact" для получения данных в файл
|
|
1592
|
-
• Редактируй отдельные элементы через replace_schema`;
|
|
1593
|
-
connectionsText = `[${connectionsCount} связей]`;
|
|
1594
|
-
} else {
|
|
1595
|
-
elementsText = JSON.stringify(schema.data?.elements || [], null, 2);
|
|
1596
|
-
connectionsText = JSON.stringify(schema.data?.connections || [], null, 2);
|
|
1597
|
-
}
|
|
1454
|
+
// Лимит: 50 элементов или 30KB
|
|
1455
|
+
const ELEMENTS_LIMIT = 50;
|
|
1456
|
+
const SIZE_LIMIT = 30000;
|
|
1457
|
+
const isLargeSchema = elementsCount > ELEMENTS_LIMIT || dataSize > SIZE_LIMIT;
|
|
1598
1458
|
|
|
1599
1459
|
const accessNote = isSharedLink
|
|
1600
1460
|
? "\n⚠️ Это публичная ссылка. Для редактирования нужен доступ к оригинальной схеме."
|
|
1601
1461
|
: "";
|
|
1602
1462
|
|
|
1463
|
+
if (isLargeSchema) {
|
|
1464
|
+
// Большая схема — НЕ выводим данные, только инструкцию
|
|
1465
|
+
return {
|
|
1466
|
+
content: [{
|
|
1467
|
+
type: "text",
|
|
1468
|
+
text: `⛔ СХЕМА СЛИШКОМ БОЛЬШАЯ ДЛЯ ПРЯМОГО ЧТЕНИЯ
|
|
1469
|
+
|
|
1470
|
+
Схема "${schema.name}"
|
|
1471
|
+
ID: ${schema.id}
|
|
1472
|
+
Элементов: ${elementsCount} (лимит: ${ELEMENTS_LIMIT})
|
|
1473
|
+
Размер: ~${Math.round(dataSize / 1024)}KB (лимит: ${Math.round(SIZE_LIMIT / 1024)}KB)${accessNote}
|
|
1474
|
+
|
|
1475
|
+
📋 ИНСТРУКЦИЯ ДЛЯ РАБОТЫ С БОЛЬШОЙ СХЕМОЙ:
|
|
1476
|
+
|
|
1477
|
+
1. Экспортируй в файл:
|
|
1478
|
+
export_schema_to_json(schema_id="${schema.id}", file_path="/tmp/schema.json")
|
|
1479
|
+
|
|
1480
|
+
2. Прочитай файл через Read tool:
|
|
1481
|
+
Read("/tmp/schema.json")
|
|
1482
|
+
|
|
1483
|
+
3. Отредактируй файл
|
|
1484
|
+
|
|
1485
|
+
4. Загрузи обратно:
|
|
1486
|
+
replace_schema(schema_id="${schema.id}", file_path="/tmp/schema.json")
|
|
1487
|
+
|
|
1488
|
+
Это экономит токены и предотвращает переполнение контекста.`,
|
|
1489
|
+
}],
|
|
1490
|
+
};
|
|
1491
|
+
}
|
|
1492
|
+
|
|
1493
|
+
// Маленькая схема — выводим полностью
|
|
1603
1494
|
return {
|
|
1604
1495
|
content: [{
|
|
1605
1496
|
type: "text",
|
|
@@ -1616,10 +1507,10 @@ ID: ${schema.id}
|
|
|
1616
1507
|
URL: ${API_BASE_URL}/canvas?schema=${schema.id}${accessNote}
|
|
1617
1508
|
|
|
1618
1509
|
Элементы:
|
|
1619
|
-
${
|
|
1510
|
+
${JSON.stringify(schema.data?.elements || [], null, 2)}
|
|
1620
1511
|
|
|
1621
1512
|
Связи:
|
|
1622
|
-
${
|
|
1513
|
+
${JSON.stringify(schema.data?.connections || [], null, 2)}
|
|
1623
1514
|
|
|
1624
1515
|
Теперь ты можешь:
|
|
1625
1516
|
• Редактировать схему с помощью replace_schema (schema_id: "${schema.id}")
|
|
@@ -2469,171 +2360,6 @@ URL: ${API_BASE_URL}/canvas?schema=${result.schema.id}${warningsText}`,
|
|
|
2469
2360
|
};
|
|
2470
2361
|
}
|
|
2471
2362
|
|
|
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
|
-
|
|
2637
2363
|
default:
|
|
2638
2364
|
throw new Error(`Неизвестная команда: ${name}`);
|
|
2639
2365
|
}
|
|
@@ -2672,7 +2398,7 @@ async function main() {
|
|
|
2672
2398
|
const server = new Server(
|
|
2673
2399
|
{
|
|
2674
2400
|
name: "schemeog-mcp",
|
|
2675
|
-
version: "
|
|
2401
|
+
version: "2.9.3",
|
|
2676
2402
|
},
|
|
2677
2403
|
{
|
|
2678
2404
|
capabilities: {
|
|
@@ -2702,7 +2428,7 @@ async function main() {
|
|
|
2702
2428
|
const transport = new StdioServerTransport();
|
|
2703
2429
|
await server.connect(transport);
|
|
2704
2430
|
|
|
2705
|
-
console.error("SchemeOG MCP Server
|
|
2431
|
+
console.error("SchemeOG MCP Server v2.9.3 запущен");
|
|
2706
2432
|
}
|
|
2707
2433
|
|
|
2708
2434
|
main().catch(console.error);
|