mcp-user-system 2.0.2 → 2.0.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/dist/env.d.ts CHANGED
@@ -3,6 +3,8 @@
3
3
  */
4
4
  export interface Config {
5
5
  baseUrl: string;
6
- accessToken: string;
6
+ accessToken?: string;
7
+ username?: string;
8
+ password?: string;
7
9
  }
8
10
  export declare function loadConfig(): Config;
package/dist/env.js CHANGED
@@ -8,10 +8,23 @@ function requireEnv(name) {
8
8
  }
9
9
  return value;
10
10
  }
11
+ function optionalEnv(name) {
12
+ return process.env[name] || undefined;
13
+ }
11
14
  export function loadConfig() {
15
+ const accessToken = optionalEnv("TUS_ACCESS_TOKEN");
16
+ const username = optionalEnv("TUS_USERNAME");
17
+ const password = optionalEnv("TUS_PASSWORD");
18
+ if (!accessToken && (!username || !password)) {
19
+ throw new Error("Authentication required: provide TUS_ACCESS_TOKEN, or both TUS_USERNAME and TUS_PASSWORD");
20
+ }
21
+ // 默认 http://localhost:7081,防止环境变量未正确传入时 baseUrl 为 "null"
22
+ const baseUrl = process.env["TUS_BASE_URL"] || "http://localhost:7081";
12
23
  return {
13
- baseUrl: requireEnv("TUS_BASE_URL"),
14
- accessToken: requireEnv("TUS_ACCESS_TOKEN"),
24
+ baseUrl,
25
+ accessToken,
26
+ username,
27
+ password,
15
28
  };
16
29
  }
17
30
  //# sourceMappingURL=env.js.map
package/dist/env.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC;QACnC,WAAW,EAAE,UAAU,CAAC,kBAAkB,CAAC;KAC5C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,WAAW,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAE7C,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;IACJ,CAAC;IAED,yDAAyD;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,uBAAuB,CAAC;IAEvE,OAAO;QACL,OAAO;QACP,WAAW;QACX,QAAQ;QACR,QAAQ;KACT,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -3,6 +3,6 @@
3
3
  * MCP Server for token-user-system
4
4
  *
5
5
  * Provides tools via Model Context Protocol, organized by domain:
6
- * user, dashboard, wallet, team, tokens, invoice, misc
6
+ * auth, user, dashboard, wallet, team, tokens, invoice, misc
7
7
  */
8
8
  export {};
package/dist/index.js CHANGED
@@ -3,11 +3,12 @@
3
3
  * MCP Server for token-user-system
4
4
  *
5
5
  * Provides tools via Model Context Protocol, organized by domain:
6
- * user, dashboard, wallet, team, tokens, invoice, misc
6
+ * auth, user, dashboard, wallet, team, tokens, invoice, misc
7
7
  */
8
8
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
9
9
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
10
10
  import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
11
+ import * as authTools from "./tools/auth.js";
11
12
  import * as userTools from "./tools/user.js";
12
13
  import * as dashboardTools from "./tools/dashboard.js";
13
14
  import * as walletTools from "./tools/wallet.js";
@@ -17,6 +18,7 @@ import * as invoiceTools from "./tools/invoice.js";
17
18
  import * as miscTools from "./tools/misc.js";
18
19
  // ── Merge all tool definitions ──
19
20
  const allTools = [
21
+ ...authTools.tools,
20
22
  ...userTools.tools,
21
23
  ...dashboardTools.tools,
22
24
  ...walletTools.tools,
@@ -28,7 +30,7 @@ const allTools = [
28
30
  // ── MCP Server Setup ──
29
31
  const server = new Server({
30
32
  name: "mcp-user-system",
31
- version: "2.0.0",
33
+ version: "2.0.2",
32
34
  }, {
33
35
  capabilities: {
34
36
  tools: {},
@@ -44,6 +46,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
44
46
  const parsedArgs = (args ?? {});
45
47
  // 构建域路由映射
46
48
  const domains = [
49
+ { names: authTools.tools.map((t) => t.name), handler: authTools.handle },
47
50
  { names: userTools.tools.map((t) => t.name), handler: userTools.handle },
48
51
  { names: dashboardTools.tools.map((t) => t.name), handler: dashboardTools.handle },
49
52
  { names: walletTools.tools.map((t) => t.name), handler: walletTools.handle },
@@ -80,6 +83,17 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
80
83
  });
81
84
  // ── Start Server ──
82
85
  async function main() {
86
+ // 尝试自动登录(配置了用户名密码但没有 token 时)
87
+ try {
88
+ const loggedIn = await authTools.tryAutoLogin();
89
+ if (loggedIn) {
90
+ console.error("Auto-login successful using TUS_USERNAME/TUS_PASSWORD");
91
+ }
92
+ }
93
+ catch (err) {
94
+ const message = err instanceof Error ? err.message : String(err);
95
+ console.error(`Auto-login failed: ${message}`);
96
+ }
83
97
  const transport = new StdioServerTransport();
84
98
  await server.connect(transport);
85
99
  console.error("mcp-user-system server running on stdio");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAE7C,mCAAmC;AAEnC,MAAM,QAAQ,GAAG;IACf,GAAG,SAAS,CAAC,KAAK;IAClB,GAAG,cAAc,CAAC,KAAK;IACvB,GAAG,WAAW,CAAC,KAAK;IACpB,GAAG,SAAS,CAAC,KAAK;IAClB,GAAG,WAAW,CAAC,KAAK;IACpB,GAAG,YAAY,CAAC,KAAK;IACrB,GAAG,SAAS,CAAC,KAAK;CACnB,CAAC;AAEF,yBAAyB;AAEzB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,iBAAiB;IACvB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,0BAA0B;AAE1B,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,EAAE,QAAQ;CAChB,CAAC,CAAC,CAAC;AAEJ,yBAAyB;AAEzB,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,MAAM,UAAU,GAAG,CAAC,IAAI,IAAI,EAAE,CAA2B,CAAC;IAE1D,UAAU;IACV,MAAM,OAAO,GAGR;QACH,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE;QACxE,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE;QAClF,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE;QAC5E,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE;QACxE,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE;QAC5E,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,MAAM,EAAE;QAC9E,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE;KACzE,CAAC;IAEF,YAAY;IACZ,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBACpD,MAAM,IAAI,GAAG,IAAI,KAAK,SAAS;oBAC7B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC/B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;gBAC9C,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;iBAC3C,CAAC;YACJ,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;oBAC/D,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;QACnE,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,qBAAqB;AAErB,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC3D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export declare const tools: ({
2
+ name: string;
3
+ description: string;
4
+ inputSchema: {
5
+ type: "object";
6
+ properties: {
7
+ username: {
8
+ type: string;
9
+ description: string;
10
+ };
11
+ password: {
12
+ type: string;
13
+ description: string;
14
+ };
15
+ };
16
+ required: string[];
17
+ };
18
+ } | {
19
+ name: string;
20
+ description: string;
21
+ inputSchema: {
22
+ type: "object";
23
+ properties: {
24
+ username?: undefined;
25
+ password?: undefined;
26
+ };
27
+ required: never[];
28
+ };
29
+ })[];
30
+ export declare function handle(name: string, args: Record<string, string>): Promise<unknown>;
31
+ /**
32
+ * 执行密码登录
33
+ * POST /console/user/login
34
+ * 前端 request 拦截器会将整个 JSON body AES 加密后以 { data: "<base64>" } 发送,
35
+ * 后端有对应的解密过滤器还原原始 body。MCP 需模拟相同行为。
36
+ * 响应格式: { code: 200, msg: "操作成功", token: "eyJ..." }
37
+ */
38
+ export declare function doLogin(username: string, password: string): Promise<unknown>;
39
+ /**
40
+ * 尝试使用环境变量中的用户名密码自动登录
41
+ * 返回 true 表示登录成功,false 表示跳过(无凭据或已有 token)
42
+ */
43
+ export declare function tryAutoLogin(): Promise<boolean>;
44
+ /**
45
+ * 强制使用环境变量中的用户名密码重新登录(用于 token 失效后的自动恢复)
46
+ * 返回 true 表示登录成功,false 表示无法重试(未配置凭据)
47
+ */
48
+ export declare function tryRelogin(): Promise<boolean>;
@@ -0,0 +1,123 @@
1
+ import { apiPostRaw, setToken, getToken } from "./client.js";
2
+ import { loadConfig } from "../env.js";
3
+ import { aesEncrypt } from "./crypto.js";
4
+ // ---- 工具定义 ----
5
+ export const tools = [
6
+ {
7
+ name: "login",
8
+ description: "使用用户名(或手机号)和密码登录系统,获取访问令牌。" +
9
+ "登录成功后后续请求将自动使用该令牌。",
10
+ inputSchema: {
11
+ type: "object",
12
+ properties: {
13
+ username: { type: "string", description: "用户名或手机号" },
14
+ password: { type: "string", description: "密码" },
15
+ },
16
+ required: ["username", "password"],
17
+ },
18
+ },
19
+ {
20
+ name: "get_token_status",
21
+ description: "查看当前认证状态(是否已登录、token 来源)",
22
+ inputSchema: {
23
+ type: "object",
24
+ properties: {},
25
+ required: [],
26
+ },
27
+ },
28
+ ];
29
+ // ---- 处理函数 ----
30
+ export async function handle(name, args) {
31
+ switch (name) {
32
+ case "login":
33
+ return doLogin(args.username, args.password);
34
+ case "get_token_status":
35
+ return getTokenStatus();
36
+ default:
37
+ throw new Error(`Unknown tool: ${name}`);
38
+ }
39
+ }
40
+ // ---- 内部函数 ----
41
+ /**
42
+ * 执行密码登录
43
+ * POST /console/user/login
44
+ * 前端 request 拦截器会将整个 JSON body AES 加密后以 { data: "<base64>" } 发送,
45
+ * 后端有对应的解密过滤器还原原始 body。MCP 需模拟相同行为。
46
+ * 响应格式: { code: 200, msg: "操作成功", token: "eyJ..." }
47
+ */
48
+ export async function doLogin(username, password) {
49
+ // 构造原始请求体(与前端登录组件一致)
50
+ const plainBody = { username, password, loginSms: false };
51
+ // AES-128-CBC 加密整个 JSON body → Base64
52
+ const encryptedData = aesEncrypt(JSON.stringify(plainBody));
53
+ // 以 { data: "<encrypted>" } 格式发送(与前端 request.js 拦截器行为一致)
54
+ const response = await apiPostRaw("/console/user/login", { data: encryptedData });
55
+ // Debug: 打印完整后端响应
56
+ if (process.env.TUS_DEBUG) {
57
+ console.error("[MCP-DEBUG] login 响应:", JSON.stringify(response).slice(0, 1000));
58
+ }
59
+ // 兼容多种响应格式:
60
+ // 格式1: { code: 200, msg: "操作成功", token: "eyJ..." } (AjaxResult.put)
61
+ // 格式2: { code: 200, msg: "操作成功", data: { token: "eyJ..." } }
62
+ // 格式3: { code: 200, data: "eyJ..." } (token 直接作为 data)
63
+ const code = response.code;
64
+ if (code !== undefined && code !== 200) {
65
+ throw new Error(`登录失败 (${code}): ${response.msg}`);
66
+ }
67
+ // 从多个位置尝试获取 token
68
+ const token = response.token ?? response.data?.token ?? (typeof response.data === "string" ? response.data : undefined);
69
+ if (!token) {
70
+ // 打印完整响应帮助调试
71
+ const keys = Object.keys(response);
72
+ throw new Error(`登录成功但未返回 token,响应字段: [${keys.join(", ")}],完整响应: ${JSON.stringify(response).slice(0, 500)}`);
73
+ }
74
+ setToken(token);
75
+ return {
76
+ success: true,
77
+ message: "登录成功,后续请求将自动使用该令牌",
78
+ user: username,
79
+ };
80
+ }
81
+ /**
82
+ * 尝试使用环境变量中的用户名密码自动登录
83
+ * 返回 true 表示登录成功,false 表示跳过(无凭据或已有 token)
84
+ */
85
+ export async function tryAutoLogin() {
86
+ const config = loadConfig();
87
+ // 已有 token 则跳过
88
+ if (getToken()) {
89
+ return false;
90
+ }
91
+ // 无用户名密码则跳过
92
+ if (!config.username || !config.password) {
93
+ return false;
94
+ }
95
+ await doLogin(config.username, config.password);
96
+ return true;
97
+ }
98
+ /**
99
+ * 强制使用环境变量中的用户名密码重新登录(用于 token 失效后的自动恢复)
100
+ * 返回 true 表示登录成功,false 表示无法重试(未配置凭据)
101
+ */
102
+ export async function tryRelogin() {
103
+ const config = loadConfig();
104
+ if (!config.username || !config.password) {
105
+ return false;
106
+ }
107
+ await doLogin(config.username, config.password);
108
+ return true;
109
+ }
110
+ function getTokenStatus() {
111
+ const token = getToken();
112
+ const config = loadConfig();
113
+ return {
114
+ authenticated: !!token,
115
+ tokenSource: token
116
+ ? config.accessToken === token
117
+ ? "环境变量 (TUS_ACCESS_TOKEN)"
118
+ : "登录获取"
119
+ : "无",
120
+ hasCredentials: !!(config.username && config.password),
121
+ };
122
+ }
123
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"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"}
@@ -4,16 +4,26 @@ interface TableDataInfo<T = unknown> {
4
4
  total: number;
5
5
  rows: T[];
6
6
  }
7
+ export declare function getToken(): string | undefined;
8
+ export declare function setToken(token: string): void;
7
9
  /**
8
10
  * 发起 GET 请求
11
+ * 与前端 request.js 一致:params 加密后作为 ?data=<encrypted> 发送
9
12
  */
10
13
  export declare function apiGet<T = unknown>(path: string, params?: Record<string, string | undefined>): Promise<T>;
11
14
  /**
12
15
  * 发起 GET 请求,返回分页数据(TableDataInfo 格式)
16
+ * 与前端 request.js 一致:params 加密后作为 ?data=<encrypted> 发送
13
17
  */
14
18
  export declare function apiGetPage<T = unknown>(path: string, params?: Record<string, string | undefined>): Promise<TableDataInfo<T>>;
15
19
  /**
16
- * 发起 POST 请求
20
+ * 发起 POST 请求(携带 Authorization 头)
21
+ * 与前端 request.js 一致:body 加密后以 { data: "<encrypted>" } 发送
17
22
  */
18
23
  export declare function apiPost<T = unknown>(path: string, body?: unknown): Promise<T>;
24
+ /**
25
+ * 发起 POST 请求,不携带 Authorization 头,返回完整 JSON 响应
26
+ * 用于登录等无需认证的接口
27
+ */
28
+ export declare function apiPostRaw(path: string, body?: unknown): Promise<Record<string, unknown>>;
19
29
  export {};
@@ -1,119 +1,236 @@
1
1
  import { loadConfig } from "../env.js";
2
+ import { tryRelogin } from "./auth.js";
3
+ import { aesEncrypt } from "./crypto.js";
4
+ // ── Debug logging ──
5
+ function debugLog(label, ...args) {
6
+ if (process.env.TUS_DEBUG) {
7
+ console.error(`[MCP-DEBUG] ${label}`, ...args);
8
+ }
9
+ }
10
+ // ── Token management ──
11
+ let currentToken = loadConfig().accessToken;
12
+ export function getToken() {
13
+ return currentToken;
14
+ }
15
+ export function setToken(token) {
16
+ currentToken = token;
17
+ }
18
+ // ── Helpers ──
2
19
  function getBaseUrl() {
3
20
  const config = loadConfig();
4
- return config.baseUrl.replace(/\/+$/, "");
21
+ // 后端所有接口均在 /api 路径下
22
+ return config.baseUrl.replace(/\/+$/, "") + "/api";
23
+ }
24
+ // ── 标准请求头(与前端 request.js 拦截器一致) ──
25
+ const COMMON_HEADERS = {
26
+ "Content-Type": "application/json",
27
+ "Crypto-Version": "1.0.0",
28
+ "accountType": "S_",
29
+ "platformType": "WEB_",
30
+ "DeviceType": "browser",
31
+ };
32
+ function getAuthHeaders() {
33
+ const token = currentToken ?? loadConfig().accessToken;
34
+ if (!token) {
35
+ throw new Error("未登录,请先使用 login 工具登录,或在环境变量中配置 TUS_ACCESS_TOKEN");
36
+ }
37
+ return {
38
+ ...COMMON_HEADERS,
39
+ "Authorization": `Bearer ${token}`,
40
+ };
41
+ }
42
+ /**
43
+ * 判断错误是否为认证相关错误(token 过期、无效等)
44
+ */
45
+ function isAuthError(error) {
46
+ if (!(error instanceof Error))
47
+ return false;
48
+ const msg = error.message.toLowerCase();
49
+ // HTTP 401
50
+ if (msg.includes("401"))
51
+ return true;
52
+ // 业务错误关键词
53
+ const authKeywords = ["token", "认证", "登录", "过期", "expired", "unauthorized", "无效"];
54
+ return authKeywords.some((kw) => msg.includes(kw));
55
+ }
56
+ /**
57
+ * 尝试自动重新登录并重试请求
58
+ * 如果配置了用户名密码且当前错误是认证错误,则重新登录后重试一次
59
+ */
60
+ async function withAutoRetry(requestFn) {
61
+ try {
62
+ return await requestFn();
63
+ }
64
+ catch (err) {
65
+ if (!isAuthError(err)) {
66
+ throw err;
67
+ }
68
+ // 尝试用用户名密码重新登录
69
+ const reloggedIn = await tryRelogin();
70
+ if (!reloggedIn) {
71
+ throw err; // 无法重试,抛出原始错误
72
+ }
73
+ // 用新 token 重试
74
+ return await requestFn();
75
+ }
5
76
  }
6
77
  /**
7
78
  * 发起 GET 请求
79
+ * 与前端 request.js 一致:params 加密后作为 ?data=<encrypted> 发送
8
80
  */
9
81
  export async function apiGet(path, params) {
10
- const config = loadConfig();
11
- const query = new URLSearchParams();
12
- if (params) {
13
- for (const [key, value] of Object.entries(params)) {
14
- if (value !== undefined && value !== "") {
15
- query.append(key, value);
82
+ return withAutoRetry(async () => {
83
+ // 构建参数对象(过滤空值)
84
+ const cleanParams = {};
85
+ if (params) {
86
+ for (const [key, value] of Object.entries(params)) {
87
+ if (value !== undefined && value !== "") {
88
+ cleanParams[key] = value;
89
+ }
16
90
  }
17
91
  }
18
- }
19
- const qs = query.toString();
20
- const url = `${getBaseUrl()}${path}${qs ? "?" + qs : ""}`;
21
- const controller = new AbortController();
22
- const timeout = setTimeout(() => controller.abort(), 30000);
23
- try {
24
- const res = await fetch(url, {
25
- method: "GET",
26
- headers: {
27
- "Authorization": `Bearer ${config.accessToken}`,
28
- "Content-Type": "application/json",
29
- },
30
- signal: controller.signal,
31
- });
32
- const text = await res.text();
33
- if (!res.ok) {
34
- throw new Error(`HTTP ${res.status}: ${text}`);
35
- }
36
- const json = JSON.parse(text);
37
- if (json.code !== 200) {
38
- throw new Error(`API error (${json.code}): ${json.msg}`);
92
+ // 加密参数:JSON → AES → Base64 → ?data=<encrypted>
93
+ // 注意:与前端一致,不做 encodeURIComponent,后端用 replace(" ","+") 补偿
94
+ const hasParams = Object.keys(cleanParams).length > 0;
95
+ const url = hasParams
96
+ ? `${getBaseUrl()}${path}?data=${aesEncrypt(JSON.stringify(cleanParams))}`
97
+ : `${getBaseUrl()}${path}`;
98
+ debugLog(`GET ${url}`);
99
+ const controller = new AbortController();
100
+ const timeout = setTimeout(() => controller.abort(), 30000);
101
+ try {
102
+ const res = await fetch(url, {
103
+ method: "GET",
104
+ headers: getAuthHeaders(),
105
+ signal: controller.signal,
106
+ });
107
+ const text = await res.text();
108
+ debugLog(`GET ${path} → ${res.status}`, text.slice(0, 500));
109
+ if (!res.ok) {
110
+ throw new Error(`HTTP ${res.status}: ${text}`);
111
+ }
112
+ const json = JSON.parse(text);
113
+ if (json.code !== 200) {
114
+ throw new Error(`API error (${json.code}): ${json.msg}`);
115
+ }
116
+ // 兼容 R<> 格式(有 data 字段)和 AjaxResult 格式(无 data 字段)
117
+ if ('data' in json) {
118
+ return json.data;
119
+ }
120
+ return json;
39
121
  }
40
- // 兼容 R<> 格式(有 data 字段)和 AjaxResult 格式(无 data 字段)
41
- if ('data' in json) {
42
- return json.data;
122
+ finally {
123
+ clearTimeout(timeout);
43
124
  }
44
- return json;
45
- }
46
- finally {
47
- clearTimeout(timeout);
48
- }
125
+ });
49
126
  }
50
127
  /**
51
128
  * 发起 GET 请求,返回分页数据(TableDataInfo 格式)
129
+ * 与前端 request.js 一致:params 加密后作为 ?data=<encrypted> 发送
52
130
  */
53
131
  export async function apiGetPage(path, params) {
54
- const config = loadConfig();
55
- const query = new URLSearchParams();
56
- if (params) {
57
- for (const [key, value] of Object.entries(params)) {
58
- if (value !== undefined && value !== "") {
59
- query.append(key, value);
132
+ return withAutoRetry(async () => {
133
+ // 构建参数对象(过滤空值)
134
+ const cleanParams = {};
135
+ if (params) {
136
+ for (const [key, value] of Object.entries(params)) {
137
+ if (value !== undefined && value !== "") {
138
+ cleanParams[key] = value;
139
+ }
60
140
  }
61
141
  }
62
- }
63
- const qs = query.toString();
64
- const url = `${getBaseUrl()}${path}${qs ? "?" + qs : ""}`;
65
- const controller = new AbortController();
66
- const timeout = setTimeout(() => controller.abort(), 30000);
67
- try {
68
- const res = await fetch(url, {
69
- method: "GET",
70
- headers: {
71
- "Authorization": `Bearer ${config.accessToken}`,
72
- "Content-Type": "application/json",
73
- },
74
- signal: controller.signal,
75
- });
76
- const text = await res.text();
77
- if (!res.ok) {
78
- throw new Error(`HTTP ${res.status}: ${text}`);
142
+ // 加密参数:JSON → AES → Base64 → ?data=<encrypted>
143
+ // 注意:与前端一致,不做 encodeURIComponent,后端用 replace(" ","+") 补偿
144
+ const hasParams = Object.keys(cleanParams).length > 0;
145
+ const url = hasParams
146
+ ? `${getBaseUrl()}${path}?data=${aesEncrypt(JSON.stringify(cleanParams))}`
147
+ : `${getBaseUrl()}${path}`;
148
+ debugLog(`GET(page) ${url}`);
149
+ const controller = new AbortController();
150
+ const timeout = setTimeout(() => controller.abort(), 30000);
151
+ try {
152
+ const res = await fetch(url, {
153
+ method: "GET",
154
+ headers: getAuthHeaders(),
155
+ signal: controller.signal,
156
+ });
157
+ const text = await res.text();
158
+ debugLog(`GET(page) ${path} → ${res.status}`, text.slice(0, 500));
159
+ if (!res.ok) {
160
+ throw new Error(`HTTP ${res.status}: ${text}`);
161
+ }
162
+ const json = JSON.parse(text);
163
+ if (json.code !== undefined && json.code !== 200 && json.code !== 0) {
164
+ throw new Error(`API error (${json.code}): ${json.msg}`);
165
+ }
166
+ return json;
79
167
  }
80
- const json = JSON.parse(text);
81
- if (json.code !== undefined && json.code !== 200 && json.code !== 0) {
82
- throw new Error(`API error (${json.code}): ${json.msg}`);
168
+ finally {
169
+ clearTimeout(timeout);
83
170
  }
84
- return json;
85
- }
86
- finally {
87
- clearTimeout(timeout);
88
- }
171
+ });
89
172
  }
90
173
  /**
91
- * 发起 POST 请求
174
+ * 发起 POST 请求(携带 Authorization 头)
175
+ * 与前端 request.js 一致:body 加密后以 { data: "<encrypted>" } 发送
92
176
  */
93
177
  export async function apiPost(path, body) {
94
- const config = loadConfig();
178
+ return withAutoRetry(async () => {
179
+ const url = `${getBaseUrl()}${path}`;
180
+ // 加密 body:JSON → AES → Base64 → { data: "<encrypted>" }
181
+ const encryptedBody = body
182
+ ? { data: aesEncrypt(JSON.stringify(body)) }
183
+ : undefined;
184
+ const bodyStr = encryptedBody ? JSON.stringify(encryptedBody) : undefined;
185
+ debugLog(`POST ${url}`, body ? `原始: ${JSON.stringify(body).slice(0, 300)}` : "(无body)");
186
+ const controller = new AbortController();
187
+ const timeout = setTimeout(() => controller.abort(), 30000);
188
+ try {
189
+ const res = await fetch(url, {
190
+ method: "POST",
191
+ headers: getAuthHeaders(),
192
+ body: bodyStr,
193
+ signal: controller.signal,
194
+ });
195
+ const text = await res.text();
196
+ debugLog(`POST ${path} → ${res.status}`, text.slice(0, 500));
197
+ if (!res.ok) {
198
+ throw new Error(`HTTP ${res.status}: ${text}`);
199
+ }
200
+ const json = JSON.parse(text);
201
+ if (json.code !== 200) {
202
+ throw new Error(`API error (${json.code}): ${json.msg}`);
203
+ }
204
+ return json.data;
205
+ }
206
+ finally {
207
+ clearTimeout(timeout);
208
+ }
209
+ });
210
+ }
211
+ /**
212
+ * 发起 POST 请求,不携带 Authorization 头,返回完整 JSON 响应
213
+ * 用于登录等无需认证的接口
214
+ */
215
+ export async function apiPostRaw(path, body) {
95
216
  const url = `${getBaseUrl()}${path}`;
217
+ const bodyStr = body ? JSON.stringify(body) : undefined;
218
+ debugLog(`POST(raw) ${url}`, bodyStr?.slice(0, 500));
96
219
  const controller = new AbortController();
97
220
  const timeout = setTimeout(() => controller.abort(), 30000);
98
221
  try {
99
222
  const res = await fetch(url, {
100
223
  method: "POST",
101
- headers: {
102
- "Authorization": `Bearer ${config.accessToken}`,
103
- "Content-Type": "application/json",
104
- },
105
- body: body ? JSON.stringify(body) : undefined,
224
+ headers: COMMON_HEADERS,
225
+ body: bodyStr,
106
226
  signal: controller.signal,
107
227
  });
108
228
  const text = await res.text();
229
+ debugLog(`POST(raw) ${path} → ${res.status}`, text.slice(0, 500));
109
230
  if (!res.ok) {
110
231
  throw new Error(`HTTP ${res.status}: ${text}`);
111
232
  }
112
- const json = JSON.parse(text);
113
- if (json.code !== 200) {
114
- throw new Error(`API error (${json.code}): ${json.msg}`);
115
- }
116
- return json.data;
233
+ return JSON.parse(text);
117
234
  }
118
235
  finally {
119
236
  clearTimeout(timeout);
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/tools/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAevC,SAAS,UAAU;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAc,IAAY,EAAE,MAA2C;IACjG,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACxC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,GAAG,UAAU,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAE1D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE;gBAC/C,cAAc,EAAE,kBAAkB;aACnC;YACD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,GAAmB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,iDAAiD;QACjD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAc,IAAY,EAAE,MAA2C;IACrG,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACxC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,GAAG,UAAU,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAE1D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE;gBAC/C,cAAc,EAAE,kBAAkB;aACnC;YACD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAwB,CAAC;IAClC,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAc,IAAY,EAAE,IAAc;IACrE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,GAAG,UAAU,EAAE,GAAG,IAAI,EAAE,CAAC;IAErC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE;gBAC/C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,GAAmB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/tools/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function aesEncrypt(data: string): string;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * AES-128-CBC 加密工具(与前端 crypto-js 保持一致)
3
+ *
4
+ * Key: 'Kvz4P00D79JiXdM8' (16 字节)
5
+ * IV: 同 Key
6
+ * Padding: PKCS7
7
+ * 输出: Base64
8
+ */
9
+ import { createCipheriv } from "crypto";
10
+ const AES_KEY = "Kvz4P00D79JiXdM8";
11
+ export function aesEncrypt(data) {
12
+ const key = Buffer.from(AES_KEY, "latin1");
13
+ const iv = key; // 前端 iv = key
14
+ const cipher = createCipheriv("aes-128-cbc", key, iv);
15
+ const encrypted = Buffer.concat([cipher.update(data, "utf8"), cipher.final()]);
16
+ return encrypted.toString("base64");
17
+ }
18
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/tools/crypto.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,OAAO,GAAG,kBAAkB,CAAC;AAEnC,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,cAAc;IAC9B,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC/E,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-user-system",
3
- "version": "2.0.2",
3
+ "version": "2.0.4",
4
4
  "description": "MCP server for token-user-system — Console 前台全量查询接口 (JWT Bearer Token)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",