@hubex/mcp 0.6.20260910 → 0.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/dist/auth.js +15 -2
- package/dist/generated/manifest.js +3643 -0
- package/dist/http.js +16 -5
- package/dist/token-prompt.js +3 -1
- package/dist/tools/types.js +1 -0
- package/package.json +1 -1
package/dist/http.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* injects auth + `X-Application-ID`, and normalizes responses and errors.
|
|
4
4
|
*/
|
|
5
5
|
import { maskPii } from "./pii/mask.js";
|
|
6
|
+
import { SET_TOKEN_TOOL } from "./token-prompt.js";
|
|
6
7
|
/**
|
|
7
8
|
* Заголовки, которые клиент проставляет сам. Подмена `Authorization` или
|
|
8
9
|
* `X-Application-ID` сменила бы того, от чьего имени идёт запрос, поэтому
|
|
@@ -20,15 +21,15 @@ export class HubexApiError extends Error {
|
|
|
20
21
|
service;
|
|
21
22
|
path;
|
|
22
23
|
payload;
|
|
23
|
-
constructor(status, service, path, payload) {
|
|
24
|
-
super(HubexApiError.format(status, service, path, payload));
|
|
24
|
+
constructor(status, service, path, payload, env) {
|
|
25
|
+
super(HubexApiError.format(status, service, path, payload, env));
|
|
25
26
|
this.status = status;
|
|
26
27
|
this.service = service;
|
|
27
28
|
this.path = path;
|
|
28
29
|
this.payload = payload;
|
|
29
30
|
this.name = "HubexApiError";
|
|
30
31
|
}
|
|
31
|
-
static format(status, service, path, payload) {
|
|
32
|
+
static format(status, service, path, payload, env) {
|
|
32
33
|
let detail = "";
|
|
33
34
|
if (typeof payload === "string") {
|
|
34
35
|
detail = payload;
|
|
@@ -41,7 +42,17 @@ export class HubexApiError extends Error {
|
|
|
41
42
|
else if (payload && typeof payload === "object") {
|
|
42
43
|
detail = JSON.stringify(payload).slice(0, 800);
|
|
43
44
|
}
|
|
44
|
-
|
|
45
|
+
let message = `HubEx ${service} ${path} -> HTTP ${status}${detail ? `: ${detail}` : ""}`;
|
|
46
|
+
// 401 здесь чаще всего не «токен протух», а «токен не из этого окружения»:
|
|
47
|
+
// dev/stg/prod выдают JWT с разными ключами подписи, и токен из другого
|
|
48
|
+
// контура падает именно так, без более внятной причины от самого HubEx.
|
|
49
|
+
if (status === 401 && env) {
|
|
50
|
+
message +=
|
|
51
|
+
` Сейчас выбрано окружение HUBEX_ENV=${env}. Если токен был получен в другом окружении ` +
|
|
52
|
+
`(dev/stg/prod), авторизация не пройдёт — убедись, что токен именно из ${env}, и при ` +
|
|
53
|
+
`необходимости передай новый через ${SET_TOKEN_TOOL}.`;
|
|
54
|
+
}
|
|
55
|
+
return message;
|
|
45
56
|
}
|
|
46
57
|
}
|
|
47
58
|
function buildQueryString(query) {
|
|
@@ -111,7 +122,7 @@ export class HubexClient {
|
|
|
111
122
|
exposed[name] = value;
|
|
112
123
|
}
|
|
113
124
|
if (!res.ok) {
|
|
114
|
-
throw new HubexApiError(res.status, req.service, req.path, visible ?? text);
|
|
125
|
+
throw new HubexApiError(res.status, req.service, req.path, visible ?? text, this.config.env);
|
|
115
126
|
}
|
|
116
127
|
return { status: res.status, data: visible, headers: exposed };
|
|
117
128
|
}
|
package/dist/token-prompt.js
CHANGED
|
@@ -30,7 +30,9 @@ export function createElicitPrompter(server) {
|
|
|
30
30
|
},
|
|
31
31
|
});
|
|
32
32
|
if (result.action !== "accept") {
|
|
33
|
-
throw new Error("Ввод токена отменён — авторизоваться в HubEx не удалось."
|
|
33
|
+
throw new Error("Ввод токена отменён — авторизоваться в HubEx не удалось. " +
|
|
34
|
+
"Если клиент заявляет поддержку elicitation, но не показывает форму ввода " +
|
|
35
|
+
`(так себя ведёт часть хостов), вызови инструмент ${SET_TOKEN_TOOL} и передай access-токен HubEx напрямую.`);
|
|
34
36
|
}
|
|
35
37
|
const token = result.content?.token;
|
|
36
38
|
if (typeof token !== "string" || token.trim() === "") {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED