nx-mcp-server 1.0.4 → 1.0.6

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
@@ -1,167 +1,205 @@
1
1
  # NX MCP Server
2
2
 
3
- 图像生成 MCP Server——智能生图(通义万相 API)+ 本地图形工具集,支持 Stdio 和 HTTP 双传输模式。
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
- | `generate_smart` | 文生图,调用通义万相模型 |
11
+ | `nx_compress` | 智能压缩图片,支持 HTTP URL / 本地路径 / dataUrl / base64,可自动覆盖或另存 |
11
12
 
12
- ### 本地图形工具(无需网络/API Key)
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
- ### 方式一:魔搭 MCP 广场(推荐)
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
- 在魔搭 MCP 广场搜索 **NX MCP Server**,一键同步到 Cherry Studio 或复制配置到其他客户端。
24
+ > `urls` `files` 可同时传,合并后按顺序处理。
25
+
26
+ ---
27
+
28
+ ## 两种请求模式
29
29
 
30
- ### 方式二:npx 一键运行
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": "npx",
39
- "args": ["-y", "nx-mcp-server"]
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
- 如果要用智能生图,传入 API Key:
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
- "mcpServers": {
50
- "nx-mcp": {
51
- "command": "npx",
52
- "args": ["-y", "nx-mcp-server"],
53
- "env": {
54
- "DASHSCOPE_API_KEY": "sk-你的key"
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
- ```bash
64
- git clone git@gitee.com:san_jing/nx-mcp-server.git
65
- cd nx-mcp-server
66
- npm install
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": "node",
76
- "args": ["/你的路径/nx-mcp-server/src/index.js"],
141
+ "command": "npx",
142
+ "args": ["-y", "nx-mcp-server"],
77
143
  "env": {
78
- "DASHSCOPE_API_KEY": "sk-你的key"
144
+ "NX_API_KEY": "your-key"
79
145
  }
80
146
  }
81
147
  }
82
148
  }
83
149
  ```
84
150
 
85
- ## API Key
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**(默认) | 不设 | 本地 Claude Code、Cherry Studio |
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
- generate_smart 生成一张 prompt 为 "夕阳下的海边灯塔,水彩风格" 的图片
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
- - Cherry Studio(魔搭一键同步)
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 # MCP Server 主入口
142
- ├── providers/
143
- │ └── tongyi.js # 通义万相 API
144
- ├── tools/
145
- ├── smart.js # 智能生图
146
- │ ├── basic.js # 普通生图
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
- - `sharp` — 高性能图片处理
163
- - `qrcode` — 二维码生成
164
- - `axios` — HTTP 请求
202
+ - `express` — HTTP 传输模式的 body 解析(50MB 限制)
165
203
 
166
204
  ## License
167
205
 
package/config.json CHANGED
@@ -1,7 +1,5 @@
1
1
  {
2
- "dashscope_api_key": "",
3
- "outputDir": "./output",
4
- "defaultModel": "wanx-v1",
5
- "defaultWidth": 1024,
6
- "defaultHeight": 1024
2
+ "api": {
3
+ "baseUrl": "https://ai.nxtici.com"
4
+ }
7
5
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nx-mcp-server",
3
- "version": "1.0.4",
4
- "description": "图像生成 MCP Server — 智能生图(万相API) + 本地图形工具集",
3
+ "version": "1.0.6",
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": "cross-env MCP_TRANSPORT=http MCP_PORT=3000 node src/index.js",
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
- "sharp": "^0.33.0",
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-generation",
29
- "qrcode",
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};