@hubex/mcp 0.3.0 → 0.4.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/dist/guides/loader.js +5 -1
- package/dist/server.js +16 -1
- package/dist/tools/guides.js +8 -0
- package/docs/guides/start.md +11 -7
- package/package.json +1 -1
package/dist/guides/loader.js
CHANGED
|
@@ -26,7 +26,11 @@ export function loadGuide(topic, dir = GUIDES_DIR) {
|
|
|
26
26
|
if (!existsSync(file)) {
|
|
27
27
|
throw new Error(`Гайд "${topic}" не найден.`);
|
|
28
28
|
}
|
|
29
|
-
|
|
29
|
+
// Фронтматтер (`sources`, `content_hash`) нужен скрипту сверки с вики, а не
|
|
30
|
+
// модели: ~250 лишних символов на каждое чтение, а у start — в системном промпте.
|
|
31
|
+
const text = readFileSync(file, "utf8")
|
|
32
|
+
.replace(/^---\n[\s\S]*?\n---\n/, "")
|
|
33
|
+
.trim();
|
|
30
34
|
guideCache.set(topic, text);
|
|
31
35
|
return text;
|
|
32
36
|
}
|
package/dist/server.js
CHANGED
|
@@ -11,7 +11,22 @@ import { HubexClient } from "./http.js";
|
|
|
11
11
|
import { EndpointIndex, loadIndexFile } from "./index/store.js";
|
|
12
12
|
import { SchemaProvider } from "./schema/describe.js";
|
|
13
13
|
import { buildRegistry } from "./tools/registry.js";
|
|
14
|
+
import { topicIndex } from "./tools/guides.js";
|
|
15
|
+
import { loadGuide } from "./guides/loader.js";
|
|
14
16
|
import { PACKAGE_ROOT, indexFileFor, swaggerDirFor } from "./paths.js";
|
|
17
|
+
/**
|
|
18
|
+
* Уезжает клиенту при `initialize` — единственный канал, который доходит до
|
|
19
|
+
* модели до любого вызова инструмента: у клиентов с ленивой подгрузкой схем
|
|
20
|
+
* до первого вызова видно только имя инструмента, без описания.
|
|
21
|
+
*
|
|
22
|
+
* Поэтому здесь не просьба прочитать гайд, а сам стартовый гайд — порядок
|
|
23
|
+
* работы, протокол и подводные камни — и список топиков, который иначе
|
|
24
|
+
* доступен только из описания `hubex_get_guide`. Текст берётся из
|
|
25
|
+
* docs/guides/start.md, чтобы instructions и сам гайд не разъезжались.
|
|
26
|
+
*/
|
|
27
|
+
export function serverInstructions() {
|
|
28
|
+
return `${loadGuide("start")}\n\n## Гайды по областям\n\n${topicIndex()}.`;
|
|
29
|
+
}
|
|
15
30
|
/** Версия сервера = версия пакета: одна точка правды при релизе. */
|
|
16
31
|
function packageVersion() {
|
|
17
32
|
const pkg = JSON.parse(readFileSync(join(PACKAGE_ROOT, "package.json"), "utf8"));
|
|
@@ -32,7 +47,7 @@ export function createServer(config) {
|
|
|
32
47
|
index,
|
|
33
48
|
schemas,
|
|
34
49
|
});
|
|
35
|
-
const server = new Server({ name: "hubex-mcp", version: packageVersion() }, { capabilities: { tools: {} } });
|
|
50
|
+
const server = new Server({ name: "hubex-mcp", version: packageVersion() }, { capabilities: { tools: {} }, instructions: serverInstructions() });
|
|
36
51
|
// Провайдер создаётся раньше сервера, поэтому способ ввода вносится сюда, а не в конструктор.
|
|
37
52
|
if (config.authMode === "token")
|
|
38
53
|
auth.setPrompter(createElicitPrompter(server));
|
package/dist/tools/guides.js
CHANGED
|
@@ -45,6 +45,14 @@ const TOPIC_GROUPS = [
|
|
|
45
45
|
},
|
|
46
46
|
];
|
|
47
47
|
export const GUIDE_TOPICS = TOPIC_GROUPS.flatMap((g) => Object.keys(g.topics));
|
|
48
|
+
/**
|
|
49
|
+
* Топики по областям, без описаний — для `instructions` сервера. Полный каталог
|
|
50
|
+
* с описаниями живёт в описании инструмента, но у клиентов с ленивой подгрузкой
|
|
51
|
+
* схем оно до первого вызова не видно, поэтому названия дублируем сюда.
|
|
52
|
+
*/
|
|
53
|
+
export function topicIndex() {
|
|
54
|
+
return TOPIC_GROUPS.map((g) => `${g.title.toLowerCase()} — ${Object.keys(g.topics).join(", ")}`).join("; ");
|
|
55
|
+
}
|
|
48
56
|
function guideTool() {
|
|
49
57
|
const topicList = TOPIC_GROUPS.map((g) => `${g.title}: ` +
|
|
50
58
|
Object.entries(g.topics)
|
package/docs/guides/start.md
CHANGED
|
@@ -40,19 +40,23 @@ HubEx REST API организован по сервисам: у каждого
|
|
|
40
40
|
|
|
41
41
|
## Порядок работы с этим сервером
|
|
42
42
|
|
|
43
|
-
1. `
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
1. `hubex_get_guide` с топиком нужной области (заявки, объекты, компании,
|
|
44
|
+
пользователи, материалы, настройки тенанта) — короткий порядок вызовов,
|
|
45
|
+
обязательные поля и типичные ошибки из бизнес-документации HubEx.
|
|
46
|
+
**Это первый шаг, а не факультативный**: гайд называет нужные эндпоинты
|
|
47
|
+
сам, поэтому шаг 2 после него обычно не нужен, а без него шаги 2–3
|
|
48
|
+
превращаются в перебор похожих по названию эндпоинтов.
|
|
49
|
+
2. `hubex_search_*_endpoints` — найти эндпоинт, если гайд его не назвал или
|
|
50
|
+
подходящей области не нашлось. Запрос можно писать по-русски.
|
|
46
51
|
3. `hubex_describe_endpoint` — получить полную JSON Schema тела и параметров
|
|
47
52
|
найденного эндпоинта, уже с аннотациями бизнес-полей (описание,
|
|
48
53
|
обязательность, справочник-подсказка, если поле есть в оверлее).
|
|
49
54
|
4. `hubex_request_*` — выполнить сам HTTP-запрос к HubEx с телом, собранным
|
|
50
55
|
по схеме из шага 3.
|
|
51
56
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
типичные ошибки, собранные из бизнес-документации HubEx.
|
|
57
|
+
`hubex_list_scopes` — вспомогательный инструмент: показывает сервисы и ресурсы
|
|
58
|
+
внутри них, когда неизвестна даже область. В обычном сценарии он не нужен,
|
|
59
|
+
шаг 1 отвечает на тот же вопрос точнее.
|
|
56
60
|
|
|
57
61
|
## Подводные камни
|
|
58
62
|
|