@oneentry/mcp-platform-server 0.1.1 → 0.1.4
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 +21 -0
- package/README.md +62 -61
- package/dist/api/audit.d.ts +0 -11
- package/dist/api/audit.js +0 -10
- package/dist/api/auth.d.ts +0 -18
- package/dist/api/auth.js +0 -20
- package/dist/api/build-catalog.d.ts +1 -14
- package/dist/api/build-catalog.js +16 -77
- package/dist/api/catalog.d.ts +5 -27
- package/dist/api/catalog.d.ts.map +1 -1
- package/dist/api/catalog.js +31 -43
- package/dist/api/catalog.js.map +1 -1
- package/dist/api/client.d.ts +0 -24
- package/dist/api/client.js +6 -28
- package/dist/api/normalize-schema.d.ts +0 -11
- package/dist/api/normalize-schema.js +0 -18
- package/dist/api/policy.d.ts +0 -23
- package/dist/api/policy.js +0 -0
- package/dist/api/shape.d.ts +0 -13
- package/dist/api/shape.js +0 -21
- package/dist/api/swagger-source.d.ts +13 -12
- package/dist/api/swagger-source.js +93 -50
- package/dist/api/types.d.ts +0 -34
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js +0 -1
- package/dist/bin/cli.d.ts +0 -1
- package/dist/bin/cli.js +1 -5
- package/dist/bin/cli.js.map +1 -1
- package/dist/config/config.d.ts +0 -54
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +0 -60
- package/dist/config/config.js.map +1 -1
- package/dist/index.d.ts +2 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -6
- package/dist/index.js.map +1 -1
- package/dist/knowledge/chunk.d.ts +0 -15
- package/dist/knowledge/chunk.js +0 -16
- package/dist/knowledge/github.d.ts +0 -25
- package/dist/knowledge/github.js +0 -40
- package/dist/knowledge/loader.d.ts +0 -28
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +0 -26
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/knowledge/search.d.ts +0 -22
- package/dist/knowledge/search.d.ts.map +1 -1
- package/dist/knowledge/search.js +0 -34
- package/dist/knowledge/search.js.map +1 -1
- package/dist/knowledge/tar.d.ts +0 -15
- package/dist/knowledge/tar.js +0 -33
- package/dist/knowledge/types.d.ts +0 -35
- package/dist/knowledge/types.d.ts.map +1 -1
- package/dist/knowledge/types.js +0 -1
- package/dist/server.d.ts +0 -12
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +29 -15
- package/dist/server.js.map +1 -1
- package/dist/session.d.ts +0 -23
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +0 -18
- package/dist/session.js.map +1 -1
- package/dist/tools/api-call.d.ts +0 -2
- package/dist/tools/api-call.js +0 -23
- package/dist/tools/api-discovery.d.ts +0 -2
- package/dist/tools/api-discovery.js +2 -5
- package/dist/tools/docs.d.ts +0 -2
- package/dist/tools/docs.js +1 -5
- package/dist/tools/guide.d.ts +0 -7
- package/dist/tools/guide.d.ts.map +1 -1
- package/dist/tools/guide.js +2 -9
- package/dist/tools/guide.js.map +1 -1
- package/dist/tools/result.d.ts +0 -8
- package/dist/tools/result.js +0 -7
- package/dist/tools/whoami.d.ts +0 -2
- package/dist/tools/whoami.d.ts.map +1 -1
- package/dist/tools/whoami.js +1 -3
- package/dist/tools/whoami.js.map +1 -1
- package/dist/transports/http.d.ts +0 -6
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +1 -27
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/stdio.d.ts +0 -6
- package/dist/transports/stdio.js +0 -6
- package/dist/transports/stdio.js.map +1 -1
- package/knowledge/operating-rules.md +70 -125
- package/package.json +18 -5
- package/dist/api/build-catalog.d.ts.map +0 -1
- package/dist/api/build-catalog.js.map +0 -1
- package/dist/api/normalize-schema.d.ts.map +0 -1
- package/dist/api/normalize-schema.js.map +0 -1
- package/dist/api/swagger-source.d.ts.map +0 -1
- package/dist/api/swagger-source.js.map +0 -1
- package/dist/knowledge/github.d.ts.map +0 -1
- package/dist/knowledge/github.js.map +0 -1
- package/dist/knowledge/tar.d.ts.map +0 -1
- package/dist/knowledge/tar.js.map +0 -1
package/dist/knowledge/tar.js
CHANGED
|
@@ -1,26 +1,16 @@
|
|
|
1
1
|
import { gunzipSync } from 'node:zlib';
|
|
2
|
-
/** Размер блока формата tar — и заголовок, и выравнивание данных кратны ему. */
|
|
3
2
|
const BLOCK = 512;
|
|
4
|
-
/** Смещения полей заголовка ustar. */
|
|
5
3
|
const FIELD = {
|
|
6
4
|
name: [0, 100],
|
|
7
5
|
size: [124, 12],
|
|
8
6
|
typeflag: [156, 1],
|
|
9
7
|
prefix: [345, 155],
|
|
10
8
|
};
|
|
11
|
-
/**
|
|
12
|
-
* Читает строковое поле заголовка: оно дополнено нулями до фиксированной длины.
|
|
13
|
-
*/
|
|
14
9
|
const readString = (block, [offset, length]) => {
|
|
15
10
|
const raw = block.subarray(offset, offset + length);
|
|
16
11
|
const end = raw.indexOf(0);
|
|
17
12
|
return raw.subarray(0, end === -1 ? raw.length : end).toString('utf8').trim();
|
|
18
13
|
};
|
|
19
|
-
/**
|
|
20
|
-
* Читает размер файла. В tar он записан восьмеричной строкой; GNU-расширение
|
|
21
|
-
* с базой 256 (старший бит первого байта) в архивах GitHub не встречается,
|
|
22
|
-
* но молча вернуть из него мусор нельзя — такой архив лучше отвергнуть.
|
|
23
|
-
*/
|
|
24
14
|
const readSize = (block) => {
|
|
25
15
|
const [offset, length] = FIELD.size;
|
|
26
16
|
const first = block[offset] ?? 0;
|
|
@@ -34,23 +24,16 @@ const readSize = (block) => {
|
|
|
34
24
|
}
|
|
35
25
|
return parsed;
|
|
36
26
|
};
|
|
37
|
-
/**
|
|
38
|
-
* Достаёт `path=` из расширенного заголовка pax.
|
|
39
|
-
* Записи имеют вид `<длина> <ключ>=<значение>\n`; нас интересует только путь,
|
|
40
|
-
* которым pax подменяет имя следующей записи, когда оно не влезает в ustar.
|
|
41
|
-
*/
|
|
42
27
|
const readPaxPath = (data) => {
|
|
43
28
|
const text = data.toString('utf8');
|
|
44
29
|
const match = /(?:^|\n)\d+ path=([^\n]*)\n/.exec(text);
|
|
45
30
|
return match?.[1];
|
|
46
31
|
};
|
|
47
|
-
/** Полное имя записи: ustar разбивает длинный путь на `prefix` и `name`. */
|
|
48
32
|
const fullName = (block) => {
|
|
49
33
|
const name = readString(block, FIELD.name);
|
|
50
34
|
const prefix = readString(block, FIELD.prefix);
|
|
51
35
|
return prefix === '' ? name : `${prefix}/${name}`;
|
|
52
36
|
};
|
|
53
|
-
/** Блок из одних нулей — маркер конца архива. */
|
|
54
37
|
const isZeroBlock = (block) => {
|
|
55
38
|
for (const byte of block) {
|
|
56
39
|
if (byte !== 0) {
|
|
@@ -59,17 +42,9 @@ const isZeroBlock = (block) => {
|
|
|
59
42
|
}
|
|
60
43
|
return true;
|
|
61
44
|
};
|
|
62
|
-
/**
|
|
63
|
-
* Разбирает несжатый tar и возвращает только обычные файлы.
|
|
64
|
-
* Своя реализация вместо зависимости: пакету нужен один сценарий чтения,
|
|
65
|
-
* а каждая зависимость опубликованного npm-пакета — это ещё одна поверхность атаки.
|
|
66
|
-
* Поддержаны оба способа записать длинный путь: расширенный заголовок pax
|
|
67
|
-
* (`git archive`, а значит и GitHub) и GNU longname.
|
|
68
|
-
*/
|
|
69
45
|
export const readTar = (buffer) => {
|
|
70
46
|
const entries = [];
|
|
71
47
|
let offset = 0;
|
|
72
|
-
/** Имя, навязанное предыдущим заголовком pax или GNU longname. */
|
|
73
48
|
let pendingName;
|
|
74
49
|
while (offset + BLOCK <= buffer.length) {
|
|
75
50
|
const header = buffer.subarray(offset, offset + BLOCK);
|
|
@@ -84,7 +59,6 @@ export const readTar = (buffer) => {
|
|
|
84
59
|
throw new Error('tar: truncated archive');
|
|
85
60
|
}
|
|
86
61
|
const data = buffer.subarray(dataStart, dataEnd);
|
|
87
|
-
/** Данные записи выровнены по границе блока. */
|
|
88
62
|
offset = dataStart + Math.ceil(size / BLOCK) * BLOCK;
|
|
89
63
|
if (typeflag === 'x' || typeflag === 'X') {
|
|
90
64
|
pendingName = readPaxPath(data) ?? pendingName;
|
|
@@ -94,7 +68,6 @@ export const readTar = (buffer) => {
|
|
|
94
68
|
pendingName = data.toString('utf8').replace(/\0+$/, '');
|
|
95
69
|
continue;
|
|
96
70
|
}
|
|
97
|
-
/** Глобальные заголовки pax и всё, что не является обычным файлом, нас не интересуют. */
|
|
98
71
|
if (typeflag === 'g') {
|
|
99
72
|
continue;
|
|
100
73
|
}
|
|
@@ -107,14 +80,8 @@ export const readTar = (buffer) => {
|
|
|
107
80
|
}
|
|
108
81
|
return entries;
|
|
109
82
|
};
|
|
110
|
-
/**
|
|
111
|
-
* Убирает общий первый сегмент пути. GitHub кладёт весь архив в каталог
|
|
112
|
-
* `<repo>-<sha>/`, и без этого docId у каждого документа начинался бы с хэша коммита.
|
|
113
|
-
*/
|
|
114
83
|
export const stripRoot = (entries) => entries.map((entry) => {
|
|
115
84
|
const cut = entry.path.indexOf('/');
|
|
116
85
|
return cut === -1 ? entry : { path: entry.path.slice(cut + 1), content: entry.content };
|
|
117
86
|
});
|
|
118
|
-
/** Распаковывает `.tar.gz` целиком: gzip снимается встроенным zlib. */
|
|
119
87
|
export const readTarGz = (buffer) => stripRoot(readTar(gunzipSync(buffer)));
|
|
120
|
-
//# sourceMappingURL=tar.js.map
|
|
@@ -1,31 +1,13 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Один раздел документации — единица поиска и чтения.
|
|
3
|
-
* Резать документы на разделы обязательно: даже при ограничении на размер файла
|
|
4
|
-
* модели нужен ровно тот раздел, который отвечает на её вопрос.
|
|
5
|
-
*/
|
|
6
1
|
export interface KnowledgeChunk {
|
|
7
|
-
/** Стабильный идентификатор `<docId>#<anchor>`. */
|
|
8
2
|
id: string;
|
|
9
|
-
/** Идентификатор документа, например `back/docs/menus-module`. */
|
|
10
3
|
docId: string;
|
|
11
|
-
/**
|
|
12
|
-
* Первый сегмент docId: `mcp`, `back`, `front`. Строка, а не перечисление —
|
|
13
|
-
* репозиторий знаний живёт отдельно от этого пакета и может завести новый раздел,
|
|
14
|
-
* не требуя релиза сервера. Неизвестный источник получает вес 1.
|
|
15
|
-
*/
|
|
16
4
|
repo: string;
|
|
17
|
-
/** Путь файла в репозитории знаний, например `knowledge/back/docs/menus-module.md`. */
|
|
18
5
|
path: string;
|
|
19
|
-
/** Слаг заголовка раздела; пустая строка — преамбула документа. */
|
|
20
6
|
anchor: string;
|
|
21
|
-
/** Текст заголовка раздела. */
|
|
22
7
|
title: string;
|
|
23
|
-
/** Заголовок документа (первый `#`), нужен для ранжирования и вывода. */
|
|
24
8
|
docTitle: string;
|
|
25
|
-
/** Тело раздела без заголовка. */
|
|
26
9
|
text: string;
|
|
27
10
|
}
|
|
28
|
-
/** Документ целиком: список его разделов, чтобы агент мог листать соседние. */
|
|
29
11
|
export interface KnowledgeDoc {
|
|
30
12
|
docId: string;
|
|
31
13
|
repo: string;
|
|
@@ -37,32 +19,15 @@ export interface KnowledgeDoc {
|
|
|
37
19
|
bytes: number;
|
|
38
20
|
}>;
|
|
39
21
|
}
|
|
40
|
-
/**
|
|
41
|
-
* Откуда взялся пакет знаний.
|
|
42
|
-
* `github` — только что скачан, `cache` — распакованная копия на диске,
|
|
43
|
-
* `local` — клон репозитория знаний рядом, `seed` — только вшитые правила эксплуатации.
|
|
44
|
-
*/
|
|
45
22
|
export type KnowledgeOrigin = 'github' | 'cache' | 'local' | 'seed';
|
|
46
|
-
/** Собранный пакет знаний — то, с чем работает KnowledgeIndex. */
|
|
47
23
|
export interface KnowledgePack {
|
|
48
|
-
/** Версия формата — чтобы рантайм не пытался читать несовместимый пакет. */
|
|
49
24
|
version: 1;
|
|
50
|
-
/** Когда собран (ISO). Показывается в cms_whoami. */
|
|
51
25
|
builtAt: string;
|
|
52
26
|
source: KnowledgeOrigin;
|
|
53
|
-
/** Репозиторий знаний `owner/name`, если пакет пришёл оттуда. */
|
|
54
27
|
repo?: string;
|
|
55
|
-
/** Ветка или тег, с которого читали. */
|
|
56
28
|
ref?: string;
|
|
57
|
-
/** Коммит, которым адресуется содержимое. */
|
|
58
29
|
sha?: string;
|
|
59
|
-
/**
|
|
60
|
-
* Почему пакет неполон. Пустое значение — норма; заполненное обязано попадать
|
|
61
|
-
* и в `cms_whoami`, и в `cms_guide`: деградировавший пакет знаний агент должен
|
|
62
|
-
* видеть, а не обнаруживать по отсутствию нужного документа.
|
|
63
|
-
*/
|
|
64
30
|
warning?: string;
|
|
65
31
|
docs: KnowledgeDoc[];
|
|
66
32
|
chunks: KnowledgeChunk[];
|
|
67
33
|
}
|
|
68
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/knowledge/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/knowledge/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;IAC/B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClE;AAED,sFAAsF;AACtF,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,OAAO,EAAE,CAAC,CAAC;IACX,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IAC5B,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B"}
|
package/dist/knowledge/types.js
CHANGED
package/dist/server.d.ts
CHANGED
|
@@ -1,17 +1,5 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { Config } from './config/config.js';
|
|
3
3
|
import { Session, type SharedDeps } from './session.js';
|
|
4
|
-
/**
|
|
5
|
-
* Собирает разделяемые зависимости: каталог операций, индекс знаний, журнал.
|
|
6
|
-
* Вынесено отдельно, чтобы remote-режим строил их один раз на процесс,
|
|
7
|
-
* а не на каждую сессию. Асинхронно, потому что знания приезжают из репозитория
|
|
8
|
-
* GitHub, а каталог — со swagger подключённого стенда.
|
|
9
|
-
*/
|
|
10
4
|
export declare const createSharedDeps: (config: Config) => Promise<SharedDeps>;
|
|
11
|
-
/**
|
|
12
|
-
* Создаёт MCP-сервер с полным набором инструментов.
|
|
13
|
-
* Сессия передаётся геттером: в stdio-режиме она одна на процесс,
|
|
14
|
-
* в HTTP-режиме — своя на каждое подключение, и код инструментов от этого не зависит.
|
|
15
|
-
*/
|
|
16
5
|
export declare const createServer: (deps: SharedDeps, getSession: () => Session) => McpServer;
|
|
17
|
-
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAUxD
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAUxD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,KAAG,UAahD,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,UAAU,EAAE,YAAY,MAAM,OAAO,KAAG,SAkB1E,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
1
2
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
3
|
import { AuditLog } from './api/audit.js';
|
|
4
|
+
import { credentialsFromConfig, TokenStore } from './api/auth.js';
|
|
3
5
|
import { OperationCatalog } from './api/catalog.js';
|
|
4
6
|
import { resolveKnowledge } from './knowledge/loader.js';
|
|
5
7
|
import { KnowledgeIndex } from './knowledge/search.js';
|
|
@@ -8,17 +10,35 @@ import { registerApiDiscovery } from './tools/api-discovery.js';
|
|
|
8
10
|
import { registerDocs } from './tools/docs.js';
|
|
9
11
|
import { registerGuide } from './tools/guide.js';
|
|
10
12
|
import { registerWhoami } from './tools/whoami.js';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
const SERVER_VERSION = (() => {
|
|
14
|
+
try {
|
|
15
|
+
const pkg = createRequire(import.meta.url)('../package.json');
|
|
16
|
+
return pkg.version ?? '0.0.0';
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return '0.0.0';
|
|
20
|
+
}
|
|
21
|
+
})();
|
|
22
|
+
const startupAuth = async (config) => {
|
|
23
|
+
const credentials = credentialsFromConfig(config);
|
|
24
|
+
const tokens = new TokenStore({
|
|
25
|
+
baseUrl: config.baseUrl,
|
|
26
|
+
timeoutMs: config.requestTimeoutMs,
|
|
27
|
+
credentials,
|
|
28
|
+
});
|
|
29
|
+
if (!tokens.isConfigured) {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
return { bearer: await tokens.accessToken() };
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
37
|
+
}
|
|
38
|
+
};
|
|
19
39
|
export const createSharedDeps = async (config) => ({
|
|
20
40
|
config,
|
|
21
|
-
catalog: await OperationCatalog.resolve(config),
|
|
41
|
+
catalog: await OperationCatalog.resolve(config, await startupAuth(config)),
|
|
22
42
|
knowledge: new KnowledgeIndex(await resolveKnowledge({
|
|
23
43
|
repo: config.knowledge.repo,
|
|
24
44
|
ref: config.knowledge.ref,
|
|
@@ -34,11 +54,6 @@ export const createSharedDeps = async (config) => ({
|
|
|
34
54
|
mode: config.mode,
|
|
35
55
|
}),
|
|
36
56
|
});
|
|
37
|
-
/**
|
|
38
|
-
* Создаёт MCP-сервер с полным набором инструментов.
|
|
39
|
-
* Сессия передаётся геттером: в stdio-режиме она одна на процесс,
|
|
40
|
-
* в HTTP-режиме — своя на каждое подключение, и код инструментов от этого не зависит.
|
|
41
|
-
*/
|
|
42
57
|
export const createServer = (deps, getSession) => {
|
|
43
58
|
const server = new McpServer({ name: 'oneentry-mcp-platform', version: SERVER_VERSION }, {
|
|
44
59
|
instructions: 'OneEntry CMS Admin API. Call cms_guide first, then cms_docs_read on "mcp/operating-rules" before any write. ' +
|
|
@@ -52,4 +67,3 @@ export const createServer = (deps, getSession) => {
|
|
|
52
67
|
registerApiCall(server, getSession);
|
|
53
68
|
return server;
|
|
54
69
|
};
|
|
55
|
-
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,uDAAuD;AACvD,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,uDAAuD;AACvD,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAc,EAAE,CAAC,CAAC;IAC/D,MAAM;IACN,OAAO,EAAE,gBAAgB,CAAC,IAAI,EAAE;IAChC,SAAS,EAAE,IAAI,cAAc,CAC3B,gBAAgB,CAAC;QACf,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7D,CAAC,CACH;IACD,KAAK,EAAE,IAAI,QAAQ,CAAC;QAClB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC;CACH,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAgB,EAAE,UAAyB,EAAa,EAAE;IACrF,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,cAAc,EAAE,EAC1D;QACE,YAAY,EACV,8GAA8G;YAC9G,+GAA+G;YAC/G,iDAAiD;KACpD,CACF,CAAC;IAEF,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3B,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACnC,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAEpC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
package/dist/session.d.ts
CHANGED
|
@@ -6,21 +6,12 @@ import { ConfirmStore } from './api/policy.js';
|
|
|
6
6
|
import type { Config } from './config/config.js';
|
|
7
7
|
import { KnowledgeIndex } from './knowledge/search.js';
|
|
8
8
|
import type { Operation } from './api/types.js';
|
|
9
|
-
/**
|
|
10
|
-
* Разделяемые между сессиями зависимости.
|
|
11
|
-
* Каталог и индекс знаний строятся один раз на процесс — они неизменяемы,
|
|
12
|
-
* и в remote-режиме держать их копию на сессию было бы чистой растратой.
|
|
13
|
-
*/
|
|
14
9
|
export interface SharedDeps {
|
|
15
10
|
config: Config;
|
|
16
11
|
catalog: OperationCatalog;
|
|
17
12
|
knowledge: KnowledgeIndex;
|
|
18
13
|
audit: AuditLog;
|
|
19
14
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Состояние одной MCP-сессии: свои учётные данные, свои токены,
|
|
22
|
-
* свои токены подтверждения. Именно эта изоляция делает remote-режим безопасным.
|
|
23
|
-
*/
|
|
24
15
|
export declare class Session {
|
|
25
16
|
readonly shared: SharedDeps;
|
|
26
17
|
readonly confirms: ConfirmStore;
|
|
@@ -29,21 +20,7 @@ export declare class Session {
|
|
|
29
20
|
private identityCache;
|
|
30
21
|
constructor(shared: SharedDeps, credentials?: Credentials);
|
|
31
22
|
get isConfigured(): boolean;
|
|
32
|
-
/**
|
|
33
|
-
* Access-токен сессии. Нужен единственному потребителю вне клиента —
|
|
34
|
-
* дозагрузке каталога в remote-режиме, когда стенд отдаёт swagger
|
|
35
|
-
* только авторизованным.
|
|
36
|
-
*/
|
|
37
23
|
accessToken(): Promise<string>;
|
|
38
|
-
/**
|
|
39
|
-
* Кто мы. Кэшируется: набор прав нужен почти каждому изменяющему вызову,
|
|
40
|
-
* а меняется он редко.
|
|
41
|
-
*/
|
|
42
24
|
identity(): Promise<AdminIdentity | undefined>;
|
|
43
|
-
/**
|
|
44
|
-
* Пытается показать, что именно будет изменено: ищет GET по тому же пути
|
|
45
|
-
* и читает объект. Без этого «подтверждение удаления» — подпись под пустым листом.
|
|
46
|
-
*/
|
|
47
25
|
describeTarget(operation: Operation, args: CallArgs): Promise<unknown>;
|
|
48
26
|
}
|
|
49
|
-
//# sourceMappingURL=session.d.ts.map
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAA2C,KAAK,aAAa,EAAE,KAAK,WAAW,EAAc,MAAM,eAAe,CAAC;AAC1H,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAY,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED;;;GAGG;AACH,qBAAa,OAAO;IAClB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,QAAQ,eAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,aAAa,CAA4B;gBAErC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,WAAW;IAczD,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAA2C,KAAK,aAAa,EAAE,KAAK,WAAW,EAAc,MAAM,eAAe,CAAC;AAC1H,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAY,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED;;;GAGG;AACH,qBAAa,OAAO;IAClB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,QAAQ,eAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,aAAa,CAA4B;gBAErC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,WAAW;IAczD,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAkBpD;;;OAGG;IACG,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;CAiB7E"}
|
package/dist/session.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { adminIdFromToken, credentialsFromConfig, TokenStore } from './api/auth.js';
|
|
2
2
|
import { AdminApiClient, buildUrl } from './api/client.js';
|
|
3
3
|
import { ConfirmStore } from './api/policy.js';
|
|
4
|
-
/**
|
|
5
|
-
* Состояние одной MCP-сессии: свои учётные данные, свои токены,
|
|
6
|
-
* свои токены подтверждения. Именно эта изоляция делает remote-режим безопасным.
|
|
7
|
-
*/
|
|
8
4
|
export class Session {
|
|
9
5
|
shared;
|
|
10
6
|
confirms = new ConfirmStore();
|
|
@@ -27,18 +23,9 @@ export class Session {
|
|
|
27
23
|
get isConfigured() {
|
|
28
24
|
return this.tokens.isConfigured;
|
|
29
25
|
}
|
|
30
|
-
/**
|
|
31
|
-
* Access-токен сессии. Нужен единственному потребителю вне клиента —
|
|
32
|
-
* дозагрузке каталога в remote-режиме, когда стенд отдаёт swagger
|
|
33
|
-
* только авторизованным.
|
|
34
|
-
*/
|
|
35
26
|
async accessToken() {
|
|
36
27
|
return this.tokens.accessToken();
|
|
37
28
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Кто мы. Кэшируется: набор прав нужен почти каждому изменяющему вызову,
|
|
40
|
-
* а меняется он редко.
|
|
41
|
-
*/
|
|
42
29
|
async identity() {
|
|
43
30
|
if (this.identityCache) {
|
|
44
31
|
return this.identityCache;
|
|
@@ -57,10 +44,6 @@ export class Session {
|
|
|
57
44
|
return undefined;
|
|
58
45
|
}
|
|
59
46
|
}
|
|
60
|
-
/**
|
|
61
|
-
* Пытается показать, что именно будет изменено: ищет GET по тому же пути
|
|
62
|
-
* и читает объект. Без этого «подтверждение удаления» — подпись под пустым листом.
|
|
63
|
-
*/
|
|
64
47
|
async describeTarget(operation, args) {
|
|
65
48
|
const sibling = this.shared.catalog
|
|
66
49
|
.operations()
|
|
@@ -80,4 +63,3 @@ export class Session {
|
|
|
80
63
|
return result.ok ? result.body : undefined;
|
|
81
64
|
}
|
|
82
65
|
}
|
|
83
|
-
//# sourceMappingURL=session.js.map
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAwC,UAAU,EAAE,MAAM,eAAe,CAAC;AAE1H,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAiB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAiB/C;;;GAGG;AACH,MAAM,OAAO,OAAO;IACT,MAAM,CAAa;IACnB,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IACtB,MAAM,CAAa;IAC3B,MAAM,CAAiB;IACxB,aAAa,CAA4B;IAEjD,YAAY,MAAkB,EAAE,WAAyB;QACvD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,CAAC;YAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;YAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB;YACzC,WAAW,EAAE,WAAW,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC;SACjE,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,CAAC;YAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;YAC9B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;IAClC,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/api-call.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { Session } from '../session.js';
|
|
3
|
-
/** Регистрирует `cms_api_call`. */
|
|
4
3
|
export declare const registerApiCall: (server: McpServer, getSession: () => Session) => void;
|
|
5
|
-
//# sourceMappingURL=api-call.d.ts.map
|
package/dist/tools/api-call.js
CHANGED
|
@@ -4,9 +4,7 @@ import { buildUrl, normalizeBody, RequestBuildError } from '../api/client.js';
|
|
|
4
4
|
import { checkLevel, decide } from '../api/policy.js';
|
|
5
5
|
import { shapeResponse, summarizeTarget } from '../api/shape.js';
|
|
6
6
|
import { errorResult, jsonResult } from './result.js';
|
|
7
|
-
/** Ограничение на показ тела в плане dry-run. */
|
|
8
7
|
const PLAN_BODY_LIMIT = 2_000;
|
|
9
|
-
/** Регистрирует `cms_api_call`. */
|
|
10
8
|
export const registerApiCall = (server, getSession) => {
|
|
11
9
|
server.registerTool('cms_api_call', {
|
|
12
10
|
title: 'Call an Admin API operation',
|
|
@@ -42,11 +40,6 @@ export const registerApiCall = (server, getSession) => {
|
|
|
42
40
|
hint: 'Operation ids come from cms_api_search — do not construct them by hand.',
|
|
43
41
|
});
|
|
44
42
|
}
|
|
45
|
-
/**
|
|
46
|
-
* Тело нормализуется до всего остального: и хэш аудита, и токен подтверждения
|
|
47
|
-
* привязываются именно к отправляемым аргументам, иначе подтверждение,
|
|
48
|
-
* выданное на dry-run, не совпало бы с реальным вызовом.
|
|
49
|
-
*/
|
|
50
43
|
const normalizedBody = normalizeBody(body);
|
|
51
44
|
const args = {
|
|
52
45
|
...(path ? { path } : {}),
|
|
@@ -60,24 +53,15 @@ export const registerApiCall = (server, getSession) => {
|
|
|
60
53
|
path: operation.path,
|
|
61
54
|
argsHash,
|
|
62
55
|
};
|
|
63
|
-
/**
|
|
64
|
-
* Уровень доступа проверяется до аутентификации: иначе отказ read-only режима
|
|
65
|
-
* всё равно сходил бы в сеть за токеном, и обещание «no request was sent» было бы ложью.
|
|
66
|
-
*/
|
|
67
56
|
const levelDenial = checkLevel(operation, config.allow);
|
|
68
57
|
if (levelDenial) {
|
|
69
58
|
audit.record({ ...auditBase, outcome: 'denied' });
|
|
70
59
|
return errorResult(levelDenial.reason, { opId, policy: config.allow, risk: operation.risk });
|
|
71
60
|
}
|
|
72
|
-
/** Личность нужна только там, где операция объявляет требуемое право. */
|
|
73
61
|
const identity = operation.permission ? await session.identity() : undefined;
|
|
74
62
|
if (identity) {
|
|
75
63
|
Object.assign(auditBase, { adminId: identity.id });
|
|
76
64
|
}
|
|
77
|
-
/**
|
|
78
|
-
* Негодный токен — отдельная ошибка, а не «просто нет подтверждения»:
|
|
79
|
-
* иначе агент получал бы в ответ новый токен и не понимал, что предыдущий не подошёл.
|
|
80
|
-
*/
|
|
81
65
|
const confirmValid = confirm !== undefined && session.confirms.verify(confirm, opId, args);
|
|
82
66
|
if (confirm !== undefined && !confirmValid) {
|
|
83
67
|
return errorResult('Confirm token is expired, already used, or does not match these arguments. Re-run with dryRun: true to get a fresh one.', { opId });
|
|
@@ -94,7 +78,6 @@ export const registerApiCall = (server, getSession) => {
|
|
|
94
78
|
}
|
|
95
79
|
return errorResult(decision.reason, { opId, policy: config.allow, risk: operation.risk });
|
|
96
80
|
}
|
|
97
|
-
/** Разрешение по уровню и правам получено — можно строить сам запрос. */
|
|
98
81
|
let url;
|
|
99
82
|
try {
|
|
100
83
|
url = buildUrl(config.baseUrl, operation, args);
|
|
@@ -134,10 +117,6 @@ export const registerApiCall = (server, getSession) => {
|
|
|
134
117
|
target: summarizeTarget(target),
|
|
135
118
|
});
|
|
136
119
|
}
|
|
137
|
-
/**
|
|
138
|
-
* Токен гасится только здесь, перед самой отправкой: если бы он расходовался
|
|
139
|
-
* при проверке политики, отказ по другой причине заставлял бы подтверждать заново.
|
|
140
|
-
*/
|
|
141
120
|
if (confirm !== undefined && !session.confirms.consume(confirm, opId, args)) {
|
|
142
121
|
return errorResult('Confirm token was consumed concurrently. Re-run with dryRun: true to get a fresh one.', { opId });
|
|
143
122
|
}
|
|
@@ -154,7 +133,6 @@ export const registerApiCall = (server, getSession) => {
|
|
|
154
133
|
opId,
|
|
155
134
|
status: result.error.status,
|
|
156
135
|
...(result.error.hint ? { hint: result.error.hint } : {}),
|
|
157
|
-
docs: operation.docLinks,
|
|
158
136
|
});
|
|
159
137
|
}
|
|
160
138
|
const shaped = shapeResponse(result.body, config.maxResponseBytes);
|
|
@@ -166,4 +144,3 @@ export const registerApiCall = (server, getSession) => {
|
|
|
166
144
|
});
|
|
167
145
|
});
|
|
168
146
|
};
|
|
169
|
-
//# sourceMappingURL=api-call.js.map
|
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { SharedDeps } from '../session.js';
|
|
3
|
-
/** Регистрирует `cms_api_search` и `cms_api_describe`. */
|
|
4
3
|
export declare const registerApiDiscovery: (server: McpServer, deps: SharedDeps) => void;
|
|
5
|
-
//# sourceMappingURL=api-discovery.d.ts.map
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { errorResult, jsonResult } from './result.js';
|
|
3
|
-
/** Регистрирует `cms_api_search` и `cms_api_describe`. */
|
|
4
3
|
export const registerApiDiscovery = (server, deps) => {
|
|
5
4
|
const { catalog } = deps;
|
|
6
5
|
server.registerTool('cms_api_search', {
|
|
@@ -36,7 +35,7 @@ export const registerApiDiscovery = (server, deps) => {
|
|
|
36
35
|
});
|
|
37
36
|
server.registerTool('cms_api_describe', {
|
|
38
37
|
title: 'Describe an Admin API operation',
|
|
39
|
-
description: 'Full detail for one operation: path and query parameters, request-body schema, required permission, risk level, and
|
|
38
|
+
description: 'Full detail for one operation: path and query parameters, request-body schema, required permission, risk level, and whether it is permanently confirm-gated. Fields marked "x-loose": true could not be converted to a JSON Schema type — trust their example, not their type.',
|
|
40
39
|
inputSchema: {
|
|
41
40
|
opId: z.string().min(1).describe('Operation id from cms_api_search, e.g. "AdminPagesController_findAllRoot".'),
|
|
42
41
|
},
|
|
@@ -70,11 +69,9 @@ export const registerApiDiscovery = (server, deps) => {
|
|
|
70
69
|
body: operation.body ?? null,
|
|
71
70
|
looseFields: loose,
|
|
72
71
|
responseSummary: operation.responseSummary ?? null,
|
|
73
|
-
docs: operation.docLinks,
|
|
74
72
|
next: operation.risk === 'read'
|
|
75
73
|
? 'Call it with cms_api_call { opId, path, query }.'
|
|
76
|
-
: '
|
|
74
|
+
: 'Search the knowledge base with cms_docs_search for this entity, then call cms_api_call with dryRun: true first.',
|
|
77
75
|
});
|
|
78
76
|
});
|
|
79
77
|
};
|
|
80
|
-
//# sourceMappingURL=api-discovery.js.map
|
package/dist/tools/docs.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { SharedDeps } from '../session.js';
|
|
3
|
-
/** Регистрирует `cms_docs_search` и `cms_docs_read`. */
|
|
4
3
|
export declare const registerDocs: (server: McpServer, deps: SharedDeps) => void;
|
|
5
|
-
//# sourceMappingURL=docs.d.ts.map
|
package/dist/tools/docs.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { errorResult, jsonResult } from './result.js';
|
|
3
|
-
/** Предел размера одного раздела, отдаваемого модели. */
|
|
4
3
|
const MAX_SECTION_BYTES = 12_288;
|
|
5
|
-
/** Регистрирует `cms_docs_search` и `cms_docs_read`. */
|
|
6
4
|
export const registerDocs = (server, deps) => {
|
|
7
5
|
const { knowledge } = deps;
|
|
8
6
|
server.registerTool('cms_docs_search', {
|
|
@@ -37,7 +35,7 @@ export const registerDocs = (server, deps) => {
|
|
|
37
35
|
title: 'Read a CMS knowledge section',
|
|
38
36
|
description: 'Read one section of a knowledge document. Omit the anchor to get the document preamble plus its section list, then page through the sections you need.',
|
|
39
37
|
inputSchema: {
|
|
40
|
-
docId: z.string().min(1).describe('Document id, e.g. "
|
|
38
|
+
docId: z.string().min(1).describe('Document id, e.g. "mcp/docs/api/orders" or "mcp/operating-rules".'),
|
|
41
39
|
anchor: z.string().optional().describe('Section anchor from cms_docs_search; omit for the preamble.'),
|
|
42
40
|
},
|
|
43
41
|
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
@@ -73,7 +71,6 @@ export const registerDocs = (server, deps) => {
|
|
|
73
71
|
sections: doc.anchors.map((a) => ({ anchor: a.anchor, title: a.title, bytes: a.bytes })),
|
|
74
72
|
});
|
|
75
73
|
});
|
|
76
|
-
/** Ресурсы дублируют два самых нужных документа, чтобы клиент мог их закрепить. */
|
|
77
74
|
server.registerResource('operating-rules', 'oneentry://knowledge/mcp/operating-rules', {
|
|
78
75
|
title: 'OneEntry CMS operating rules',
|
|
79
76
|
description: 'The payload and safety rules an agent must follow before writing to this CMS.',
|
|
@@ -110,4 +107,3 @@ export const registerDocs = (server, deps) => {
|
|
|
110
107
|
],
|
|
111
108
|
}));
|
|
112
109
|
};
|
|
113
|
-
//# sourceMappingURL=docs.js.map
|
package/dist/tools/guide.d.ts
CHANGED
|
@@ -1,11 +1,4 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { SharedDeps } from '../session.js';
|
|
3
|
-
/**
|
|
4
|
-
* Собирает краткое руководство: режим, политика, карта тегов и порядок работы.
|
|
5
|
-
* Генерируется, а не хранится текстом, потому что половина содержимого —
|
|
6
|
-
* фактическое состояние сервера, и расхождение здесь дороже дублирования.
|
|
7
|
-
*/
|
|
8
3
|
export declare const renderGuide: (deps: SharedDeps) => string;
|
|
9
|
-
/** Регистрирует `cms_guide`. */
|
|
10
4
|
export declare const registerGuide: (server: McpServer, deps: SharedDeps) => void;
|
|
11
|
-
//# sourceMappingURL=guide.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guide.d.ts","sourceRoot":"","sources":["../../src/tools/guide.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAMhD;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,UAAU,KAAG,
|
|
1
|
+
{"version":3,"file":"guide.d.ts","sourceRoot":"","sources":["../../src/tools/guide.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAMhD;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,UAAU,KAAG,MAoD9C,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,aAAa,GAAI,QAAQ,SAAS,EAAE,MAAM,UAAU,KAAG,IAWnE,CAAC"}
|
package/dist/tools/guide.js
CHANGED
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
import { textResult } from './result.js';
|
|
2
|
-
/** Сколько тегов показывать в карте API. */
|
|
3
2
|
const TAG_LIMIT = 24;
|
|
4
|
-
/**
|
|
5
|
-
* Собирает краткое руководство: режим, политика, карта тегов и порядок работы.
|
|
6
|
-
* Генерируется, а не хранится текстом, потому что половина содержимого —
|
|
7
|
-
* фактическое состояние сервера, и расхождение здесь дороже дублирования.
|
|
8
|
-
*/
|
|
9
3
|
export const renderGuide = (deps) => {
|
|
10
4
|
const { config, catalog, knowledge } = deps;
|
|
11
5
|
const counts = new Map();
|
|
@@ -42,7 +36,8 @@ export const renderGuide = (deps) => {
|
|
|
42
36
|
' payload rules (locale-keyed `localizeInfos`, attribute-set-driven `attributesSets`,',
|
|
43
37
|
' lexorank vs numeric `position`, eventual consistency) that make the difference between',
|
|
44
38
|
' a 400 and a correct call.',
|
|
45
|
-
'2. `cms_docs_search` — find the reference doc for the entity you are touching
|
|
39
|
+
'2. `cms_docs_search` — find the reference doc for the entity you are touching;',
|
|
40
|
+
' `mcp/docs/server/doc-map` lists every document with a one-line "read this when".',
|
|
46
41
|
'3. `cms_api_search` → `cms_api_describe` — get the real operation and its payload shape.',
|
|
47
42
|
'4. `cms_api_call` — `dryRun: true` first for anything that mutates.',
|
|
48
43
|
'',
|
|
@@ -63,7 +58,6 @@ export const renderGuide = (deps) => {
|
|
|
63
58
|
: []),
|
|
64
59
|
].join('\n');
|
|
65
60
|
};
|
|
66
|
-
/** Регистрирует `cms_guide`. */
|
|
67
61
|
export const registerGuide = (server, deps) => {
|
|
68
62
|
server.registerTool('cms_guide', {
|
|
69
63
|
title: 'CMS guide',
|
|
@@ -71,4 +65,3 @@ export const registerGuide = (server, deps) => {
|
|
|
71
65
|
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
72
66
|
}, () => textResult(renderGuide(deps)));
|
|
73
67
|
};
|
|
74
|
-
//# sourceMappingURL=guide.js.map
|
package/dist/tools/guide.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guide.js","sourceRoot":"","sources":["../../src/tools/guide.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,4CAA4C;AAC5C,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAgB,EAAU,EAAE;IACtD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SAC/B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;SACnB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;SAClD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,SAAS,GACb,MAAM,CAAC,KAAK,KAAK,MAAM;QACrB,CAAC,CAAC,0FAA0F;QAC5F,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO;YACxB,CAAC,CAAC,mFAAmF;YACrF,CAAC,CAAC,gGAAgG,CAAC;IAEzG,
|
|
1
|
+
{"version":3,"file":"guide.js","sourceRoot":"","sources":["../../src/tools/guide.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,4CAA4C;AAC5C,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAgB,EAAU,EAAE;IACtD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SAC/B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;SACnB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;SAClD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,SAAS,GACb,MAAM,CAAC,KAAK,KAAK,MAAM;QACrB,CAAC,CAAC,0FAA0F;QAC5F,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO;YACxB,CAAC,CAAC,mFAAmF;YACrF,CAAC,CAAC,gGAAgG,CAAC;IAEzG,OAAO;QACL,wCAAwC;QACxC,EAAE;QACF,WAAW,MAAM,CAAC,IAAI,oBAAoB,MAAM,CAAC,OAAO,gBAAgB,SAAS,GAAG;QACpF,YAAY,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,wBAAwB,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI;QACtG,cAAc,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,WAAW,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG;QACzI,EAAE;QACF,qBAAqB;QACrB,EAAE;QACF,kGAAkG;QAClG,wFAAwF;QACxF,2FAA2F;QAC3F,8BAA8B;QAC9B,gFAAgF;QAChF,0FAA0F;QAC1F,qEAAqE;QACrE,EAAE;QACF,6EAA6E;QAC7E,EAAE;QACF,+BAA+B;QAC/B,EAAE;QACF,IAAI;QACJ,EAAE;QACF,gBAAgB;QAChB,EAAE;QACF,gFAAgF;QAChF,iGAAiG;QACjG,oFAAoF;QACpF,yFAAyF;QACzF,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YACrC,CAAC,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3E,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,gCAAgC;AAChC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAiB,EAAE,IAAgB,EAAQ,EAAE;IACzE,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,2IAA2I;QAC7I,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAC1D,EACD,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CACpC,CAAC;AACJ,CAAC,CAAC"}
|