@leeguoo/yapi-mcp 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +328 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +17 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.js +174 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.js +847 -0
- package/dist/server.js.map +1 -0
- package/dist/services/yapi/api.d.ts +56 -0
- package/dist/services/yapi/api.js +432 -0
- package/dist/services/yapi/api.js.map +1 -0
- package/dist/services/yapi/auth.d.ts +24 -0
- package/dist/services/yapi/auth.js +239 -0
- package/dist/services/yapi/auth.js.map +1 -0
- package/dist/services/yapi/authCache.d.ts +29 -0
- package/dist/services/yapi/authCache.js +127 -0
- package/dist/services/yapi/authCache.js.map +1 -0
- package/dist/services/yapi/cache.d.ts +11 -0
- package/dist/services/yapi/cache.js +143 -0
- package/dist/services/yapi/cache.js.map +1 -0
- package/dist/services/yapi/logger.d.ts +17 -0
- package/dist/services/yapi/logger.js +61 -0
- package/dist/services/yapi/logger.js.map +1 -0
- package/dist/services/yapi/types.d.ts +102 -0
- package/dist/services/yapi/types.js +3 -0
- package/dist/services/yapi/types.js.map +1 -0
- package/dist/services/yapi.d.ts +28 -0
- package/dist/services/yapi.js +84 -0
- package/dist/services/yapi.js.map +1 -0
- package/package.json +80 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Graham Lipsman
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
# Yapi Auto MCP Server
|
|
2
|
+
|
|
3
|
+
一个用于 YApi 的 Model Context Protocol (MCP) 服务器,让你能够在 Cursor 等 AI 编程工具中直接操作 YApi 接口文档。
|
|
4
|
+
|
|
5
|
+
## 项目简介
|
|
6
|
+
|
|
7
|
+
Yapi Auto MCP Server 是一个基于 [Model Context Protocol](https://modelcontextprotocol.io/) 的服务器,专为 YApi 接口管理平台设计。它允许你在 Cursor、Claude Desktop 等支持 MCP 的 AI 工具中直接:
|
|
8
|
+
|
|
9
|
+
- 🔍 **搜索和查看** YApi 项目中的接口文档
|
|
10
|
+
- ✏️ **创建和更新** 接口定义
|
|
11
|
+
- 📋 **管理项目和分类** 结构
|
|
12
|
+
- 🔗 **无缝集成** AI 编程工作流
|
|
13
|
+
- 🛠 **支持多个 YApi Project配置**
|
|
14
|
+
|
|
15
|
+
通过 MCP 协议,AI 助手可以理解你的 YApi 接口结构,在编程过程中提供更准确的建议和代码生成。
|
|
16
|
+
|
|
17
|
+
## 主要功能
|
|
18
|
+
|
|
19
|
+
### 🔍 接口查询和搜索
|
|
20
|
+
|
|
21
|
+
- **yapi_search_apis**: 按名称、路径、标签等条件搜索接口
|
|
22
|
+
- **yapi_get_api_desc**: 获取特定接口的详细信息(请求/响应结构、参数等)
|
|
23
|
+
- **yapi_interface_get**: 获取接口原始数据(对应 `/api/interface/get`)
|
|
24
|
+
- **yapi_interface_list**: 获取接口列表(对应 `/api/interface/list`)
|
|
25
|
+
- **yapi_interface_list_cat**: 获取分类下接口列表(对应 `/api/interface/list_cat`)
|
|
26
|
+
- **yapi_interface_list_menu**: 获取接口菜单列表(对应 `/api/interface/list_menu`)
|
|
27
|
+
- **yapi_list_projects**: 列出所有可访问的项目
|
|
28
|
+
- **yapi_project_get**: 获取项目详情(对应 `/api/project/get`)
|
|
29
|
+
- **yapi_get_categories**: 获取项目下的接口分类和接口列表(支持只返回分类/或包含接口列表)
|
|
30
|
+
- **yapi_interface_get_cat_menu**: 获取分类菜单(对应 `/api/interface/getCatMenu`)
|
|
31
|
+
- **yapi_update_token**: 全局模式登录并刷新本地项目 token 缓存(只需配置一次账号密码)
|
|
32
|
+
|
|
33
|
+
### ✏️ 接口管理
|
|
34
|
+
|
|
35
|
+
- **yapi_save_api**: 创建新接口或更新现有接口
|
|
36
|
+
- 支持完整的接口定义(路径、方法、参数、请求体、响应等)
|
|
37
|
+
- 支持 JSON Schema 和表单数据格式
|
|
38
|
+
- 自动处理接口状态和分类管理
|
|
39
|
+
- 建议把「枚举值/中文备注/示例」优先写在 `req_params` / `req_query` / `req_headers` / `req_body_*` / `res_body`,`desc` 只写一句话简介;更新接口时未提供的字段会尽量保留原值
|
|
40
|
+
- **yapi_interface_add**: 新增接口(对应 `/api/interface/add`)
|
|
41
|
+
- **yapi_interface_up**: 更新接口(对应 `/api/interface/up`)
|
|
42
|
+
- **yapi_interface_save**: 新增或更新接口(对应 `/api/interface/save`)
|
|
43
|
+
- **yapi_interface_add_cat**: 新增接口分类(对应 `/api/interface/add_cat`)
|
|
44
|
+
- **yapi_open_import_data**: 服务端数据导入(对应 `/api/open/import_data`)
|
|
45
|
+
|
|
46
|
+
### 🎯 智能特性
|
|
47
|
+
|
|
48
|
+
- **多项目支持**: 同时管理多个 YApi 项目
|
|
49
|
+
- **缓存机制**: 提高查询响应速度
|
|
50
|
+
- **详细日志**: 便于调试和监控
|
|
51
|
+
- **灵活配置**: 支持环境变量和命令行参数
|
|
52
|
+
|
|
53
|
+
## 快速开始
|
|
54
|
+
|
|
55
|
+
### 推荐方式:用 Cross Request Master 一键生成 MCP 配置(免手动找 Token)
|
|
56
|
+
|
|
57
|
+
如果你日常就在浏览器里使用 YApi,推荐安装 Chrome 扩展 [cross-request-master](https://github.com/leeguooooo/cross-request-master)。它会在 YApi 接口详情页(基本信息区域右上角)提供 **「当前项目 MCP 配置」** / **「所有项目 MCP 配置」** 按钮,可一键生成并复制配置:
|
|
58
|
+
|
|
59
|
+
- 当前项目:使用 `--yapi-token=projectId:token`
|
|
60
|
+
- 整个项目(全局模式):使用 `--yapi-auth-mode=global`(账号密码),启动后再调用一次 `yapi_update_token` 自动缓存所有项目 token
|
|
61
|
+
|
|
62
|
+
### 手动方式:使用 npx(无需安装)
|
|
63
|
+
|
|
64
|
+
你可以选择两种模式:
|
|
65
|
+
|
|
66
|
+
1) **项目 Token 模式**(与 Cross Request Master 的一键配置一致)
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"mcpServers": {
|
|
71
|
+
"yapi-auto-mcp": {
|
|
72
|
+
"command": "npx",
|
|
73
|
+
"args": [
|
|
74
|
+
"-y",
|
|
75
|
+
"@leeguoo/yapi-mcp",
|
|
76
|
+
"--stdio",
|
|
77
|
+
"--yapi-base-url=https://your-yapi-domain.com",
|
|
78
|
+
"--yapi-token=projectId:your_token_here"
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
2) **全局模式**(只配置一次账号密码,项目 token 自动本地缓存)
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"mcpServers": {
|
|
90
|
+
"yapi-auto-mcp": {
|
|
91
|
+
"command": "npx",
|
|
92
|
+
"args": [
|
|
93
|
+
"-y",
|
|
94
|
+
"@leeguoo/yapi-mcp",
|
|
95
|
+
"--stdio",
|
|
96
|
+
"--yapi-base-url=https://your-yapi-domain.com",
|
|
97
|
+
"--yapi-auth-mode=global",
|
|
98
|
+
"--yapi-email=your_email@example.com",
|
|
99
|
+
"--yapi-password=your_password"
|
|
100
|
+
]
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
启动后先在对话里调用一次 `yapi_update_token`,会把 `projectId -> token` 缓存到本地 `~/.yapi-mcp/auth-*.json`,后续所有工具就都能直接使用了。
|
|
107
|
+
|
|
108
|
+
## 安装配置
|
|
109
|
+
|
|
110
|
+
### 方式一:npx 直接使用(推荐)
|
|
111
|
+
|
|
112
|
+
无需本地安装,通过 npx 直接运行:
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"mcpServers": {
|
|
117
|
+
"yapi-auto-mcp": {
|
|
118
|
+
"command": "npx",
|
|
119
|
+
"args": [
|
|
120
|
+
"-y",
|
|
121
|
+
"@leeguoo/yapi-mcp",
|
|
122
|
+
"--stdio",
|
|
123
|
+
"--yapi-base-url=https://yapi.example.com",
|
|
124
|
+
"--yapi-token=projectId:token1,projectId2:token2",
|
|
125
|
+
"--yapi-cache-ttl=10",
|
|
126
|
+
"--yapi-log-level=info"
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 方式二:使用环境变量
|
|
134
|
+
|
|
135
|
+
在 MCP 配置中定义环境变量:
|
|
136
|
+
|
|
137
|
+
```json
|
|
138
|
+
{
|
|
139
|
+
"mcpServers": {
|
|
140
|
+
"yapi-auto-mcp": {
|
|
141
|
+
"command": "npx",
|
|
142
|
+
"args": [
|
|
143
|
+
"-y",
|
|
144
|
+
"@leeguoo/yapi-mcp",
|
|
145
|
+
"--stdio"
|
|
146
|
+
],
|
|
147
|
+
"env": {
|
|
148
|
+
"YAPI_BASE_URL": "https://yapi.example.com",
|
|
149
|
+
"YAPI_TOKEN": "projectId:token1,projectId2:token2",
|
|
150
|
+
"YAPI_AUTH_MODE": "token",
|
|
151
|
+
"YAPI_CACHE_TTL": "10",
|
|
152
|
+
"YAPI_LOG_LEVEL": "info"
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
全局模式对应环境变量(更适合“只配置一次”):
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"mcpServers": {
|
|
164
|
+
"yapi-auto-mcp": {
|
|
165
|
+
"command": "npx",
|
|
166
|
+
"args": ["-y", "@leeguoo/yapi-mcp", "--stdio"],
|
|
167
|
+
"env": {
|
|
168
|
+
"YAPI_BASE_URL": "https://yapi.example.com",
|
|
169
|
+
"YAPI_AUTH_MODE": "global",
|
|
170
|
+
"YAPI_EMAIL": "your_email@example.com",
|
|
171
|
+
"YAPI_PASSWORD": "your_password"
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### 方式三:本地开发模式
|
|
179
|
+
|
|
180
|
+
适合需要修改代码或调试的场景:
|
|
181
|
+
|
|
182
|
+
1. **克隆和安装**:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
git clone <repository-url>
|
|
186
|
+
cd yapi-mcp
|
|
187
|
+
pnpm install
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
2. **配置环境变量**(在项目根目录创建 `.env` 文件):
|
|
191
|
+
|
|
192
|
+
```env
|
|
193
|
+
# YApi 基础配置
|
|
194
|
+
YAPI_BASE_URL=https://your-yapi-domain.com
|
|
195
|
+
YAPI_TOKEN=projectId:your_token_here,projectId2:your_token2_here
|
|
196
|
+
|
|
197
|
+
# 服务器配置
|
|
198
|
+
PORT=3388
|
|
199
|
+
|
|
200
|
+
# 可选配置
|
|
201
|
+
YAPI_CACHE_TTL=10
|
|
202
|
+
YAPI_LOG_LEVEL=info
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
3. **启动服务**:
|
|
206
|
+
|
|
207
|
+
**SSE 模式**(HTTP 服务):
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
pnpm run dev
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
然后在 Cursor 中配置:
|
|
214
|
+
|
|
215
|
+
```json
|
|
216
|
+
{
|
|
217
|
+
"mcpServers": {
|
|
218
|
+
"yapi-mcp": {
|
|
219
|
+
"url": "http://localhost:3388/sse"
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Stdio 模式**:
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
pnpm run build
|
|
229
|
+
node dist/cli.js --stdio
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## 使用指南
|
|
233
|
+
|
|
234
|
+
### 获取 YApi Token
|
|
235
|
+
|
|
236
|
+
如果你使用的是 **全局模式**(`--yapi-auth-mode=global` / `YAPI_AUTH_MODE=global`),可以不手动找项目 token:启动后在对话里调用一次 `yapi_update_token`,会自动登录并把所有可访问项目的 `projectId -> token` 缓存到本地。
|
|
237
|
+
|
|
238
|
+
1. 登录你的 YApi 平台
|
|
239
|
+
2. 进入项目设置页面
|
|
240
|
+
3. 在 Token 配置中生成或查看 Token
|
|
241
|
+
|
|
242
|
+
不想手动找 Token 的话,可以用 [cross-request-master](https://github.com/leeguooooo/cross-request-master) 在接口详情页一键生成 MCP 配置(会自动带上 `projectId:token`)。
|
|
243
|
+
|
|
244
|
+

|
|
245
|
+
|
|
246
|
+
Token 格式说明:
|
|
247
|
+
|
|
248
|
+
- 单项目:`projectId:token`
|
|
249
|
+
- 多项目:`projectId1:token1,projectId2:token2`
|
|
250
|
+
|
|
251
|
+
### 使用示例
|
|
252
|
+
|
|
253
|
+
配置完成后,你可以在 Cursor 中这样使用:
|
|
254
|
+
|
|
255
|
+

|
|
256
|
+
|
|
257
|
+
**常用操作示例**:
|
|
258
|
+
|
|
259
|
+
1. **搜索接口**:
|
|
260
|
+
|
|
261
|
+
> "帮我找一下用户登录相关的接口"
|
|
262
|
+
|
|
263
|
+
2. **查看接口详情**:
|
|
264
|
+
|
|
265
|
+
> "显示用户注册接口的详细信息"
|
|
266
|
+
|
|
267
|
+
3. **创建新接口**:
|
|
268
|
+
|
|
269
|
+
> "帮我创建一个获取用户列表的接口,路径是 /api/users,使用 GET 方法"
|
|
270
|
+
|
|
271
|
+
4. **更新接口**:
|
|
272
|
+
> "更新用户登录接口,添加验证码参数"
|
|
273
|
+
|
|
274
|
+
## 高级配置
|
|
275
|
+
|
|
276
|
+
### 命令行参数详解
|
|
277
|
+
|
|
278
|
+
| 参数 | 描述 | 示例 | 默认值 |
|
|
279
|
+
| ------------------ | ----------------------------- | ------------------------------------------ | ------ |
|
|
280
|
+
| `--yapi-base-url` | YApi 服务器基础 URL | `--yapi-base-url=https://yapi.example.com` | - |
|
|
281
|
+
| `--yapi-token` | YApi 项目 Token(支持多项目) | `--yapi-token=1026:token1,1027:token2` | - |
|
|
282
|
+
| `--yapi-auth-mode` | 鉴权模式:`token` 或 `global` | `--yapi-auth-mode=global` | token |
|
|
283
|
+
| `--yapi-email` | 全局模式登录邮箱 | `--yapi-email=a@b.com` | - |
|
|
284
|
+
| `--yapi-password` | 全局模式登录密码 | `--yapi-password=******` | - |
|
|
285
|
+
| `--yapi-cache-ttl` | 缓存时效(分钟) | `--yapi-cache-ttl=10` | 10 |
|
|
286
|
+
| `--yapi-log-level` | 日志级别 | `--yapi-log-level=info` | info |
|
|
287
|
+
| `--port` | HTTP 服务端口(SSE 模式) | `--port=3388` | 3388 |
|
|
288
|
+
| `--stdio` | 启用 stdio 模式(MCP 必需) | `--stdio` | - |
|
|
289
|
+
|
|
290
|
+
### 环境变量说明
|
|
291
|
+
|
|
292
|
+
创建 `.env` 文件进行配置:
|
|
293
|
+
|
|
294
|
+
```env
|
|
295
|
+
# 必需配置
|
|
296
|
+
YAPI_BASE_URL=https://your-yapi-domain.com
|
|
297
|
+
|
|
298
|
+
# 模式一:项目 Token 模式
|
|
299
|
+
YAPI_AUTH_MODE=token
|
|
300
|
+
YAPI_TOKEN=projectId:your_token_here
|
|
301
|
+
|
|
302
|
+
# 模式二:全局模式(只配置一次账号密码,启动后调用 yapi_update_token 缓存项目 token)
|
|
303
|
+
# YAPI_AUTH_MODE=global
|
|
304
|
+
# YAPI_EMAIL=your_email@example.com
|
|
305
|
+
# YAPI_PASSWORD=your_password
|
|
306
|
+
|
|
307
|
+
# 可选配置
|
|
308
|
+
PORT=3388 # HTTP 服务端口
|
|
309
|
+
YAPI_CACHE_TTL=10 # 缓存时效(分钟)
|
|
310
|
+
YAPI_LOG_LEVEL=info # 日志级别:debug, info, warn, error, none
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### 日志级别说明
|
|
314
|
+
|
|
315
|
+
- **debug**: 输出所有日志,包括详细的调试信息
|
|
316
|
+
- **info**: 输出信息、警告和错误日志(默认)
|
|
317
|
+
- **warn**: 只输出警告和错误日志
|
|
318
|
+
- **error**: 只输出错误日志
|
|
319
|
+
- **none**: 不输出任何日志
|
|
320
|
+
|
|
321
|
+
### 配置方式选择建议
|
|
322
|
+
|
|
323
|
+
| 使用场景 | 推荐方式 | 优势 |
|
|
324
|
+
| -------- | --------------------- | ------------------ |
|
|
325
|
+
| 日常使用 | npx + 命令行参数 | 无需安装,配置简单 |
|
|
326
|
+
| 团队共享 | npx + 环境变量 | 配置统一,易于管理 |
|
|
327
|
+
| 开发调试 | 本地安装 + SSE 模式 | 便于调试和修改代码 |
|
|
328
|
+
| 企业部署 | 本地安装 + stdio 模式 | 性能更好,更稳定 |
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const path_1 = require("path");
|
|
5
|
+
const dotenv_1 = require("dotenv");
|
|
6
|
+
const index_1 = require("./index");
|
|
7
|
+
(0, dotenv_1.config)({ path: (0, path_1.resolve)(process.cwd(), ".env") });
|
|
8
|
+
(0, index_1.startServer)().catch((error) => {
|
|
9
|
+
if (error instanceof Error) {
|
|
10
|
+
console.error("Failed to start server:", error.message);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
console.error("Failed to start server with unknown error:", error);
|
|
14
|
+
}
|
|
15
|
+
process.exit(1);
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,+BAA+B;AAC/B,mCAAgC;AAChC,mCAAsC;AAGtC,IAAA,eAAM,EAAC,EAAE,IAAI,EAAE,IAAA,cAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAEjD,IAAA,mBAAW,GAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACrC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface ServerConfig {
|
|
2
|
+
yapiBaseUrl: string;
|
|
3
|
+
yapiToken: string;
|
|
4
|
+
yapiAuthMode: "token" | "global";
|
|
5
|
+
yapiEmail: string;
|
|
6
|
+
yapiPassword: string;
|
|
7
|
+
port: number;
|
|
8
|
+
yapiCacheTTL: number;
|
|
9
|
+
yapiLogLevel: string;
|
|
10
|
+
configSources: {
|
|
11
|
+
yapiBaseUrl: "cli" | "env" | "default";
|
|
12
|
+
yapiToken: "cli" | "env" | "default";
|
|
13
|
+
yapiAuthMode: "cli" | "env" | "default";
|
|
14
|
+
yapiEmail: "cli" | "env" | "default";
|
|
15
|
+
yapiPassword: "cli" | "env" | "default";
|
|
16
|
+
port: "cli" | "env" | "default";
|
|
17
|
+
yapiCacheTTL: "cli" | "env" | "default";
|
|
18
|
+
yapiLogLevel: "cli" | "env" | "default";
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export declare function getServerConfig(): ServerConfig;
|
|
22
|
+
export {};
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getServerConfig = getServerConfig;
|
|
7
|
+
const dotenv_1 = require("dotenv");
|
|
8
|
+
const yargs_1 = __importDefault(require("yargs"));
|
|
9
|
+
const helpers_1 = require("yargs/helpers");
|
|
10
|
+
const logger_1 = require("./services/yapi/logger");
|
|
11
|
+
(0, dotenv_1.config)();
|
|
12
|
+
function maskApiKey(key) {
|
|
13
|
+
if (key.length <= 4)
|
|
14
|
+
return "****";
|
|
15
|
+
return `****${key.slice(-4)}`;
|
|
16
|
+
}
|
|
17
|
+
function maskSecret(value) {
|
|
18
|
+
if (!value)
|
|
19
|
+
return "";
|
|
20
|
+
if (value.length <= 2)
|
|
21
|
+
return "**";
|
|
22
|
+
return `${value[0]}***${value[value.length - 1]}`;
|
|
23
|
+
}
|
|
24
|
+
function getServerConfig() {
|
|
25
|
+
const argv = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
26
|
+
.options({
|
|
27
|
+
"yapi-base-url": {
|
|
28
|
+
type: "string",
|
|
29
|
+
description: "YApi服务器基础URL",
|
|
30
|
+
},
|
|
31
|
+
"yapi-token": {
|
|
32
|
+
type: "string",
|
|
33
|
+
description: "YApi服务器授权Token",
|
|
34
|
+
},
|
|
35
|
+
"yapi-auth-mode": {
|
|
36
|
+
type: "string",
|
|
37
|
+
description: "鉴权模式:token=项目 token;global=用户名/密码登录并缓存项目 token",
|
|
38
|
+
choices: ["token", "global"],
|
|
39
|
+
},
|
|
40
|
+
"yapi-email": {
|
|
41
|
+
type: "string",
|
|
42
|
+
description: "全局模式登录邮箱(/api/user/login 的 email 字段)",
|
|
43
|
+
},
|
|
44
|
+
"yapi-password": {
|
|
45
|
+
type: "string",
|
|
46
|
+
description: "全局模式登录密码(/api/user/login 的 password 字段)",
|
|
47
|
+
},
|
|
48
|
+
port: {
|
|
49
|
+
type: "number",
|
|
50
|
+
description: "Port to run the server on",
|
|
51
|
+
},
|
|
52
|
+
"yapi-cache-ttl": {
|
|
53
|
+
type: "number",
|
|
54
|
+
description: "YApi缓存有效期(分钟),默认10分钟",
|
|
55
|
+
},
|
|
56
|
+
"yapi-log-level": {
|
|
57
|
+
type: "string",
|
|
58
|
+
description: "YApi日志级别 (debug, info, warn, error)",
|
|
59
|
+
choices: ["debug", "info", "warn", "error"],
|
|
60
|
+
},
|
|
61
|
+
})
|
|
62
|
+
.help()
|
|
63
|
+
.parseSync();
|
|
64
|
+
const config = {
|
|
65
|
+
yapiBaseUrl: "http://localhost:3000",
|
|
66
|
+
yapiToken: "",
|
|
67
|
+
yapiAuthMode: "token",
|
|
68
|
+
yapiEmail: "",
|
|
69
|
+
yapiPassword: "",
|
|
70
|
+
port: 3388,
|
|
71
|
+
yapiCacheTTL: 10,
|
|
72
|
+
yapiLogLevel: "info",
|
|
73
|
+
configSources: {
|
|
74
|
+
yapiBaseUrl: "default",
|
|
75
|
+
yapiToken: "default",
|
|
76
|
+
yapiAuthMode: "default",
|
|
77
|
+
yapiEmail: "default",
|
|
78
|
+
yapiPassword: "default",
|
|
79
|
+
port: "default",
|
|
80
|
+
yapiCacheTTL: "default",
|
|
81
|
+
yapiLogLevel: "default",
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
if (argv["yapi-base-url"]) {
|
|
85
|
+
config.yapiBaseUrl = argv["yapi-base-url"];
|
|
86
|
+
config.configSources.yapiBaseUrl = "cli";
|
|
87
|
+
}
|
|
88
|
+
else if (process.env.YAPI_BASE_URL) {
|
|
89
|
+
config.yapiBaseUrl = process.env.YAPI_BASE_URL;
|
|
90
|
+
config.configSources.yapiBaseUrl = "env";
|
|
91
|
+
}
|
|
92
|
+
if (argv["yapi-token"]) {
|
|
93
|
+
config.yapiToken = argv["yapi-token"];
|
|
94
|
+
config.configSources.yapiToken = "cli";
|
|
95
|
+
}
|
|
96
|
+
else if (process.env.YAPI_TOKEN) {
|
|
97
|
+
config.yapiToken = process.env.YAPI_TOKEN;
|
|
98
|
+
config.configSources.yapiToken = "env";
|
|
99
|
+
}
|
|
100
|
+
if (argv["yapi-email"]) {
|
|
101
|
+
config.yapiEmail = argv["yapi-email"];
|
|
102
|
+
config.configSources.yapiEmail = "cli";
|
|
103
|
+
}
|
|
104
|
+
else if (process.env.YAPI_EMAIL) {
|
|
105
|
+
config.yapiEmail = process.env.YAPI_EMAIL;
|
|
106
|
+
config.configSources.yapiEmail = "env";
|
|
107
|
+
}
|
|
108
|
+
if (argv["yapi-password"]) {
|
|
109
|
+
config.yapiPassword = argv["yapi-password"];
|
|
110
|
+
config.configSources.yapiPassword = "cli";
|
|
111
|
+
}
|
|
112
|
+
else if (process.env.YAPI_PASSWORD) {
|
|
113
|
+
config.yapiPassword = process.env.YAPI_PASSWORD;
|
|
114
|
+
config.configSources.yapiPassword = "env";
|
|
115
|
+
}
|
|
116
|
+
if (argv["yapi-auth-mode"]) {
|
|
117
|
+
config.yapiAuthMode = argv["yapi-auth-mode"];
|
|
118
|
+
config.configSources.yapiAuthMode = "cli";
|
|
119
|
+
}
|
|
120
|
+
else if (process.env.YAPI_AUTH_MODE) {
|
|
121
|
+
const mode = process.env.YAPI_AUTH_MODE.toLowerCase();
|
|
122
|
+
if (mode === "token" || mode === "global") {
|
|
123
|
+
config.yapiAuthMode = mode;
|
|
124
|
+
config.configSources.yapiAuthMode = "env";
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
config.yapiAuthMode = config.yapiToken ? "token" : config.yapiEmail && config.yapiPassword ? "global" : "token";
|
|
129
|
+
}
|
|
130
|
+
if (argv.port) {
|
|
131
|
+
config.port = argv.port;
|
|
132
|
+
config.configSources.port = "cli";
|
|
133
|
+
}
|
|
134
|
+
else if (process.env.PORT) {
|
|
135
|
+
config.port = parseInt(process.env.PORT, 10);
|
|
136
|
+
config.configSources.port = "env";
|
|
137
|
+
}
|
|
138
|
+
if (argv["yapi-cache-ttl"]) {
|
|
139
|
+
config.yapiCacheTTL = argv["yapi-cache-ttl"];
|
|
140
|
+
config.configSources.yapiCacheTTL = "cli";
|
|
141
|
+
}
|
|
142
|
+
else if (process.env.YAPI_CACHE_TTL) {
|
|
143
|
+
const cacheTTL = parseInt(process.env.YAPI_CACHE_TTL, 10);
|
|
144
|
+
if (!isNaN(cacheTTL)) {
|
|
145
|
+
config.yapiCacheTTL = cacheTTL;
|
|
146
|
+
config.configSources.yapiCacheTTL = "env";
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (argv["yapi-log-level"]) {
|
|
150
|
+
config.yapiLogLevel = argv["yapi-log-level"];
|
|
151
|
+
config.configSources.yapiLogLevel = "cli";
|
|
152
|
+
}
|
|
153
|
+
else if (process.env.YAPI_LOG_LEVEL) {
|
|
154
|
+
const validLevels = ["debug", "info", "warn", "error"];
|
|
155
|
+
const logLevel = process.env.YAPI_LOG_LEVEL.toLowerCase();
|
|
156
|
+
if (validLevels.includes(logLevel)) {
|
|
157
|
+
config.yapiLogLevel = logLevel;
|
|
158
|
+
config.configSources.yapiLogLevel = "env";
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const logger = new logger_1.Logger("Config", config.yapiLogLevel);
|
|
162
|
+
logger.info("\nConfiguration:");
|
|
163
|
+
logger.info(`- YAPI_BASE_URL: ${config.yapiBaseUrl} (source: ${config.configSources.yapiBaseUrl})`);
|
|
164
|
+
logger.info(`- YAPI_TOKEN: ${config.yapiToken ? maskApiKey(config.yapiToken) : "未配置"} (source: ${config.configSources.yapiToken})`);
|
|
165
|
+
logger.info(`- YAPI_AUTH_MODE: ${config.yapiAuthMode} (source: ${config.configSources.yapiAuthMode})`);
|
|
166
|
+
logger.info(`- YAPI_EMAIL: ${config.yapiEmail || "未配置"} (source: ${config.configSources.yapiEmail})`);
|
|
167
|
+
logger.info(`- YAPI_PASSWORD: ${config.yapiPassword ? maskSecret(config.yapiPassword) : "未配置"} (source: ${config.configSources.yapiPassword})`);
|
|
168
|
+
logger.info(`- PORT: ${config.port} (source: ${config.configSources.port})`);
|
|
169
|
+
logger.info(`- YAPI_CACHE_TTL: ${config.yapiCacheTTL} 分钟 (source: ${config.configSources.yapiCacheTTL})`);
|
|
170
|
+
logger.info(`- YAPI_LOG_LEVEL: ${config.yapiLogLevel} (source: ${config.configSources.yapiLogLevel})`);
|
|
171
|
+
logger.info("");
|
|
172
|
+
return config;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.startServer = startServer;
|
|
18
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
19
|
+
const server_1 = require("./server");
|
|
20
|
+
const config_1 = require("./config");
|
|
21
|
+
const logger_1 = require("./services/yapi/logger");
|
|
22
|
+
__exportStar(require("./services/yapi/types"), exports);
|
|
23
|
+
__exportStar(require("./services/yapi/api"), exports);
|
|
24
|
+
__exportStar(require("./services/yapi/cache"), exports);
|
|
25
|
+
__exportStar(require("./services/yapi/logger"), exports);
|
|
26
|
+
async function startServer() {
|
|
27
|
+
const config = (0, config_1.getServerConfig)();
|
|
28
|
+
const logger = new logger_1.Logger("StartServer", config.yapiLogLevel);
|
|
29
|
+
const server = new server_1.YapiMcpServer(config.yapiBaseUrl, config.yapiToken, config.yapiLogLevel, config.yapiCacheTTL, {
|
|
30
|
+
mode: config.yapiAuthMode,
|
|
31
|
+
email: config.yapiEmail,
|
|
32
|
+
password: config.yapiPassword,
|
|
33
|
+
});
|
|
34
|
+
const isStdioMode = process.env.NODE_ENV === "cli" || process.argv.includes("--stdio");
|
|
35
|
+
if (isStdioMode) {
|
|
36
|
+
logger.info("Initializing Yapi MCP Server in stdio mode...");
|
|
37
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
38
|
+
await server.connect(transport);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
logger.info(`Initializing Yapi MCP Server in HTTP mode on port ${config.port}...`);
|
|
42
|
+
await server.startHttpServer(config.port);
|
|
43
|
+
}
|
|
44
|
+
logger.info("\n可用工具:");
|
|
45
|
+
logger.info("- yapi_get_api_desc: 获取YApi接口信息");
|
|
46
|
+
logger.info("- yapi_save_api: 新增或更新YApi接口");
|
|
47
|
+
logger.info("- yapi_search_apis: 搜索YApi接口");
|
|
48
|
+
logger.info("- yapi_list_projects: 列出YApi的项目ID和项目名称");
|
|
49
|
+
logger.info("- yapi_get_categories: 获取YApi项目下的接口分类列表");
|
|
50
|
+
logger.info("- yapi_update_token: 全局模式登录并刷新本地 token 缓存");
|
|
51
|
+
}
|
|
52
|
+
if (require.main === module) {
|
|
53
|
+
startServer().catch((error) => {
|
|
54
|
+
console.error("Failed to start server:", error);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAWA,kCAsCC;AAjDD,wEAAiF;AACjF,qCAAyC;AACzC,qCAA2C;AAC3C,mDAAgD;AAGhD,wDAAsC;AACtC,sDAAoC;AACpC,wDAAsC;AACtC,yDAAuC;AAEhC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,IAAA,wBAAe,GAAE,CAAC;IAGjC,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,aAAa,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAG9D,MAAM,MAAM,GAAG,IAAI,sBAAa,CAC9B,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,YAAY,EACnB;QACE,IAAI,EAAE,MAAM,CAAC,YAAY;QACzB,KAAK,EAAE,MAAM,CAAC,SAAS;QACvB,QAAQ,EAAE,MAAM,CAAC,YAAY;KAC9B,CACF,CAAC;IAGF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEvF,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,qDAAqD,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;QACnF,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC/C,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5C,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5C,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACtD,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;AAC3D,CAAC;AAGD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
2
|
+
export declare class YapiMcpServer {
|
|
3
|
+
private readonly server;
|
|
4
|
+
private readonly yapiService;
|
|
5
|
+
private readonly projectInfoCache;
|
|
6
|
+
private readonly logger;
|
|
7
|
+
private readonly authService;
|
|
8
|
+
private readonly authMode;
|
|
9
|
+
private sseTransport;
|
|
10
|
+
private readonly isStdioMode;
|
|
11
|
+
constructor(yapiBaseUrl: string, yapiToken: string, yapiLogLevel?: string, yapiCacheTTL?: number, auth?: {
|
|
12
|
+
mode?: "token" | "global";
|
|
13
|
+
email?: string;
|
|
14
|
+
password?: string;
|
|
15
|
+
});
|
|
16
|
+
private initializeCache;
|
|
17
|
+
private asyncUpdateCache;
|
|
18
|
+
private registerTools;
|
|
19
|
+
connect(transport: Transport): Promise<void>;
|
|
20
|
+
startHttpServer(port: number): Promise<void>;
|
|
21
|
+
}
|