@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 +43 -11
- package/dist/skill/install.js +59 -550
- package/dist/skill/install.js.map +1 -1
- package/package.json +3 -2
- package/skill-template/SKILL.md +106 -0
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
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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
|
-
|
|
128
|
+
yapi docs-sync --binding projectA
|
|
97
129
|
# 或同步 .yapi/docs-sync.json 内的所有绑定
|
|
98
|
-
|
|
130
|
+
yapi docs-sync
|
|
99
131
|
```
|
|
100
132
|
|
|
101
133
|
说明:
|
package/dist/skill/install.js
CHANGED
|
@@ -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
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
""
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
""
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
"",
|
|
56
|
-
|
|
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
|
-
|
|
739
|
-
|
|
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
|
-
|
|
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(
|
|
755
|
-
|
|
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.
|
|
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`.
|