@leeguoo/yapi-mcp 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.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +299 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +32 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config.d.ts +22 -0
  7. package/dist/config.js +174 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/index.d.ts +5 -0
  10. package/dist/index.js +58 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/server.d.ts +21 -0
  13. package/dist/server.js +847 -0
  14. package/dist/server.js.map +1 -0
  15. package/dist/services/yapi/api.d.ts +56 -0
  16. package/dist/services/yapi/api.js +432 -0
  17. package/dist/services/yapi/api.js.map +1 -0
  18. package/dist/services/yapi/auth.d.ts +24 -0
  19. package/dist/services/yapi/auth.js +239 -0
  20. package/dist/services/yapi/auth.js.map +1 -0
  21. package/dist/services/yapi/authCache.d.ts +29 -0
  22. package/dist/services/yapi/authCache.js +172 -0
  23. package/dist/services/yapi/authCache.js.map +1 -0
  24. package/dist/services/yapi/cache.d.ts +14 -0
  25. package/dist/services/yapi/cache.js +232 -0
  26. package/dist/services/yapi/cache.js.map +1 -0
  27. package/dist/services/yapi/logger.d.ts +17 -0
  28. package/dist/services/yapi/logger.js +61 -0
  29. package/dist/services/yapi/logger.js.map +1 -0
  30. package/dist/services/yapi/types.d.ts +102 -0
  31. package/dist/services/yapi/types.js +3 -0
  32. package/dist/services/yapi/types.js.map +1 -0
  33. package/dist/services/yapi.d.ts +28 -0
  34. package/dist/services/yapi.js +84 -0
  35. package/dist/services/yapi.js.map +1 -0
  36. package/dist/skill/install.d.ts +1 -0
  37. package/dist/skill/install.js +724 -0
  38. package/dist/skill/install.js.map +1 -0
  39. package/dist/yapi-cli.d.ts +2 -0
  40. package/dist/yapi-cli.js +592 -0
  41. package/dist/yapi-cli.js.map +1 -0
  42. package/package.json +77 -0
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.YApiAuthService = void 0;
37
+ const axios_1 = __importStar(require("axios"));
38
+ const logger_1 = require("./logger");
39
+ const authCache_1 = require("./authCache");
40
+ function pickCookieValue(setCookie, key) {
41
+ if (!setCookie || setCookie.length === 0)
42
+ return undefined;
43
+ const prefix = `${key}=`;
44
+ for (const item of setCookie) {
45
+ const trimmed = String(item || "").trim();
46
+ if (!trimmed.startsWith(prefix))
47
+ continue;
48
+ const value = trimmed.slice(prefix.length).split(";")[0];
49
+ return value || undefined;
50
+ }
51
+ return undefined;
52
+ }
53
+ function pickCookieExpiresAt(setCookie, key) {
54
+ if (!setCookie || setCookie.length === 0)
55
+ return undefined;
56
+ const prefix = `${key}=`;
57
+ for (const item of setCookie) {
58
+ const trimmed = String(item || "").trim();
59
+ if (!trimmed.startsWith(prefix))
60
+ continue;
61
+ const parts = trimmed.split(";").map(s => s.trim());
62
+ const expiresPart = parts.find(p => /^expires=/i.test(p));
63
+ if (!expiresPart)
64
+ return undefined;
65
+ const dateStr = expiresPart.split("=").slice(1).join("=");
66
+ const ts = Date.parse(dateStr);
67
+ return Number.isFinite(ts) ? ts : undefined;
68
+ }
69
+ return undefined;
70
+ }
71
+ class YApiAuthService {
72
+ baseUrl;
73
+ email;
74
+ password;
75
+ logger;
76
+ cache;
77
+ constructor(baseUrl, email, password, logLevel = "info") {
78
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
79
+ this.email = email;
80
+ this.password = password;
81
+ this.logger = new logger_1.Logger("YApiAuthService", logLevel);
82
+ this.cache = new authCache_1.YApiAuthCache(this.baseUrl, logLevel);
83
+ }
84
+ loadCachedProjectTokens() {
85
+ return this.cache.loadProjectTokens();
86
+ }
87
+ getCookieHeader(session) {
88
+ const parts = [`_yapi_token=${session.yapiToken}`];
89
+ if (session.yapiUid)
90
+ parts.push(`_yapi_uid=${session.yapiUid}`);
91
+ return parts.join("; ");
92
+ }
93
+ isSessionValid(session) {
94
+ if (!session?.yapiToken)
95
+ return false;
96
+ if (!session.expiresAt)
97
+ return true;
98
+ return Date.now() < session.expiresAt - 60_000;
99
+ }
100
+ async login(force = false) {
101
+ const cached = this.cache.loadSession();
102
+ if (!force && this.isSessionValid(cached))
103
+ return cached;
104
+ try {
105
+ this.logger.info("正在登录 YApi 以刷新全局 token...");
106
+ const response = await axios_1.default.post(`${this.baseUrl}/api/user/login`, { email: this.email, password: this.password }, { headers: { "Content-Type": "application/json;charset=UTF-8" } });
107
+ const setCookie = response.headers["set-cookie"];
108
+ const yapiToken = pickCookieValue(setCookie, "_yapi_token");
109
+ const yapiUid = pickCookieValue(setCookie, "_yapi_uid");
110
+ const expiresAt = pickCookieExpiresAt(setCookie, "_yapi_token");
111
+ if (!yapiToken) {
112
+ const msg = response.data?.errmsg || "登录失败,未返回 _yapi_token";
113
+ throw new Error(msg);
114
+ }
115
+ const session = {
116
+ yapiToken,
117
+ yapiUid,
118
+ expiresAt,
119
+ updatedAt: Date.now(),
120
+ };
121
+ this.cache.saveSession(session);
122
+ return session;
123
+ }
124
+ catch (error) {
125
+ if (error instanceof axios_1.AxiosError && error.response) {
126
+ throw new Error(error.response.data?.errmsg || "登录失败");
127
+ }
128
+ throw error instanceof Error ? error : new Error("登录失败");
129
+ }
130
+ }
131
+ async cookieRequest(method, endpoint, session, options = {}) {
132
+ try {
133
+ const url = `${this.baseUrl}${endpoint}`;
134
+ const cookie = this.getCookieHeader(session);
135
+ const headers = { Cookie: cookie, Accept: "application/json, text/plain, */*" };
136
+ const res = method === "GET"
137
+ ? await axios_1.default.get(url, { params: options.params, headers })
138
+ : await axios_1.default.post(url, options.data ?? {}, { params: options.params, headers });
139
+ return res.data;
140
+ }
141
+ catch (error) {
142
+ if (error instanceof axios_1.AxiosError && error.response) {
143
+ throw new Error(error.response.data?.errmsg || "请求失败");
144
+ }
145
+ throw error instanceof Error ? error : new Error("请求失败");
146
+ }
147
+ }
148
+ async listGroups(session) {
149
+ const groups = [];
150
+ const tryFetch = async (endpoint) => {
151
+ try {
152
+ const res = await this.cookieRequest("GET", endpoint, session);
153
+ if (res?.errcode === 0 && Array.isArray(res.data))
154
+ groups.push(...res.data);
155
+ }
156
+ catch {
157
+ }
158
+ };
159
+ await tryFetch("/api/group/get_mygroup");
160
+ await tryFetch("/api/group/list");
161
+ const seen = new Set();
162
+ return groups.filter(g => {
163
+ const id = String(g?._id ?? g?.id ?? "");
164
+ if (!id || seen.has(id))
165
+ return false;
166
+ seen.add(id);
167
+ return true;
168
+ });
169
+ }
170
+ async listProjectsInGroup(session, groupId) {
171
+ const all = [];
172
+ const limit = 50;
173
+ let page = 1;
174
+ while (true) {
175
+ const res = await this.cookieRequest("GET", "/api/project/list", session, {
176
+ params: { group_id: groupId, page, limit },
177
+ });
178
+ if (res?.errcode !== 0)
179
+ break;
180
+ const list = res?.data?.list;
181
+ if (Array.isArray(list))
182
+ all.push(...list);
183
+ const total = Number(res?.data?.total ?? NaN);
184
+ if (!Number.isFinite(total)) {
185
+ if (!Array.isArray(list) || list.length < limit)
186
+ break;
187
+ }
188
+ else if (all.length >= total) {
189
+ break;
190
+ }
191
+ page += 1;
192
+ if (page > 200)
193
+ break;
194
+ }
195
+ return all;
196
+ }
197
+ async getProjectDetail(session, projectId) {
198
+ const res = await this.cookieRequest("GET", "/api/project/get", session, { params: { id: projectId } });
199
+ if (res?.errcode !== 0)
200
+ throw new Error(res?.errmsg || "获取项目详情失败");
201
+ return res.data;
202
+ }
203
+ async refreshProjectTokens(options = {}) {
204
+ const session = await this.login(Boolean(options.forceLogin));
205
+ const groups = await this.listGroups(session);
206
+ const projects = [];
207
+ for (const g of groups) {
208
+ const groupId = String(g?._id ?? g?.id ?? "");
209
+ if (!groupId)
210
+ continue;
211
+ try {
212
+ const list = await this.listProjectsInGroup(session, groupId);
213
+ projects.push(...list);
214
+ }
215
+ catch (e) {
216
+ this.logger.warn(`获取分组项目列表失败(groupId=${groupId}): ${e}`);
217
+ }
218
+ }
219
+ const tokens = new Map();
220
+ for (const p of projects) {
221
+ const projectId = String(p?._id ?? p?.id ?? "");
222
+ if (!projectId)
223
+ continue;
224
+ try {
225
+ const detail = await this.getProjectDetail(session, projectId);
226
+ const token = String(detail?.token ?? "").trim();
227
+ if (token)
228
+ tokens.set(projectId, token);
229
+ }
230
+ catch (e) {
231
+ this.logger.warn(`获取项目 token 失败(projectId=${projectId}): ${e}`);
232
+ }
233
+ }
234
+ this.cache.saveProjectTokens(tokens);
235
+ return { tokens, projects, groups };
236
+ }
237
+ }
238
+ exports.YApiAuthService = YApiAuthService;
239
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/services/yapi/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface YApiSessionCookie {
2
+ yapiToken: string;
3
+ yapiUid?: string;
4
+ expiresAt?: number;
5
+ updatedAt: number;
6
+ }
7
+ export interface YApiProjectTokenEntry {
8
+ token: string;
9
+ updatedAt: number;
10
+ }
11
+ export interface YApiAuthCacheData {
12
+ version: 1;
13
+ baseUrl: string;
14
+ session?: YApiSessionCookie;
15
+ projectTokens: Record<string, YApiProjectTokenEntry>;
16
+ }
17
+ export declare class YApiAuthCache {
18
+ private readonly logger;
19
+ private readonly baseUrl;
20
+ private readonly cacheDir;
21
+ private readonly cacheFilePath;
22
+ constructor(baseUrl: string, logLevel?: string);
23
+ load(): YApiAuthCacheData;
24
+ save(data: YApiAuthCacheData): void;
25
+ loadSession(): YApiSessionCookie | null;
26
+ saveSession(session: YApiSessionCookie): void;
27
+ loadProjectTokens(): Map<string, string>;
28
+ saveProjectTokens(tokens: Map<string, string>): void;
29
+ }
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.YApiAuthCache = void 0;
40
+ const fs = __importStar(require("fs"));
41
+ const os = __importStar(require("os"));
42
+ const path = __importStar(require("path"));
43
+ const crypto_1 = __importDefault(require("crypto"));
44
+ const logger_1 = require("./logger");
45
+ function hashBaseUrl(baseUrl) {
46
+ return crypto_1.default.createHash("sha256").update(baseUrl).digest("hex").slice(0, 16);
47
+ }
48
+ function ensureDirSecure(dirPath) {
49
+ try {
50
+ if (!fs.existsSync(dirPath)) {
51
+ fs.mkdirSync(dirPath, { recursive: true, mode: 0o700 });
52
+ }
53
+ try {
54
+ fs.chmodSync(dirPath, 0o700);
55
+ }
56
+ catch {
57
+ }
58
+ }
59
+ catch {
60
+ }
61
+ }
62
+ function writeFileAtomicSync(filePath, content, options) {
63
+ const dir = path.dirname(filePath);
64
+ const tmpPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.${Date.now()}.tmp`);
65
+ try {
66
+ fs.writeFileSync(tmpPath, content, { encoding: "utf8", mode: options.mode });
67
+ try {
68
+ fs.renameSync(tmpPath, filePath);
69
+ }
70
+ catch (e) {
71
+ try {
72
+ if (fs.existsSync(filePath))
73
+ fs.unlinkSync(filePath);
74
+ fs.renameSync(tmpPath, filePath);
75
+ }
76
+ catch {
77
+ throw e;
78
+ }
79
+ }
80
+ try {
81
+ fs.chmodSync(filePath, options.mode);
82
+ }
83
+ catch {
84
+ }
85
+ }
86
+ finally {
87
+ try {
88
+ if (fs.existsSync(tmpPath))
89
+ fs.unlinkSync(tmpPath);
90
+ }
91
+ catch {
92
+ }
93
+ }
94
+ }
95
+ class YApiAuthCache {
96
+ logger;
97
+ baseUrl;
98
+ cacheDir;
99
+ cacheFilePath;
100
+ constructor(baseUrl, logLevel = "info") {
101
+ this.logger = new logger_1.Logger("YApiAuthCache", logLevel);
102
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
103
+ this.cacheDir = path.join(os.homedir(), ".yapi-mcp");
104
+ this.cacheFilePath = path.join(this.cacheDir, `auth-${hashBaseUrl(this.baseUrl)}.json`);
105
+ ensureDirSecure(this.cacheDir);
106
+ }
107
+ load() {
108
+ const empty = {
109
+ version: 1,
110
+ baseUrl: this.baseUrl,
111
+ projectTokens: {},
112
+ };
113
+ try {
114
+ if (!fs.existsSync(this.cacheFilePath))
115
+ return empty;
116
+ const raw = fs.readFileSync(this.cacheFilePath, "utf8");
117
+ const parsed = JSON.parse(raw);
118
+ if (!parsed || parsed.version !== 1 || parsed.baseUrl !== this.baseUrl)
119
+ return empty;
120
+ return {
121
+ version: 1,
122
+ baseUrl: this.baseUrl,
123
+ session: parsed.session,
124
+ projectTokens: parsed.projectTokens ?? {},
125
+ };
126
+ }
127
+ catch (e) {
128
+ this.logger.warn(`读取全局鉴权缓存失败,将使用空缓存: ${e}`);
129
+ return empty;
130
+ }
131
+ }
132
+ save(data) {
133
+ try {
134
+ writeFileAtomicSync(this.cacheFilePath, JSON.stringify(data, null, 2), { mode: 0o600 });
135
+ }
136
+ catch (e) {
137
+ this.logger.warn(`写入全局鉴权缓存失败: ${e}`);
138
+ }
139
+ }
140
+ loadSession() {
141
+ const data = this.load();
142
+ if (!data.session?.yapiToken)
143
+ return null;
144
+ return data.session;
145
+ }
146
+ saveSession(session) {
147
+ const data = this.load();
148
+ data.session = session;
149
+ this.save(data);
150
+ }
151
+ loadProjectTokens() {
152
+ const data = this.load();
153
+ const map = new Map();
154
+ for (const [projectId, entry] of Object.entries(data.projectTokens ?? {})) {
155
+ if (entry?.token)
156
+ map.set(projectId, entry.token);
157
+ }
158
+ return map;
159
+ }
160
+ saveProjectTokens(tokens) {
161
+ const data = this.load();
162
+ const now = Date.now();
163
+ const obj = {};
164
+ tokens.forEach((token, projectId) => {
165
+ obj[String(projectId)] = { token, updatedAt: now };
166
+ });
167
+ data.projectTokens = obj;
168
+ this.save(data);
169
+ }
170
+ }
171
+ exports.YApiAuthCache = YApiAuthCache;
172
+ //# sourceMappingURL=authCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authCache.js","sourceRoot":"","sources":["../../../src/services/yapi/authCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { ProjectInfo } from './types';
2
+ export declare class ProjectInfoCache {
3
+ private readonly cacheFilePath;
4
+ private readonly logger;
5
+ private readonly cacheTTLMinutes;
6
+ private lastCacheMtimeMs;
7
+ private lastCacheData;
8
+ constructor(baseUrl: string, cacheTTLMinutes?: number, logLevel?: string);
9
+ private readCacheData;
10
+ clearCache(): void;
11
+ saveToCache(projectInfo: Map<string, ProjectInfo>): void;
12
+ isCacheExpired(): boolean;
13
+ loadFromCache(): Map<string, ProjectInfo>;
14
+ }