{"_id":"@bangdao-ai/mcp-image-compressor","_rev":"6-259c76a423f76943258b5a1c9c74db2d","name":"@bangdao-ai/mcp-image-compressor","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"@bangdao-ai/mcp-image-compressor","version":"1.0.0","keywords":["mcp","image","compress","modelcontextprotocol"],"license":"MIT","_id":"@bangdao-ai/mcp-image-compressor@1.0.0","maintainers":[{"name":"baigod","email":"387677341@qq.com"},{"name":"jingli.chang","email":"jingli.chang01@gmail.com"},{"name":"shaoshuai.liu","email":"shaoshuai.liu@bangdao-tech.com"},{"name":"ypsoul","email":"ypsoul94@163.com"},{"name":"cocowangruixue","email":"ruixue.wang@bangdao-tech.com"}],"bin":{"mcp-image-compressor":"dist/index.js"},"dist":{"shasum":"5cf8d3cba188ca0dd8dc056039fe0cf161e4f186","tarball":"https://registry.npmjs.org/@bangdao-ai/mcp-image-compressor/-/mcp-image-compressor-1.0.0.tgz","fileCount":6,"integrity":"sha512-fGw6d0rkpbZbVLjsm7QcGu9ilBGFY47Zt+8kuiPbWUQ/C7KgzFK9CFoQo/NgqhFUamhBjO8Md/u/hRlWW8AwRg==","signatures":[{"sig":"MEUCIBXxmAhzE93TBXHYosN02SUbE9U6J+v3PL33PnxnEDOeAiEA1KEiJl2QpwRjhcpZ65PsfyNny6wZsNW2Da+4q93B/w4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14067},"type":"module","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsx src/index.ts","build":"tsc","start":"node dist/index.js","client":"node dist/client.js"},"_npmUser":{"name":"ypsoul","email":"ypsoul94@163.com"},"repository":{"url":"","type":"git"},"_npmVersion":"11.6.2","description":"MCP Server for image compression","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^3.22.4","sharp":"^0.33.2","@modelcontextprotocol/sdk":"^1.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","typescript":"^5.3.3","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-image-compressor_1.0.0_1775186391921_0.5272526442253309","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bangdao-ai/mcp-image-compressor","version":"1.0.1","keywords":["mcp","image","compress","modelcontextprotocol"],"license":"MIT","_id":"@bangdao-ai/mcp-image-compressor@1.0.1","maintainers":[{"name":"baigod","email":"387677341@qq.com"},{"name":"jingli.chang","email":"jingli.chang01@gmail.com"},{"name":"shaoshuai.liu","email":"shaoshuai.liu@bangdao-tech.com"},{"name":"ypsoul","email":"ypsoul94@163.com"},{"name":"cocowangruixue","email":"ruixue.wang@bangdao-tech.com"}],"bin":{"mcp-image-compressor":"dist/index.js"},"dist":{"shasum":"5d958d7cdb36e0ebd433f20f133d0a0e373662ba","tarball":"https://registry.npmjs.org/@bangdao-ai/mcp-image-compressor/-/mcp-image-compressor-1.0.1.tgz","fileCount":6,"integrity":"sha512-uqw9VRbz2XzN4sc601PEzFAoqxKhwc/kNMZgWufJHanxiq97/a12aSLAgrnEtW0h7WNEkE3sLKaXpX4Fjek4lg==","signatures":[{"sig":"MEQCIHwDqLWqhVAC9KEPHD6wSZdmL5aJkqkE8t1uhA4oRMKKAiAYvI9VPW1+blKJF/qKO+IVQlrhr0bGWR23PGWnkf/ymg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14067},"type":"module","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsx src/index.ts","build":"tsc","start":"node dist/index.js","client":"node dist/client.js"},"_npmUser":{"name":"ypsoul","email":"ypsoul94@163.com"},"repository":{"url":"","type":"git"},"_npmVersion":"11.6.2","description":"MCP Server for image compression","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^3.22.4","sharp":"^0.33.2","@modelcontextprotocol/sdk":"^1.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","typescript":"^5.3.3","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-image-compressor_1.0.1_1775197423346_0.5159418460013778","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bangdao-ai/mcp-image-compressor","version":"1.0.2","keywords":["mcp","image","compress","modelcontextprotocol"],"license":"MIT","_id":"@bangdao-ai/mcp-image-compressor@1.0.2","maintainers":[{"name":"baigod","email":"387677341@qq.com"},{"name":"jingli.chang","email":"jingli.chang01@gmail.com"},{"name":"shaoshuai.liu","email":"shaoshuai.liu@bangdao-tech.com"},{"name":"ypsoul","email":"ypsoul94@163.com"},{"name":"cocowangruixue","email":"ruixue.wang@bangdao-tech.com"}],"bin":{"mcp-image-compressor":"dist/index.js"},"dist":{"shasum":"4da36e499bbc434bc373a219467c07199c10d6cd","tarball":"https://registry.npmjs.org/@bangdao-ai/mcp-image-compressor/-/mcp-image-compressor-1.0.2.tgz","fileCount":12,"integrity":"sha512-cyLh/B102d0jrpbY+VDOn4DojjgnD+yLTO9TXMmXxszkFk+YbU9AEpCY4irQ0vQJmSivZiBrRNs4Tr3JQCkn6w==","signatures":[{"sig":"MEUCICni1ITyIlx9FJWmmmDCABqUQBsI7EMw/wuJ4KVfdD1TAiEA9k6E8RsNYzN/woEDSbigYNYb7FqhBlKfsI9zUFNwGK0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64126},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"a3c96aeeec44b884aa509be1fe018feab6d8f9e3","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node --test dist/*.test.js","build":"tsc","start":"node dist/index.js","client":"node dist/client.js","release":"node release.mjs"},"_npmUser":{"name":"ypsoul","email":"ypsoul94@163.com"},"_npmVersion":"11.6.2","description":"MCP Server for image compression","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^3.22.4","sharp":"^0.33.2","@modelcontextprotocol/sdk":"^1.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","typescript":"^5.3.3","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-image-compressor_1.0.2_1776329732981_0.5811370786371515","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@bangdao-ai/mcp-image-compressor","version":"1.0.3","keywords":["mcp","image","compress","modelcontextprotocol"],"license":"MIT","_id":"@bangdao-ai/mcp-image-compressor@1.0.3","maintainers":[{"name":"baigod","email":"387677341@qq.com"},{"name":"jingli.chang","email":"jingli.chang01@gmail.com"},{"name":"shaoshuai.liu","email":"shaoshuai.liu@bangdao-tech.com"},{"name":"ypsoul","email":"ypsoul94@163.com"},{"name":"cocowangruixue","email":"ruixue.wang@bangdao-tech.com"}],"bin":{"mcp-image-compressor":"dist/index.js"},"dist":{"shasum":"ab540f47f5738abc750f056e8ca1a3fce0ff57f9","tarball":"https://registry.npmjs.org/@bangdao-ai/mcp-image-compressor/-/mcp-image-compressor-1.0.3.tgz","fileCount":12,"integrity":"sha512-+qS/f2+hv45ftDYT74B2usXObo7tbVoZ2/3biNFNhJjwwNqfVX/CRD5onSBPEs1U/sFp54FDuCBP+LvQn1Poog==","signatures":[{"sig":"MEUCIQDYpVgvmIZCIlCOugQi/bU2lBlXFE5OzSPAdIkj4cjb3AIgImMfyfDB+sJwOssc9p/lFgbEQwMAz8GiJ1YOW6j6RMk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64685},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"8c9535b96bd988b7ea89777fef837e91f7248a2c","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node --test dist/*.test.js","build":"tsc","start":"node dist/index.js","client":"node dist/client.js","release":"node release.mjs"},"_npmUser":{"name":"ypsoul","email":"ypsoul94@163.com"},"_npmVersion":"11.6.2","description":"MCP Server for image compression","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^3.22.4","sharp":"^0.33.2","@modelcontextprotocol/sdk":"^1.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","typescript":"^5.3.3","@types/node":"^20.11.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-image-compressor_1.0.3_1776910558327_0.7076896279961986","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-04-03T03:19:51.817Z","modified":"2026-08-28T05:50:14.770Z","1.0.0":"2026-04-03T03:19:52.082Z","1.0.1":"2026-04-03T06:23:43.490Z","1.0.2":"2026-04-16T08:55:33.103Z","1.0.3":"2026-04-23T02:15:58.471Z"},"license":"MIT","keywords":["mcp","image","compress","modelcontextprotocol"],"description":"MCP Server for image compression","maintainers":[{"email":"387677341@qq.com","name":"baigod"},{"email":"jingli.chang01@gmail.com","name":"jingli.chang"},{"email":"shaoshuai.liu@bangdao-tech.com","name":"shaoshuai.liu"},{"email":"ypsoul94@163.com","name":"ypsoul"},{"email":"sunyuanyue@bangdao-tech.com","name":"sunyuanyue"},{"email":"ruixue.wang@bangdao-tech.com","name":"cocowangruixue"},{"email":"ruixuewang2020@163.com","name":"cocowangruixue2"}],"readme":"# MCP Image Compressor\n\n基于 `@modelcontextprotocol/sdk` 实现的图片压缩 MCP Server。\n\n## 功能特性\n\n- 压缩图片文件（JPEG、PNG、WebP 格式）\n- 支持压缩 http/https 线上图片地址\n- 批量压缩整个文件夹中的图片\n- 可调节输出质量（1-100）\n- 支持按最大宽度/高度等比缩放\n- 支持限制最大文件大小\n- 支持格式转换\n- 支持递归子目录、输入格式过滤和保留目录结构输出\n- 支持域名白名单、下载超时/重试和临时文件自动清理\n\n## 环境要求\n\n- Node.js >= 18.0.0\n- npm >= 9.0.0\n\n## 安装\n\n```bash\nnpm install\n```\n\n## 构建\n\n```bash\nnpm run build\n```\n\n## 使用方式\n\n### 作为 MCP Server 运行\n\n```bash\nnpm start\n```\n\n### 在 Cursor 中使用（npx 方式）\n\n1. 在 Cursor 设置中添加 MCP Server：\n   - 打开 Cursor 设置 → Features → MCP\n   - 点击 \"Add New MCP Server\"\n\n2. 配置 server：\n   ```json\n   {\n     \"mcpServers\": {\n       \"image-compressor\": {\n         \"command\": \"npx\",\n         \"args\": [\"-y\", \"@bangdao-ai/mcp-image-compressor\"]\n       }\n     }\n   }\n   ```\n\n3. 重启 Cursor 后，在 AI 对话框中即可使用图片压缩功能\n\n### 在 Cursor 中使用（本地开发方式）\n\n```json\n{\n  \"mcpServers\": {\n    \"image-compressor\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/mcp/dist/index.js\"]\n    }\n  }\n}\n```\n\n## 工具参数\n\n### `compress-image`\n\n| 参数 | 类型 | 必填 | 默认值 | 说明 |\n|------|------|------|--------|------|\n| inputPath | string | 否 | - | 输入图片的绝对路径，与 `inputUrl` 二选一 |\n| inputUrl | string | 否 | - | 输入图片的 `http/https` 地址，与 `inputPath` 二选一 |\n| outputPath | string | 是 | - | 输出图片的绝对路径 |\n| quality | number | 否 | 80 | 输出质量 (1-100) |\n| maxWidth | number | 否 | - | 最大宽度（正整数，保持宽高比） |\n| maxHeight | number | 否 | - | 最大高度（正整数，保持宽高比） |\n| maxSize | number | 否 | - | 最大文件大小（MB，正数），如 0.5 表示 500KB |\n| format | string | 否 | jpeg | 输出格式：jpeg, png, webp |\n| preserveInputFormat | boolean | 否 | false | 是否保留原始图片格式并据此校验输出扩展名 |\n| avoidLargerThanInput | boolean | 否 | true | 是否尽量避免输出文件大于原图 |\n| sizeStrategy | string | 否 | balanced | 体积策略：`strict` 优先体积，`balanced` 优先画质 |\n| allowOverwrite | boolean | 否 | false | 是否允许覆盖已存在输出文件 |\n| allowedDomains | string[] | 否 | - | 远程地址白名单域名，支持主域名及其子域名；传 `[\"*\"]` 表示不限制 |\n| timeoutMs | number | 否 | 10000 | 远程下载超时时间（毫秒） |\n| retryCount | number | 否 | 1 | 远程下载失败后的重试次数 |\n| maxDownloadBytes | number | 否 | 26214400 | 远程下载大小上限（字节，默认 25MB） |\n| allowedRoot | string | 否 | - | 安全根目录，设置后输入/输出必须在该目录内；传 `\"*\"` 表示不限制 |\n\n> 说明：`inputPath` 与 `inputUrl` 必须二选一。\n> 说明：本地输入时 `inputPath` 与 `outputPath` 必须是绝对路径，且不能相同。\n> 说明：`outputPath` 扩展名必须与 `format` 一致（例如 `format=png` 时输出需为 `.png`）。\n> 说明：当 `preserveInputFormat=true` 时，会优先使用原图格式，并按原格式校验 `outputPath` 扩展名。\n> 说明：远程地址仅支持 `http/https`，下载完成后会自动清理临时文件。\n> 说明：远程下载会逐跳校验重定向目标是否仍在 `allowedDomains` 白名单中。\n> 说明：当 `allowedDomains=[\"*\"]` 时，表示关闭域名白名单限制。\n> 说明：远程下载默认限制为 25MB，可通过 `maxDownloadBytes` 调整。\n> 说明：当 `allowedRoot=\"*\"` 时，表示关闭路径根目录限制。\n> PNG 说明：`balanced` 策略默认优先画质；`strict` 策略会启用更激进的 PNG 量化以优先体积。\n\n### `compress-folder`\n\n| 参数 | 类型 | 必填 | 默认值 | 说明 |\n|------|------|------|--------|------|\n| inputDir | string | 是 | - | 输入目录的绝对路径 |\n| outputDir | string | 是 | - | 输出目录的绝对路径 |\n| recursive | boolean | 否 | false | 是否递归处理子目录 |\n| inputFormats | string[] | 否 | 全部支持格式 | 仅处理这些输入格式：`jpeg`、`png`、`webp` |\n| quality | number | 否 | 80 | 输出质量 (1-100) |\n| maxWidth | number | 否 | - | 最大宽度（正整数，保持宽高比） |\n| maxHeight | number | 否 | - | 最大高度（正整数，保持宽高比） |\n| maxSize | number | 否 | - | 最大文件大小（MB，正数），如 0.5 表示 500KB |\n| format | string | 否 | jpeg | 输出格式：jpeg, png, webp |\n| preserveInputFormat | boolean | 否 | false | 是否保留原始图片格式并保留对应输出扩展名 |\n| avoidLargerThanInput | boolean | 否 | true | 是否尽量避免输出文件大于原图 |\n| sizeStrategy | string | 否 | balanced | 体积策略：`strict` 优先体积，`balanced` 优先画质 |\n| allowOverwrite | boolean | 否 | false | 是否允许覆盖已存在输出文件 |\n| skipExisting | boolean | 否 | false | 输出文件已存在时是否跳过 |\n| allowedRoot | string | 否 | - | 安全根目录，设置后输入/输出都必须位于该目录内；传 `\"*\"` 表示不限制 |\n\n> 说明：`inputDir` 与 `outputDir` 必须是绝对路径，且不能相同。\n> 说明：输出会保留输入目录结构，并根据 `format` 自动生成目标扩展名。\n> 说明：当 `preserveInputFormat=true` 时，会按每张原图格式输出，对应扩展名也会随之保留。\n> 说明：当 `allowOverwrite=false` 且 `skipExisting=true` 时，已存在的输出文件会被跳过并记录在批量结果中。\n> 说明：当 `allowedRoot=\"*\"` 时，表示关闭路径根目录限制。\n\n## 测试\n\n```bash\nnpm test\n```\n\n## 返回结果示例\n\n```json\n{\n  \"success\": true,\n  \"message\": \"图片压缩成功\",\n  \"input\": {\n    \"path\": \"/path/to/input.jpg\",\n    \"format\": \"jpeg\",\n    \"size\": 2846064,\n    \"width\": 4214,\n    \"height\": 2846\n  },\n  \"output\": {\n    \"path\": \"/path/to/output.jpg\",\n    \"format\": \"jpeg\",\n    \"size\": 407707,\n    \"width\": 4214,\n    \"height\": 2846,\n    \"quality\": 12\n  },\n  \"compressionRatio\": \"85.67%\"\n}\n```\n\n## 发布到 npm\n\n```bash\n# 交互式发版，可选择是否执行 npm login 和 npm publish --access public\nnpm run release\n\n# 非交互式 patch 发版，并发布到 npm\nnpm run release -- patch --publish\n\n# 非交互式 patch 发版，先登录 npm，再发布到 npm\nnpm run release -- patch --npm-login --publish\n```\n\n说明：\n\n- `npm run release` 会创建 release commit 和 Git tag。\n- 传 `--publish` 时，脚本会先执行 `npm run build`，再执行 `npm publish --access public`。\n- 传 `--npm-login` 时，脚本会在发布流程中执行 `npm login`。\n- 支持的发版类型参数为 `patch`、`minor`、`major`。\n\n## 依赖\n\n- `@modelcontextprotocol/sdk` - MCP 协议 SDK\n- `sharp` - 高性能图片处理库\n- `zod` - TypeScript 模式验证\n","readmeFilename":"README.md"}