nx-mcp-server 1.0.4 → 1.0.5
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 +135 -97
- package/config.json +3 -5
- package/package.json +6 -12
- package/src/config.js +48 -0
- package/src/index.js +14 -217
- package/src/nx-api.js +209 -0
- package/src/tools/definitions.js +19 -0
- package/src/tools/handlers.js +15 -0
- package/.claude/settings.json +0 -11
- package/src/providers/tongyi.js +0 -153
- package/src/tools/barcode.js +0 -176
- package/src/tools/basic.js +0 -121
- package/src/tools/colors.js +0 -83
- package/src/tools/compress.js +0 -31
- package/src/tools/convert.js +0 -48
- package/src/tools/qrcode.js +0 -80
- package/src/tools/smart.js +0 -46
- package/src/tools/stitch.js +0 -68
- package/src/tools/watermark.js +0 -88
- package/src/utils/gradient.js +0 -27
- package/src/utils/output.js +0 -73
package/README.md
CHANGED
|
@@ -1,167 +1,205 @@
|
|
|
1
1
|
# NX MCP Server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
远程图片压缩 MCP Server,调用 NX API 对图片进行智能压缩,返回七牛 CDN URL 及压缩比。支持 **Stdio** 和 **Streamable HTTP** 双传输模式。
|
|
4
|
+
|
|
5
|
+
---
|
|
4
6
|
|
|
5
7
|
## 工具列表
|
|
6
8
|
|
|
7
|
-
### 智能生图(通义万相 API)
|
|
8
9
|
| 工具 | 说明 |
|
|
9
10
|
|------|------|
|
|
10
|
-
| `
|
|
11
|
+
| `nx_compress` | 智能压缩图片,支持 HTTP URL / 本地路径 / dataUrl / base64,可自动覆盖或另存 |
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
| 工具 | 说明 |
|
|
14
|
-
|------|------|
|
|
15
|
-
| `generate_basic` | 图形合成:形状/文字/图片叠加 |
|
|
16
|
-
| `generate_qrcode` | 二维码生成(支持中心 logo + 文字水印) |
|
|
17
|
-
| `generate_barcode` | 条形码生成(CODE128/CODE39/EAN13/EAN8/UPC/ITF) |
|
|
18
|
-
| `compress_image` | 图片压缩(质量/尺寸) |
|
|
19
|
-
| `convert_format` | 格式互转(PNG↔JPEG↔WebP↔BMP↔TIFF→AVIF) |
|
|
20
|
-
| `stitch_images` | 多图拼接/网格布局 |
|
|
21
|
-
| `extract_colors` | 提取图片主色调(hex/rgb/hsl) |
|
|
22
|
-
| `add_watermark` | 文字/图片水印(支持平铺) |
|
|
13
|
+
---
|
|
23
14
|
|
|
24
|
-
##
|
|
15
|
+
## nx_compress 参数
|
|
25
16
|
|
|
26
|
-
|
|
17
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
18
|
+
|------|------|------|--------|------|
|
|
19
|
+
| `urls` | `string[]` | 与 files 二选一 | - | 图片列表,支持 HTTP(S) URL、本地绝对路径、data URL |
|
|
20
|
+
| `files` | `string[]` | 与 urls 二选一 | - | dataUrl 格式图片列表(`data:image/...;base64,...`) |
|
|
21
|
+
| `quality` | `integer` | 否 | `90` | 压缩质量 1~100,越大质量越高 |
|
|
22
|
+
| `output` | `string` | 否 | - | `"overwrite"` 覆盖原文件 / 目录路径另存(如 `E:/output/`) |
|
|
27
23
|
|
|
28
|
-
|
|
24
|
+
> `urls` 和 `files` 可同时传,合并后按顺序处理。
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 两种请求模式
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
根据传入内容自动选择:
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
| | 模式A:JSON | 模式B:FormData |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| **触发条件** | 全部是 HTTP(S) URL | 含本地路径 / dataUrl / `files` |
|
|
35
|
+
| **请求头** | `Content-Type: application/json` + `Authorization` | `Authorization`(FormData 自动设 Content-Type) |
|
|
36
|
+
| **请求体** | `{"urls":[...], "quality":90}` | multipart: `files=[Blob,...]`, `quality=90` |
|
|
37
|
+
| **适用** | 远程 MCP / 图片已在 CDN | 本地 MCP / 直接传图片数据 |
|
|
38
|
+
|
|
39
|
+
> 返回中的 `mode` 字段标明实际使用的模式(`"json"` / `"formdata"`)。
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 传入内容限制
|
|
44
|
+
|
|
45
|
+
| 传入方式 | 本地 MCP(Stdio / localhost HTTP) | 远程 MCP(云端部署) | 说明 |
|
|
46
|
+
|----------|-----------------------------------|---------------------|------|
|
|
47
|
+
| **HTTP(S) URL** | ✅ | ✅ | 远程唯一可用方式 |
|
|
48
|
+
| **本地绝对路径** `C:\...` `/path/...` | ✅ | ❌ | MCP Server 直接读磁盘,远程无法访问 |
|
|
49
|
+
| **data URL** `data:image/...;base64,...` | ✅ | ⚠️ 受限 | HTTP 模式默认 50MB body 限制,超限用本地路径 |
|
|
50
|
+
| **`files` 参数** | ✅ | ⚠️ 受限 | 同上,走 FormData 模式 |
|
|
51
|
+
|
|
52
|
+
### 各场景推荐用法
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
# 本地 Claude Code(Stdio,无限制)
|
|
56
|
+
nx_compress urls: ["C:/Users/me/photo.png"] quality: 80 output: "overwrite"
|
|
57
|
+
|
|
58
|
+
# 远程 / npx(只能传 HTTP 链接)
|
|
59
|
+
nx_compress urls: ["https://cdn.example.com/photo.png"] quality: 80
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## API Key 配置
|
|
65
|
+
|
|
66
|
+
**优先级**:参数 `apiKey` > 环境变量 `NX_API_KEY`
|
|
67
|
+
|
|
68
|
+
### 方式一:MCP 环境变量
|
|
33
69
|
|
|
34
70
|
```json
|
|
35
71
|
{
|
|
36
72
|
"mcpServers": {
|
|
37
73
|
"nx-mcp": {
|
|
38
|
-
"command": "
|
|
39
|
-
"args": ["
|
|
74
|
+
"command": "node",
|
|
75
|
+
"args": ["/path/to/mcp-server/src/index.js"],
|
|
76
|
+
"env": {
|
|
77
|
+
"NX_API_KEY": "your-key"
|
|
78
|
+
}
|
|
40
79
|
}
|
|
41
80
|
}
|
|
42
81
|
}
|
|
43
82
|
```
|
|
44
83
|
|
|
45
|
-
|
|
84
|
+
### 方式二:npm 包参数传入
|
|
85
|
+
|
|
86
|
+
```js
|
|
87
|
+
import {compressImage} from 'nx-mcp-server/src/nx-api.js';
|
|
88
|
+
|
|
89
|
+
const result=await compressImage({
|
|
90
|
+
urls:['https://example.com/photo.png'],
|
|
91
|
+
apiKey:'your-key',
|
|
92
|
+
});
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## output 输出模式
|
|
98
|
+
|
|
99
|
+
| output 值 | 效果 | 示例 |
|
|
100
|
+
|-----------|------|------|
|
|
101
|
+
| 不传 | 只返回 CDN URL,不写文件 | 预览用 |
|
|
102
|
+
| `"overwrite"` | 下载压缩版覆盖原文件 | 仅本地路径有效 |
|
|
103
|
+
| 目录路径 | 下载压缩版另存到指定目录 | `E:/output/` 或 `/tmp/out/` |
|
|
104
|
+
|
|
105
|
+
返回示例(含 output):
|
|
46
106
|
|
|
47
107
|
```json
|
|
48
108
|
{
|
|
49
|
-
"
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
"
|
|
54
|
-
|
|
55
|
-
|
|
109
|
+
"success": true,
|
|
110
|
+
"mode": "formdata",
|
|
111
|
+
"items": [
|
|
112
|
+
{
|
|
113
|
+
"originalUrl": "E:/images/photo.png",
|
|
114
|
+
"compressedUrl": "https://qiniucdn.nxtici.cn/compressed/xxx.png",
|
|
115
|
+
"originalSize": 3156532,
|
|
116
|
+
"compressedSize": 397952,
|
|
117
|
+
"ratio": "87.4%",
|
|
118
|
+
"outputPath": "E:/images/photo.png",
|
|
119
|
+
"outputSize": 397952
|
|
56
120
|
}
|
|
57
|
-
|
|
121
|
+
],
|
|
122
|
+
"summary": { "total": 1, "success": 1, "failed": 0 },
|
|
123
|
+
"output": { "mode": "overwrite", "count": 1 }
|
|
58
124
|
}
|
|
59
125
|
```
|
|
60
126
|
|
|
61
|
-
|
|
127
|
+
---
|
|
62
128
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
129
|
+
## 快速开始
|
|
130
|
+
|
|
131
|
+
### 方式一:魔搭 MCP 广场(推荐)
|
|
132
|
+
|
|
133
|
+
在魔搭 MCP 广场搜索 **NX MCP Server**,一键同步到 Cherry Studio 或复制配置到其他客户端。
|
|
68
134
|
|
|
69
|
-
|
|
135
|
+
### 方式二:npx 一键运行(Claude Code / 其他客户端)
|
|
70
136
|
|
|
71
137
|
```json
|
|
72
138
|
{
|
|
73
139
|
"mcpServers": {
|
|
74
140
|
"nx-mcp": {
|
|
75
|
-
"command": "
|
|
76
|
-
"args": ["
|
|
141
|
+
"command": "npx",
|
|
142
|
+
"args": ["-y", "nx-mcp-server"],
|
|
77
143
|
"env": {
|
|
78
|
-
"
|
|
144
|
+
"NX_API_KEY": "your-key"
|
|
79
145
|
}
|
|
80
146
|
}
|
|
81
147
|
}
|
|
82
148
|
}
|
|
83
149
|
```
|
|
84
150
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
智能生图(`generate_smart`)需要通义万相 API Key,四种传入方式按优先级排序:
|
|
88
|
-
|
|
89
|
-
1. **调用时传参**:使用 `generate_smart` 时传入 `apiKey` 参数
|
|
90
|
-
2. **MCP 客户端 env**:配置中设置 `DASHSCOPE_API_KEY`(见上方示例)
|
|
91
|
-
3. **系统环境变量**:`export DASHSCOPE_API_KEY="sk-xxx"`
|
|
92
|
-
4. **config.json**:项目根目录 `config.json` 中配置 `dashscope_api_key`
|
|
93
|
-
|
|
94
|
-
> 其余 8 个本地工具无需 API Key,可直接使用。
|
|
151
|
+
---
|
|
95
152
|
|
|
96
153
|
## 传输模式
|
|
97
154
|
|
|
98
|
-
| 模式 | 环境变量 |
|
|
99
|
-
|
|
100
|
-
| **Stdio**(默认) | 不设 |
|
|
101
|
-
| **HTTP** | `MCP_TRANSPORT=http` |
|
|
102
|
-
|
|
103
|
-
## 使用示例
|
|
155
|
+
| 模式 | 环境变量 | body 限制 | 适用 |
|
|
156
|
+
|------|---------|----------|------|
|
|
157
|
+
| **Stdio**(默认) | 不设 | 无限制 | Claude Code、Cherry Studio 本地 |
|
|
158
|
+
| **HTTP** | `MCP_TRANSPORT=http` | 50MB(JSON/FormData) | 云端托管 |
|
|
104
159
|
|
|
105
|
-
|
|
160
|
+
HTTP 模式启动:
|
|
106
161
|
|
|
107
|
-
```
|
|
108
|
-
|
|
162
|
+
```bash
|
|
163
|
+
MCP_TRANSPORT=http MCP_PORT=3000 NX_API_KEY=your-key node src/index.js
|
|
164
|
+
# → http://0.0.0.0:3000/mcp
|
|
165
|
+
# → http://localhost:3000/health
|
|
109
166
|
```
|
|
110
167
|
|
|
111
|
-
|
|
168
|
+
---
|
|
112
169
|
|
|
113
|
-
|
|
114
|
-
用 generate_basic 生成一张 800×400 深蓝色背景、中间白色文字 "Hello World" 的 banner
|
|
115
|
-
```
|
|
170
|
+
## 支持的图片格式
|
|
116
171
|
|
|
117
|
-
|
|
172
|
+
`png` `jpg` `jpeg` `bmp` `webp` `tga`
|
|
118
173
|
|
|
119
|
-
|
|
120
|
-
把这三张图片用 stitch_images 拼成 2 列的网格
|
|
121
|
-
```
|
|
174
|
+
---
|
|
122
175
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
```
|
|
126
|
-
先 extract_colors 提取这张图的 5 个主色,再用 add_watermark 加文字水印,颜色用提取的第一个颜色
|
|
127
|
-
```
|
|
176
|
+
## 注意事项
|
|
128
177
|
|
|
129
|
-
|
|
178
|
+
1. **远程 MCP 只能传 HTTP(S) 链接**,先上传到 CDN 再调用
|
|
179
|
+
2. 本地 MCP 可传绝对路径,MCP Server 直接读磁盘(免上传)
|
|
180
|
+
3. dataUrl 走 FormData 模式,HTTP body 限制 50MB,大图建议用本地路径
|
|
181
|
+
4. 多张图片顺序处理,单张失败不影响其他
|
|
182
|
+
5. 同步接口,超时 180 秒
|
|
183
|
+
6. 压缩后返回七牛 CDN URL,可下载或配合 `output` 直接写文件
|
|
130
184
|
|
|
131
|
-
|
|
132
|
-
- Claude Desktop / Claude Code
|
|
133
|
-
- Cursor / VS Code
|
|
134
|
-
- 通义灵码
|
|
135
|
-
- 任何支持 MCP 协议的客户端
|
|
185
|
+
---
|
|
136
186
|
|
|
137
187
|
## 项目结构
|
|
138
188
|
|
|
139
189
|
```
|
|
140
190
|
src/
|
|
141
|
-
├── index.js
|
|
142
|
-
├──
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
│ ├── qrcode.js # 二维码
|
|
148
|
-
│ ├── barcode.js # 条形码
|
|
149
|
-
│ ├── compress.js # 图片压缩
|
|
150
|
-
│ ├── convert.js # 格式转换
|
|
151
|
-
│ ├── stitch.js # 图片拼接
|
|
152
|
-
│ ├── colors.js # 取色
|
|
153
|
-
│ └── watermark.js # 水印
|
|
154
|
-
└── utils/
|
|
155
|
-
├── output.js # 文件输出
|
|
156
|
-
└── gradient.js # 渐变背景
|
|
191
|
+
├── index.js # MCP Server 主入口(Stdio/HTTP 双模式)
|
|
192
|
+
├── config.js # 配置加载(config.json + 环境变量)
|
|
193
|
+
├── nx-api.js # 压缩 API 客户端(JSON/FormData 双模式 + 本地文件读取)
|
|
194
|
+
└── tools/
|
|
195
|
+
├── definitions.js # MCP 工具定义
|
|
196
|
+
└── handlers.js # 工具处理函数
|
|
157
197
|
```
|
|
158
198
|
|
|
159
199
|
## 依赖
|
|
160
200
|
|
|
161
201
|
- `@modelcontextprotocol/sdk` — MCP 协议
|
|
162
|
-
- `
|
|
163
|
-
- `qrcode` — 二维码生成
|
|
164
|
-
- `axios` — HTTP 请求
|
|
202
|
+
- `express` — HTTP 传输模式的 body 解析(50MB 限制)
|
|
165
203
|
|
|
166
204
|
## License
|
|
167
205
|
|
package/config.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nx-mcp-server",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.5",
|
|
4
|
+
"description": "NX MCP Server — 远程图片压缩 MCP 工具",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.js",
|
|
7
7
|
"bin": {
|
|
@@ -9,26 +9,20 @@
|
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
11
|
"start": "node src/index.js",
|
|
12
|
-
"start:http": "
|
|
12
|
+
"start:http": "MCP_TRANSPORT=http MCP_PORT=3000 node src/index.js",
|
|
13
13
|
"dev": "node --watch src/index.js"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
16
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
17
|
-
"
|
|
18
|
-
"qrcode": "^1.5.3",
|
|
19
|
-
"axios": "^1.7.0",
|
|
20
|
-
"express": "^4.19.0",
|
|
21
|
-
"zod": "^3.25.0"
|
|
17
|
+
"express": "^4.19.0"
|
|
22
18
|
},
|
|
23
19
|
"engines": {
|
|
24
20
|
"node": ">=18.0.0"
|
|
25
21
|
},
|
|
26
22
|
"keywords": [
|
|
27
23
|
"mcp",
|
|
28
|
-
"image-
|
|
29
|
-
"
|
|
30
|
-
"watermark",
|
|
31
|
-
"image-processing"
|
|
24
|
+
"image-compression",
|
|
25
|
+
"nx-image-api"
|
|
32
26
|
],
|
|
33
27
|
"license": "MIT"
|
|
34
28
|
}
|
package/src/config.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {readFileSync} from 'fs';
|
|
2
|
+
import {join,dirname} from 'path';
|
|
3
|
+
import {fileURLToPath} from 'url';
|
|
4
|
+
|
|
5
|
+
const __dirname=dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const ROOT_DIR=join(__dirname,'..');
|
|
7
|
+
|
|
8
|
+
let _config=null;
|
|
9
|
+
|
|
10
|
+
// 加载 config.json
|
|
11
|
+
function loadConfigFile(){
|
|
12
|
+
try{
|
|
13
|
+
const raw=readFileSync(join(ROOT_DIR,'config.json'),'utf-8');
|
|
14
|
+
return JSON.parse(raw);
|
|
15
|
+
}catch(_e){
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// 获取配置(单例缓存)
|
|
21
|
+
function getConfig(){
|
|
22
|
+
if(_config) return _config;
|
|
23
|
+
|
|
24
|
+
const fileConfig=loadConfigFile();
|
|
25
|
+
|
|
26
|
+
// API 配置
|
|
27
|
+
const apiBaseUrl=process.env.NX_API_BASE_URL
|
|
28
|
+
||(fileConfig.api&&fileConfig.api.baseUrl)
|
|
29
|
+
||'https://ai.nxtici.com';
|
|
30
|
+
const apiKey=process.env.NX_API_KEY||'';
|
|
31
|
+
|
|
32
|
+
if(!apiKey){
|
|
33
|
+
console.error('⚠ 未配置 API Key,请设置环境变量 NX_API_KEY。获取 Key 请联系微信 zhjian_2026');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
_config={
|
|
37
|
+
api:{baseUrl:apiBaseUrl,apiKey},
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
return _config;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 测试用:重置缓存
|
|
44
|
+
function resetConfig(){
|
|
45
|
+
_config=null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export {getConfig,resetConfig};
|