@leeguoo/yapi-mcp 0.3.10 → 0.3.12

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/README.md CHANGED
@@ -62,7 +62,19 @@ Yapi Auto MCP Server 是一个基于 [Model Context Protocol](https://modelconte
62
62
 
63
63
  ### Skill 一键安装与 CLI
64
64
 
65
- 一条命令把 Skill 安装到 Codex / Claude Code,并写入 `~/.yapi/config.toml`(缺省会提示输入):
65
+ 一条命令把 Skill 安装到 Codex / Claude Code / Cursor,并写入 `~/.yapi/config.toml`(缺省会提示输入):
66
+
67
+ ```bash
68
+ # 推荐:全局安装后使用 yapi 命令
69
+ npm install -g @leeguoo/yapi-mcp
70
+
71
+ yapi install-skill \
72
+ --yapi-base-url=https://your-yapi-domain.com \
73
+ --yapi-email=your_email@example.com \
74
+ --yapi-password=your_password
75
+ ```
76
+
77
+ 也可以用 npx 临时运行(不全局安装):
66
78
 
67
79
  ```bash
68
80
  npx -y @leeguoo/yapi-mcp install-skill \
@@ -71,15 +83,35 @@ npx -y @leeguoo/yapi-mcp install-skill \
71
83
  --yapi-password=your_password
72
84
  ```
73
85
 
74
- CLI 使用示例(走同一份 `~/.yapi/config.toml`):
86
+ Skill 安装目录:
87
+ - Codex: `~/.codex/skills/yapi/`
88
+ - Claude Code: `~/.claude/skills/yapi/`
89
+ - Cursor: `~/.cursor/skills/yapi/`
90
+
91
+ Skill 模板来源:`packages/yapi-mcp/skill-template/SKILL.md`(发布后从包内复制到技能目录)。
92
+
93
+ ### CLI 使用
94
+
95
+ 推荐全局安装后直接使用 `yapi` 命令(走同一份 `~/.yapi/config.toml`):
75
96
 
76
97
  ```bash
77
- npx -y @leeguoo/yapi-mcp yapi -V
78
- npx -y @leeguoo/yapi-mcp yapi -h
79
- npx -y @leeguoo/yapi-mcp yapi login
80
- npx -y @leeguoo/yapi-mcp yapi whoami
81
- npx -y @leeguoo/yapi-mcp yapi search --q keyword
82
- npx -y @leeguoo/yapi-mcp yapi --path /api/interface/get --query id=123
98
+ # 检查版本
99
+ yapi --version
100
+
101
+ # 查看帮助
102
+ yapi -h
103
+
104
+ # 登录(交互式,会提示输入 base_url/email/password)
105
+ yapi login
106
+
107
+ # 检查当前登录用户
108
+ yapi whoami
109
+
110
+ # 搜索接口
111
+ yapi search --q keyword
112
+
113
+ # 获取接口详情
114
+ yapi --path /api/interface/get --query id=123
83
115
  ```
84
116
 
85
117
  全局模式下可先执行 `yapi login` 缓存登录态(`~/.yapi-mcp/auth-*.json`),权限失效会自动重新登录。
@@ -87,15 +119,15 @@ npx -y @leeguoo/yapi-mcp yapi --path /api/interface/get --query id=123
87
119
  Markdown 同步到 YApi(支持 Mermaid 预渲染,需 `pandoc` + `mmdc`):
88
120
 
89
121
  ```bash
90
- npx -y @leeguoo/yapi-mcp yapi docs-sync bind add \
122
+ yapi docs-sync bind add \
91
123
  --name projectA \
92
124
  --dir docs/release-notes \
93
125
  --project-id 267 \
94
126
  --catid 3667
95
127
 
96
- npx -y @leeguoo/yapi-mcp yapi docs-sync --binding projectA
128
+ yapi docs-sync --binding projectA
97
129
  # 或同步 .yapi/docs-sync.json 内的所有绑定
98
- npx -y @leeguoo/yapi-mcp yapi docs-sync
130
+ yapi docs-sync
99
131
  ```
100
132
 
101
133
  说明:
@@ -12,518 +12,48 @@ const yargs_1 = __importDefault(require("yargs"));
12
12
  const SKILL_NAME = "yapi";
13
13
  const PLACEHOLDER_EMAIL = "YOUR_EMAIL";
14
14
  const PLACEHOLDER_PASSWORD = "YOUR_PASSWORD";
15
- const SKILL_MD = [
16
- "---",
17
- "name: yapi",
18
- 'description: Query and sync YApi interface documentation. Use when user mentions \"yapi 接口文档\", YAPI docs, asks for request/response details, or needs docs sync.',
19
- "---",
20
- "",
21
- "# YApi interface docs",
22
- "",
23
- "## Workflow",
24
- "1. Load config from `~/.yapi/config.toml` (preferred) or `config.toml` in this skill directory (base_url, auth_mode, email/password or token, optional project_id).",
25
- "2. Identify the target interface by id or keyword; ask for project/category ids if needed.",
26
- "3. Call YApi endpoints with `scripts/yapi_request.js` to fetch raw JSON.",
27
- "4. Summarize method, path, headers, query/body schema, response schema, and examples.",
28
- "",
29
- "## CLI",
30
- "- Install & run: `npx -y @leeguoo/yapi-mcp yapi -h` (or install globally and use `yapi`).",
31
- "- Use the same config as the skill: `~/.yapi/config.toml`.",
32
- "",
33
- "## Docs sync",
34
- "- Bind local docs to YApi category with `yapi docs-sync bind add --name <binding> --dir <path> --project-id <id> --catid <id>` (stored in `.yapi/docs-sync.json`).",
35
- "- Sync with `yapi docs-sync --binding <binding>` or run all bindings with `yapi docs-sync`.",
36
- "- Default syncs only changed files; use `--force` to sync everything.",
37
- "- Mermaid rendering depends on `mmdc` (auto-installed if possible; failures do not block sync).",
38
- "- For full Markdown render, install `pandoc` (manual install required).",
39
- "- Extra mappings (generated after docs-sync run in binding mode):",
40
- " - `.yapi/docs-sync.links.json`: local docs to YApi doc URLs.",
41
- " - `.yapi/docs-sync.projects.json`: cached project metadata/envs.",
42
- " - `.yapi/docs-sync.deployments.json`: local docs to deployed URLs.",
43
- "",
44
- "## Interface creation tips",
45
- "- When adding interfaces, always set `req_body_type` (use `json` if unsure) and provide `res_body` (prefer JSON Schema). Empty values can make `/api/interface/add` fail.",
46
- "- Keep request/response structures in `req_*` / `res_body` instead of stuffing them into `desc` or `markdown`.",
47
- "",
48
- "## Script",
49
- "- Basic: `node <skill-dir>/scripts/yapi_request.js --path /api/interface/get --query id=123`",
50
- "- The script reads `~/.yapi/config.toml` first, then `<skill-dir>/config.toml`; pass `--config` for a custom path.",
51
- "- Use `--base-url`, `--token`, `--project-id` to override config.",
52
- "- For `auth_mode=global`, the script logs in via `/api/user/login` and uses the returned cookie automatically.",
53
- '- For POST: `--method POST --data \'{"key":"value"}\'`',
54
- "- If your instance differs, pass a full URL with `--url`.",
55
- "",
56
- ].join("\n");
57
- const REQUEST_SCRIPT = [
58
- "#!/usr/bin/env node",
59
- '"use strict";',
60
- "",
61
- 'const fs = require("fs");',
62
- 'const os = require("os");',
63
- 'const path = require("path");',
64
- 'const readline = require("readline");',
65
- "",
66
- "function parseKeyValue(raw) {",
67
- ' if (!raw || !raw.includes("=")) throw new Error("expected key=value");',
68
- ' const idx = raw.indexOf("=");',
69
- " return [raw.slice(0, idx), raw.slice(idx + 1)];",
70
- "}",
71
- "",
72
- "function parseHeader(raw) {",
73
- ' if (!raw || !raw.includes(":")) throw new Error("expected Header:Value");',
74
- ' const idx = raw.indexOf(":");',
75
- " return [raw.slice(0, idx).trim(), raw.slice(idx + 1).trim()];",
76
- "}",
77
- "",
78
- "function joinUrl(baseUrl, endpoint) {",
79
- " if (!baseUrl) return endpoint;",
80
- ' if (baseUrl.endsWith("/") && endpoint.startsWith("/")) return baseUrl.slice(0, -1) + endpoint;',
81
- ' if (!baseUrl.endsWith("/") && !endpoint.startsWith("/")) return baseUrl + "/" + endpoint;',
82
- " return baseUrl + endpoint;",
83
- "}",
84
- "",
85
- "function globalConfigPath() {",
86
- ' const yapiHome = process.env.YAPI_HOME || path.join(os.homedir(), ".yapi");',
87
- ' return path.join(yapiHome, "config.toml");',
88
- "}",
89
- "",
90
- "function localConfigPath() {",
91
- ' return path.resolve(__dirname, "..", "config.toml");',
92
- "}",
93
- "",
94
- "function ensureDir(dirPath) {",
95
- " try {",
96
- " fs.mkdirSync(dirPath, { recursive: true });",
97
- " } catch {",
98
- " // ignore",
99
- " }",
100
- "}",
101
- "",
102
- "function escapeTomlValue(value) {",
103
- ' return String(value || "").replace(/\\\\/g, "\\\\\\\\").replace(/\\"/g, "\\\\\\"");',
104
- "}",
105
- "",
106
- "function formatToml(config) {",
107
- ' const orderedKeys = ["base_url", "auth_mode", "email", "password", "token", "project_id"];',
108
- ' const lines = ["# YApi CLI config"];',
109
- " for (const key of orderedKeys) {",
110
- ' const value = config[key] || "";',
111
- ' lines.push(`${key} = \\"${escapeTomlValue(value)}\\"`);',
112
- " }",
113
- ' return lines.join("\\n") + "\\n";',
114
- "}",
115
- "",
116
- "function writeConfig(filePath, config) {",
117
- " ensureDir(path.dirname(filePath));",
118
- ' fs.writeFileSync(filePath, formatToml(config), "utf8");',
119
- "}",
120
- "",
121
- "function promptText(question) {",
122
- " const rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: true });",
123
- " return new Promise((resolve) => {",
124
- " rl.question(question, (answer) => {",
125
- " rl.close();",
126
- " resolve(answer);",
127
- " });",
128
- " });",
129
- "}",
130
- "",
131
- "function promptHidden(question) {",
132
- " const rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: true });",
133
- " const originalWrite = rl._writeToOutput;",
134
- " rl._writeToOutput = function writeToOutput(stringToWrite) {",
135
- " if (rl.stdoutMuted) return;",
136
- ' if (typeof originalWrite === "function") {',
137
- " originalWrite.call(this, stringToWrite);",
138
- " } else {",
139
- " rl.output.write(stringToWrite);",
140
- " }",
141
- " };",
142
- " rl.stdoutMuted = true;",
143
- " return new Promise((resolve) => {",
144
- " rl.question(question, (answer) => {",
145
- " rl.stdoutMuted = false;",
146
- " rl.close();",
147
- " resolve(answer);",
148
- " });",
149
- " });",
150
- "}",
151
- "",
152
- "async function promptRequired(question, hidden) {",
153
- " while (true) {",
154
- " const answer = hidden ? await promptHidden(question) : await promptText(question);",
155
- ' const trimmed = String(answer || "").trim();',
156
- " if (trimmed) return trimmed;",
157
- " }",
158
- "}",
159
- "",
160
- "async function initConfigIfMissing(options) {",
161
- " const hasBaseUrl = Boolean(options.baseUrl);",
162
- " const hasEmail = Boolean(options.email);",
163
- " const hasPassword = Boolean(options.password);",
164
- " if (!hasBaseUrl || !hasEmail || !hasPassword) {",
165
- " if (!process.stdin.isTTY || !process.stdout.isTTY) return null;",
166
- " }",
167
- ' const baseUrl = hasBaseUrl ? options.baseUrl : await promptRequired("YApi base URL: ", false);',
168
- ' const email = hasEmail ? options.email : await promptRequired("YApi email: ", false);',
169
- ' const password = hasPassword ? options.password : await promptRequired("YApi password: ", true);',
170
- " const config = {",
171
- " base_url: baseUrl,",
172
- ' auth_mode: "global",',
173
- " email,",
174
- " password,",
175
- ' token: options.token || "",',
176
- ' project_id: options.projectId || "",',
177
- " };",
178
- " const configPath = globalConfigPath();",
179
- " writeConfig(configPath, config);",
180
- " return { configPath, config };",
181
- "}",
182
- "",
183
- "function parseSimpleToml(text) {",
184
- " const data = {};",
185
- ' const lines = String(text || "").split(/\\r?\\n/);',
186
- " for (const rawLine of lines) {",
187
- ' const line = rawLine.split("#", 1)[0].split(";", 1)[0].trim();',
188
- ' if (!line || line.startsWith("[")) continue;',
189
- ' const idx = line.indexOf("=");',
190
- " if (idx === -1) continue;",
191
- " const key = line.slice(0, idx).trim();",
192
- " let value = line.slice(idx + 1).trim();",
193
- " if (!key) continue;",
194
- " if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {",
195
- " value = value.slice(1, -1);",
196
- " }",
197
- " data[key] = value;",
198
- " }",
199
- " return data;",
200
- "}",
201
- "",
202
- "function resolveToken(tokenValue, projectId) {",
203
- ' if (!tokenValue) return "";',
204
- ' if (tokenValue.includes(",") || tokenValue.includes(":")) {',
205
- ' let defaultToken = "";',
206
- " const mapping = {};",
207
- ' tokenValue.split(",").forEach((rawPair) => {',
208
- " const pair = rawPair.trim();",
209
- " if (!pair) return;",
210
- ' const idx = pair.indexOf(":");',
211
- " if (idx === -1) {",
212
- " defaultToken = pair;",
213
- " return;",
214
- " }",
215
- " const pid = pair.slice(0, idx).trim();",
216
- " const token = pair.slice(idx + 1).trim();",
217
- " if (pid && token) mapping[pid] = token;",
218
- " });",
219
- " if (projectId && mapping[projectId]) return mapping[projectId];",
220
- " if (defaultToken) return defaultToken;",
221
- " const keys = Object.keys(mapping);",
222
- " if (keys.length) return mapping[keys[0]];",
223
- " }",
224
- " return tokenValue;",
225
- "}",
226
- "",
227
- "function getSetCookie(headers) {",
228
- " if (!headers) return [];",
229
- ' if (typeof headers.getSetCookie === "function") return headers.getSetCookie();',
230
- ' const value = headers.get("set-cookie");',
231
- " return value ? [value] : [];",
232
- "}",
233
- "",
234
- "function extractCookieValue(setCookies, name) {",
235
- ' if (!setCookies || !setCookies.length) return "";',
236
- " for (const entry of setCookies) {",
237
- ' const parts = String(entry || "").split(";");',
238
- " for (const part of parts) {",
239
- " const item = part.trim();",
240
- ' if (item.startsWith(name + "=")) return item.split("=").slice(1).join("=");',
241
- " }",
242
- " }",
243
- ' return "";',
244
- "}",
245
- "",
246
- "async function fetchWithTimeout(url, options, timeoutMs) {",
247
- " const controller = new AbortController();",
248
- " const timer = setTimeout(() => controller.abort(), timeoutMs);",
249
- " try {",
250
- " return await fetch(url, { ...options, signal: controller.signal });",
251
- " } finally {",
252
- " clearTimeout(timer);",
253
- " }",
254
- "}",
255
- "",
256
- "async function loginGetCookie(baseUrl, email, password, timeoutMs) {",
257
- ' const url = joinUrl(baseUrl, "/api/user/login");',
258
- " const payload = JSON.stringify({ email, password });",
259
- " const response = await fetchWithTimeout(url, {",
260
- ' method: "POST",',
261
- ' headers: { "Content-Type": "application/json;charset=UTF-8" },',
262
- " body: payload,",
263
- " }, timeoutMs);",
264
- " const bodyText = await response.text();",
265
- " const setCookies = getSetCookie(response.headers);",
266
- ' const yapiToken = extractCookieValue(setCookies, "_yapi_token");',
267
- ' const yapiUid = extractCookieValue(setCookies, "_yapi_uid");',
268
- " if (!yapiToken) {",
269
- ' let message = "login failed: missing _yapi_token cookie";',
270
- " try {",
271
- " const payload = JSON.parse(bodyText);",
272
- ' if (payload && typeof payload === "object" && payload.errmsg) message = payload.errmsg;',
273
- " } catch {",
274
- " // ignore",
275
- " }",
276
- " throw new Error(message);",
277
- " }",
278
- " let cookie = `_yapi_token=${yapiToken}`;",
279
- " if (yapiUid) cookie = `${cookie}; _yapi_uid=${yapiUid}`;",
280
- " return cookie;",
281
- "}",
282
- "",
283
- "function buildUrl(baseUrl, endpoint, queryItems, token, tokenParam) {",
284
- " const url = baseUrl ? joinUrl(baseUrl, endpoint) : endpoint;",
285
- " const parsed = new URL(url);",
286
- " if (Array.isArray(queryItems)) {",
287
- " for (const [key, value] of queryItems) {",
288
- ' if (key) parsed.searchParams.append(key, value ?? "");',
289
- " }",
290
- " }",
291
- " if (token) {",
292
- " if (!parsed.searchParams.has(tokenParam)) {",
293
- " parsed.searchParams.append(tokenParam, token);",
294
- " }",
295
- " }",
296
- " return parsed.toString();",
297
- "}",
298
- "",
299
- "function parseArgs(argv) {",
300
- " const options = {",
301
- " query: [],",
302
- " header: [],",
303
- ' method: "GET",',
304
- ' tokenParam: "token",',
305
- " timeout: 30000,",
306
- " };",
307
- " for (let i = 0; i < argv.length; i += 1) {",
308
- " const arg = argv[i];",
309
- " if (!arg) continue;",
310
- ' if (arg === "--config") { options.config = argv[++i]; continue; }',
311
- ' if (arg.startsWith("--config=")) { options.config = arg.slice(9); continue; }',
312
- ' if (arg === "--base-url") { options.baseUrl = argv[++i]; continue; }',
313
- ' if (arg.startsWith("--base-url=")) { options.baseUrl = arg.slice(11); continue; }',
314
- ' if (arg === "--token") { options.token = argv[++i]; continue; }',
315
- ' if (arg.startsWith("--token=")) { options.token = arg.slice(8); continue; }',
316
- ' if (arg === "--project-id") { options.projectId = argv[++i]; continue; }',
317
- ' if (arg.startsWith("--project-id=")) { options.projectId = arg.slice(13); continue; }',
318
- ' if (arg === "--auth-mode") { options.authMode = argv[++i]; continue; }',
319
- ' if (arg.startsWith("--auth-mode=")) { options.authMode = arg.slice(12); continue; }',
320
- ' if (arg === "--email") { options.email = argv[++i]; continue; }',
321
- ' if (arg.startsWith("--email=")) { options.email = arg.slice(8); continue; }',
322
- ' if (arg === "--password") { options.password = argv[++i]; continue; }',
323
- ' if (arg.startsWith("--password=")) { options.password = arg.slice(11); continue; }',
324
- ' if (arg === "--cookie") { options.cookie = argv[++i]; continue; }',
325
- ' if (arg.startsWith("--cookie=")) { options.cookie = arg.slice(9); continue; }',
326
- ' if (arg === "--token-param") { options.tokenParam = argv[++i]; continue; }',
327
- ' if (arg.startsWith("--token-param=")) { options.tokenParam = arg.slice(14); continue; }',
328
- ' if (arg === "--method") { options.method = argv[++i]; continue; }',
329
- ' if (arg.startsWith("--method=")) { options.method = arg.slice(9); continue; }',
330
- ' if (arg === "--path") { options.path = argv[++i]; continue; }',
331
- ' if (arg.startsWith("--path=")) { options.path = arg.slice(7); continue; }',
332
- ' if (arg === "--url") { options.url = argv[++i]; continue; }',
333
- ' if (arg.startsWith("--url=")) { options.url = arg.slice(6); continue; }',
334
- ' if (arg === "--query") { options.query.push(argv[++i]); continue; }',
335
- ' if (arg.startsWith("--query=")) { options.query.push(arg.slice(8)); continue; }',
336
- ' if (arg === "--header") { options.header.push(argv[++i]); continue; }',
337
- ' if (arg.startsWith("--header=")) { options.header.push(arg.slice(9)); continue; }',
338
- ' if (arg === "--data") { options.data = argv[++i]; continue; }',
339
- ' if (arg.startsWith("--data=")) { options.data = arg.slice(7); continue; }',
340
- ' if (arg === "--data-file") { options.dataFile = argv[++i]; continue; }',
341
- ' if (arg.startsWith("--data-file=")) { options.dataFile = arg.slice(12); continue; }',
342
- ' if (arg === "--timeout") { options.timeout = Number(argv[++i]); continue; }',
343
- ' if (arg.startsWith("--timeout=")) { options.timeout = Number(arg.slice(10)); continue; }',
344
- ' if (arg === "--no-pretty") { options.noPretty = true; continue; }',
345
- ' if (arg === "--help" || arg === "-h") { options.help = true; continue; }',
346
- " }",
347
- " return options;",
348
- "}",
349
- "",
350
- "function usage() {",
351
- " return [",
352
- ' "Usage:",',
353
- ' " node yapi_request.js --path /api/interface/get --query id=123",',
354
- ' "Options:",',
355
- ' " --config <path> config file path (default: ~/.yapi/config.toml)",',
356
- ' " --base-url <url> YApi base URL",',
357
- ' " --token <token> project token (supports projectId:token)",',
358
- ' " --project-id <id> select token for project",',
359
- ' " --auth-mode <mode> token or global",',
360
- ' " --email <email> login email for global mode",',
361
- ' " --password <pwd> login password for global mode",',
362
- ' " --path <path> API path (e.g., /api/interface/get)",',
363
- ' " --url <url> full URL (overrides base-url/path)",',
364
- ' " --query key=value query param (repeatable)",',
365
- ' " --header Header:Value request header (repeatable)",',
366
- ' " --method <method> HTTP method",',
367
- ' " --data <payload> request body (JSON or text)",',
368
- ' " --data-file <file> request body file",',
369
- ' " --timeout <ms> request timeout in ms",',
370
- ' " --no-pretty print raw response",',
371
- ' ].join("\\n");',
372
- "}",
373
- "",
374
- "async function main() {",
375
- " const options = parseArgs(process.argv.slice(2));",
376
- " if (options.help) {",
377
- " console.log(usage());",
378
- " return 0;",
379
- " }",
380
- "",
381
- " if (options.url && options.path) {",
382
- ' console.error("use --url or --path, not both");',
383
- " return 2;",
384
- " }",
385
- "",
386
- " if (!options.url && !options.path) {",
387
- ' console.error("missing --path or --url");',
388
- " console.error(usage());",
389
- " return 2;",
390
- " }",
391
- "",
392
- " let config = {};",
393
- ' let configPath = options.config || "";',
394
- " if (options.config) {",
395
- " if (fs.existsSync(configPath)) {",
396
- ' config = parseSimpleToml(fs.readFileSync(configPath, "utf8"));',
397
- " } else {",
398
- " const init = await initConfigIfMissing(options);",
399
- " if (init) {",
400
- " config = init.config;",
401
- " configPath = init.configPath;",
402
- " } else {",
403
- " console.error(`missing config file: ${configPath}`);",
404
- " return 2;",
405
- " }",
406
- " }",
407
- " } else {",
408
- " const globalPath = globalConfigPath();",
409
- " const localPath = localConfigPath();",
410
- " if (fs.existsSync(globalPath)) {",
411
- " configPath = globalPath;",
412
- ' config = parseSimpleToml(fs.readFileSync(globalPath, "utf8"));',
413
- " } else if (fs.existsSync(localPath)) {",
414
- " configPath = localPath;",
415
- ' config = parseSimpleToml(fs.readFileSync(localPath, "utf8"));',
416
- " } else {",
417
- " const init = await initConfigIfMissing(options);",
418
- " if (init) {",
419
- " config = init.config;",
420
- " configPath = init.configPath;",
421
- " } else {",
422
- ' console.error("missing config: create ~/.yapi/config.toml or pass --config");',
423
- " return 2;",
424
- " }",
425
- " }",
426
- " }",
427
- "",
428
- ' const baseUrl = options.url ? null : (options.baseUrl || config.base_url || "");',
429
- " const endpoint = options.url || options.path;",
430
- " if (!options.url && !baseUrl) {",
431
- ' console.error("missing --base-url or config base_url");',
432
- " return 2;",
433
- " }",
434
- "",
435
- ' const projectId = options.projectId || config.project_id || "";',
436
- ' const rawToken = options.token || config.token || "";',
437
- " const token = resolveToken(rawToken, projectId);",
438
- "",
439
- ' let authMode = (options.authMode || config.auth_mode || "").trim().toLowerCase();',
440
- " if (!authMode) {",
441
- ' authMode = token ? "token" : (options.email || options.password || config.email || config.password) ? "global" : "token";',
442
- " }",
443
- ' if (authMode !== "token" && authMode !== "global") {',
444
- ' console.error("invalid --auth-mode (use token or global)");',
445
- " return 2;",
446
- " }",
447
- "",
448
- " const headers = {};",
449
- " for (const header of options.header || []) {",
450
- " const [key, value] = parseHeader(header);",
451
- " headers[key] = value;",
452
- " }",
453
- "",
454
- " if (options.cookie) {",
455
- " headers.Cookie = options.cookie;",
456
- ' } else if (authMode === "global") {',
457
- " const email = options.email || config.email;",
458
- " const password = options.password || config.password;",
459
- " if (!email || !password) {",
460
- ' console.error("missing email/password for global auth");',
461
- " return 2;",
462
- " }",
463
- " try {",
464
- " headers.Cookie = await loginGetCookie(baseUrl, email, password, options.timeout);",
465
- " } catch (error) {",
466
- " console.error(error && error.message ? error.message : String(error));",
467
- " return 2;",
468
- " }",
469
- " }",
470
- "",
471
- " const queryItems = [];",
472
- " for (const query of options.query || []) {",
473
- " queryItems.push(parseKeyValue(query));",
474
- " }",
475
- ' const url = buildUrl(baseUrl, endpoint, queryItems, authMode === "token" ? token : "", options.tokenParam);',
476
- "",
477
- " let dataRaw = null;",
478
- " if (options.dataFile) {",
479
- ' dataRaw = fs.readFileSync(options.dataFile, "utf8");',
480
- " } else if (options.data !== undefined) {",
481
- " dataRaw = options.data;",
482
- " }",
483
- "",
484
- " let body;",
485
- ' if (dataRaw !== null && options.method.toUpperCase() !== "GET" && options.method.toUpperCase() !== "HEAD") {',
486
- " try {",
487
- " const parsed = JSON.parse(dataRaw);",
488
- " body = JSON.stringify(parsed);",
489
- ' if (!headers["Content-Type"]) headers["Content-Type"] = "application/json";',
490
- " } catch {",
491
- " body = String(dataRaw);",
492
- ' if (!headers["Content-Type"]) headers["Content-Type"] = "text/plain";',
493
- " }",
494
- " }",
495
- "",
496
- " let response;",
497
- " try {",
498
- " response = await fetchWithTimeout(url, {",
499
- " method: options.method.toUpperCase(),",
500
- " headers,",
501
- " body,",
502
- " }, options.timeout);",
503
- " } catch (error) {",
504
- ' console.error("request failed: " + (error && error.message ? error.message : String(error)));',
505
- " return 2;",
506
- " }",
507
- "",
508
- " const text = await response.text();",
509
- " if (options.noPretty) {",
510
- " console.log(text);",
511
- " return 0;",
512
- " }",
513
- " try {",
514
- " const payload = JSON.parse(text);",
515
- " console.log(JSON.stringify(payload, null, 2));",
516
- " } catch {",
517
- " console.log(text);",
518
- " }",
519
- " return 0;",
520
- "}",
521
- "",
522
- "main().then((code) => {",
523
- " process.exitCode = code;",
524
- "});",
525
- "",
526
- ].join("\n");
15
+ const SKILL_TEMPLATE_DIR = "skill-template";
16
+ const SKILL_TEMPLATE_FILE = "SKILL.md";
17
+ function detectPackageManager() {
18
+ const userAgent = process.env.npm_config_user_agent || "";
19
+ if (userAgent.includes("pnpm"))
20
+ return "pnpm";
21
+ if (userAgent.includes("yarn"))
22
+ return "yarn";
23
+ if (userAgent.includes("npm"))
24
+ return "npm";
25
+ const execPath = process.env.npm_execpath || "";
26
+ if (execPath.includes("pnpm"))
27
+ return "pnpm";
28
+ if (execPath.includes("yarn"))
29
+ return "yarn";
30
+ if (execPath.includes("npm"))
31
+ return "npm";
32
+ return "unknown";
33
+ }
34
+ function resolvePackageRoot(startDir) {
35
+ let current = path_1.default.resolve(startDir);
36
+ const { root } = path_1.default.parse(current);
37
+ while (true) {
38
+ const candidate = path_1.default.join(current, "package.json");
39
+ if (fs_1.default.existsSync(candidate)) {
40
+ let pkgName;
41
+ try {
42
+ const pkg = JSON.parse(fs_1.default.readFileSync(candidate, "utf8"));
43
+ pkgName = pkg.name;
44
+ }
45
+ catch {
46
+ pkgName = undefined;
47
+ }
48
+ if (pkgName === "@leeguoo/yapi-mcp")
49
+ return current;
50
+ }
51
+ if (current === root)
52
+ break;
53
+ current = path_1.default.dirname(current);
54
+ }
55
+ return path_1.default.resolve(__dirname, "..", "..");
56
+ }
527
57
  function parseSimpleToml(text) {
528
58
  const data = {};
529
59
  for (const rawLine of text.split(/\r?\n/)) {
@@ -564,19 +94,6 @@ function formatToml(config) {
564
94
  }
565
95
  return `${lines.join("\n")}\n`;
566
96
  }
567
- function writeFileIfNeeded(filePath, contents, force) {
568
- if (!force && fs_1.default.existsSync(filePath))
569
- return false;
570
- fs_1.default.writeFileSync(filePath, contents, "utf8");
571
- return true;
572
- }
573
- function ensureExecutable(filePath) {
574
- try {
575
- fs_1.default.chmodSync(filePath, 0o755);
576
- }
577
- catch {
578
- }
579
- }
580
97
  function ensurePrivate(filePath) {
581
98
  try {
582
99
  fs_1.default.chmodSync(filePath, 0o600);
@@ -653,6 +170,7 @@ async function runInstallSkill(rawArgs) {
653
170
  "yapi-home": { type: "string", describe: "Override YApi config home (default: ~/.yapi)" },
654
171
  "codex-home": { type: "string", describe: "Override CODEX_HOME" },
655
172
  "claude-home": { type: "string", describe: "Override Claude home (default: ~/.claude)" },
173
+ "cursor-home": { type: "string", describe: "Override Cursor home (default: ~/.cursor)" },
656
174
  force: {
657
175
  type: "boolean",
658
176
  default: false,
@@ -664,10 +182,12 @@ async function runInstallSkill(rawArgs) {
664
182
  const yapiHome = argv["yapi-home"] || process.env.YAPI_HOME || path_1.default.join(os_1.default.homedir(), ".yapi");
665
183
  const codexHome = argv["codex-home"] || process.env.CODEX_HOME || path_1.default.join(os_1.default.homedir(), ".codex");
666
184
  const claudeHome = argv["claude-home"] || process.env.CLAUDE_HOME || path_1.default.join(os_1.default.homedir(), ".claude");
185
+ const cursorHome = argv["cursor-home"] || process.env.CURSOR_HOME || path_1.default.join(os_1.default.homedir(), ".cursor");
667
186
  const globalConfigPath = path_1.default.join(yapiHome, "config.toml");
668
187
  const targets = [
669
188
  { label: "Codex", root: path_1.default.join(codexHome, "skills", SKILL_NAME) },
670
189
  { label: "Claude", root: path_1.default.join(claudeHome, "skills", SKILL_NAME) },
190
+ { label: "Cursor", root: path_1.default.join(cursorHome, "skills", SKILL_NAME) },
671
191
  ];
672
192
  const seenRoots = new Set();
673
193
  const uniqueTargets = targets.filter((target) => {
@@ -680,15 +200,6 @@ async function runInstallSkill(rawArgs) {
680
200
  if (fs_1.default.existsSync(globalConfigPath)) {
681
201
  existingConfig = parseSimpleToml(fs_1.default.readFileSync(globalConfigPath, "utf8"));
682
202
  }
683
- else {
684
- for (const target of uniqueTargets) {
685
- const configPath = path_1.default.join(target.root, "config.toml");
686
- if (fs_1.default.existsSync(configPath)) {
687
- existingConfig = parseSimpleToml(fs_1.default.readFileSync(configPath, "utf8"));
688
- break;
689
- }
690
- }
691
- }
692
203
  const merged = { ...existingConfig };
693
204
  if (argv["yapi-base-url"] || process.env.YAPI_BASE_URL) {
694
205
  merged.base_url = argv["yapi-base-url"] || process.env.YAPI_BASE_URL || "";
@@ -728,31 +239,29 @@ async function runInstallSkill(rawArgs) {
728
239
  }
729
240
  }
730
241
  merged.password = password;
242
+ const packageRoot = resolvePackageRoot(__dirname);
243
+ const templatePath = path_1.default.join(packageRoot, SKILL_TEMPLATE_DIR, SKILL_TEMPLATE_FILE);
244
+ if (!fs_1.default.existsSync(templatePath)) {
245
+ const manager = detectPackageManager();
246
+ throw new Error(`Missing skill template: ${templatePath} (package root: ${packageRoot}, manager: ${manager})`);
247
+ }
248
+ const skillTemplate = fs_1.default.readFileSync(templatePath, "utf8");
731
249
  const installedRoots = [];
732
- const configPaths = [];
733
250
  fs_1.default.mkdirSync(yapiHome, { recursive: true });
734
251
  fs_1.default.writeFileSync(globalConfigPath, formatToml(merged), "utf8");
735
252
  ensurePrivate(globalConfigPath);
736
- configPaths.push(globalConfigPath);
737
253
  for (const target of uniqueTargets) {
738
- const scriptsDir = path_1.default.join(target.root, "scripts");
739
- const configPath = path_1.default.join(target.root, "config.toml");
254
+ if (fs_1.default.existsSync(target.root)) {
255
+ fs_1.default.rmSync(target.root, { recursive: true, force: true });
256
+ }
257
+ fs_1.default.mkdirSync(target.root, { recursive: true });
740
258
  const skillPath = path_1.default.join(target.root, "SKILL.md");
741
- const scriptPath = path_1.default.join(scriptsDir, "yapi_request.js");
742
- fs_1.default.mkdirSync(scriptsDir, { recursive: true });
743
- writeFileIfNeeded(skillPath, SKILL_MD, argv.force ?? false);
744
- const scriptWritten = writeFileIfNeeded(scriptPath, REQUEST_SCRIPT, argv.force ?? false);
745
- if (scriptWritten)
746
- ensureExecutable(scriptPath);
747
- fs_1.default.writeFileSync(configPath, formatToml(merged), "utf8");
748
- ensurePrivate(configPath);
259
+ fs_1.default.writeFileSync(skillPath, skillTemplate, "utf8");
749
260
  installedRoots.push(`${target.label}: ${target.root}`);
750
- configPaths.push(configPath);
751
261
  }
752
262
  console.log(`Installed skill '${SKILL_NAME}' at:`);
753
263
  installedRoots.forEach((entry) => console.log(`- ${entry}`));
754
- console.log("Config written to:");
755
- configPaths.forEach((entry) => console.log(`- ${entry}`));
756
- console.log("Restart Codex/Claude Code to pick up new skills.");
264
+ console.log(`Config written to: ${globalConfigPath}`);
265
+ console.log("Restart Codex/Claude Code/Cursor to pick up new skills.");
757
266
  }
758
267
  //# sourceMappingURL=install.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/skill/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/skill/install.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leeguoo/yapi-mcp",
3
- "version": "0.3.10",
3
+ "version": "0.3.12",
4
4
  "description": "YApi Auto MCP Server - Model Context Protocol server for YApi integration, enables AI tools like Cursor to interact with YApi API documentation",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -10,7 +10,8 @@
10
10
  },
11
11
  "files": [
12
12
  "dist",
13
- "README.md"
13
+ "README.md",
14
+ "skill-template"
14
15
  ],
15
16
  "scripts": {
16
17
  "build": "tsc && tsc-alias",
@@ -0,0 +1,106 @@
1
+ ---
2
+ name: yapi
3
+ description: Query and sync YApi interface documentation. Use when user mentions "yapi 接口文档", YAPI docs, asks for request/response details, or needs docs sync. Also triggers when user pastes a YApi URL that matches the configured base_url.
4
+ ---
5
+
6
+ # YApi interface docs
7
+
8
+ ## URL Detection
9
+
10
+ When user provides a URL, check if it matches the configured YApi instance:
11
+
12
+ 1. Read config to get base_url:
13
+ ```bash
14
+ cat ~/.yapi/config.toml | grep base_url
15
+ ```
16
+
17
+ 2. If the URL's origin matches `base_url`, use yapi CLI to operate:
18
+ - Extract `project_id` from URL path (e.g., `/project/123/...` → project_id=123)
19
+ - Extract `api_id` from URL path (e.g., `.../api/456` → api_id=456)
20
+ - Use `yapi --path /api/interface/get --query id=<api_id>` to fetch details
21
+
22
+ 3. Example URL patterns:
23
+ - `https://yapi.example.com/project/123/interface/api/456` → project=123, api=456
24
+ - `https://yapi.example.com/project/123/interface/api/cat_789` → project=123, category=789
25
+
26
+ ## Prerequisites
27
+
28
+ ### Check if yapi CLI is installed
29
+ ```bash
30
+ yapi --version
31
+ ```
32
+
33
+ ### If not installed, ask user to install globally
34
+ ```bash
35
+ npm install -g @leeguoo/yapi-mcp
36
+ # or
37
+ pnpm add -g @leeguoo/yapi-mcp
38
+ ```
39
+
40
+ ### Check login status
41
+ ```bash
42
+ yapi whoami
43
+ ```
44
+
45
+ ### If not logged in, login interactively
46
+ ```bash
47
+ yapi login
48
+ ```
49
+ This will prompt for:
50
+ - YApi base URL (e.g., https://yapi.example.com)
51
+ - Email
52
+ - Password
53
+
54
+ Config is saved to `~/.yapi/config.toml`.
55
+
56
+ ## Workflow
57
+ 1. If user provides a YApi URL, check if it matches configured `base_url` in `~/.yapi/config.toml`.
58
+ 2. Ensure yapi CLI is installed (prompt user to install globally if missing).
59
+ 3. Check login status with `yapi whoami`; if not logged in, run `yapi login`.
60
+ 4. Load config from `~/.yapi/config.toml` (base_url, auth_mode, email/password or token, optional project_id).
61
+ 5. Identify the target interface by id, URL, or keyword; ask for project/category ids if needed.
62
+ 6. Call YApi endpoints with the CLI (see examples below) to fetch raw JSON.
63
+ 7. Summarize method, path, headers, query/body schema, response schema, and examples.
64
+
65
+ ## CLI Usage
66
+ - Config location: `~/.yapi/config.toml`
67
+ - Auth cache: `~/.yapi-mcp/auth-*.json`
68
+
69
+ ### Common commands
70
+ ```bash
71
+ # Check version
72
+ yapi --version
73
+
74
+ # Show help
75
+ yapi -h
76
+
77
+ # Check current user
78
+ yapi whoami
79
+
80
+ # Login (interactive)
81
+ yapi login
82
+
83
+ # Search interfaces
84
+ yapi search --q keyword
85
+
86
+ # Get interface by ID
87
+ yapi --path /api/interface/get --query id=123
88
+
89
+ # List interfaces in category
90
+ yapi --path /api/interface/list_cat --query catid=123
91
+ ```
92
+
93
+ ## Docs sync
94
+ - Bind local docs to YApi category with `yapi docs-sync bind add --name <binding> --dir <path> --project-id <id> --catid <id>` (stored in `.yapi/docs-sync.json`).
95
+ - Sync with `yapi docs-sync --binding <binding>` or run all bindings with `yapi docs-sync`.
96
+ - Default syncs only changed files; use `--force` to sync everything.
97
+ - Mermaid rendering depends on `mmdc` (auto-installed if possible; failures do not block sync).
98
+ - For full Markdown render, install `pandoc` (manual install required).
99
+ - Extra mappings (generated after docs-sync run in binding mode):
100
+ - `.yapi/docs-sync.links.json`: local docs to YApi doc URLs.
101
+ - `.yapi/docs-sync.projects.json`: cached project metadata/envs.
102
+ - `.yapi/docs-sync.deployments.json`: local docs to deployed URLs.
103
+
104
+ ## Interface creation tips
105
+ - When adding interfaces, always set `req_body_type` (use `json` if unsure) and provide `res_body` (prefer JSON Schema). Empty values can make `/api/interface/add` fail.
106
+ - Keep request/response structures in `req_*` / `res_body` instead of stuffing them into `desc` or `markdown`.