{"_id":"@stabgan/openrouter-mcp-multimodal","_rev":"28-73e98b3991e0c6a17eaa5a368ce38e07","name":"@stabgan/openrouter-mcp-multimodal","dist-tags":{"latest":"5.0.1"},"versions":{"1.0.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"1.0.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","modelcontextprotocol"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@1.0.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"a8ae80f5fcca26f81980619a198dcdcca121063c","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-1.0.0.tgz","fileCount":32,"integrity":"sha512-Wt/zhoScsNmF7CcsmKcTg96FbtzjqnWFdrYlCaRhhu3D4kRFC7JtEusyeejtLOWTrwM9IzxvHf7xaBI/qXRsvg==","signatures":[{"sig":"MEQCIB9nStnGVoCed0tPlS9nKT40QeGAyusnema3ts8YeIS/AiAGxS+gy8PJwaj20kZ+yyKmmdGz+dMtZfrqqJvKqIqjnA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88615},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"ae9c438a435b121ba215da293ca3de4bd3320833","scripts":{"build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","watch":"tsc --watch","prepare":"npm run build"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"overrides":{"uri-js":"npm:uri-js-replace","whatwg-url":"^14.1.0"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for OpenRouter providing text chat and image analysis tools","directories":{},"_nodeVersion":"20.19.0","dependencies":{"axios":"^1.7.9","sharp":"^0.33.3","openai":"^4.83.0","node-fetch":"^3.3.2","@modelcontextprotocol/sdk":"^1.4.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","typescript":"^5.7.3","@types/node":"^22.13.1","@types/sharp":"^0.32.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_1.0.0_1743017924965_0.39096776752900264","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"1.1.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","modelcontextprotocol"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@1.1.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"4f8fe8af17520a082b31bb31189804bff148efc5","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-1.1.0.tgz","fileCount":32,"integrity":"sha512-zynNURP0eHr4e5jV0E7fE2SBYvlYGSynif15+E9MUhxhDlokbqK02rS+rwJXdXep9jSrtBkjsCEEpXjGTl5iZg==","signatures":[{"sig":"MEYCIQDCCFzoLav1lIVPS+pnqBn9lmlOfFZgy5U85RAWQjtVxAIhAKN68Cji8LhkVWrZKF1fVPaUD32PAXIvGM4Wbv+arS7E","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93126},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"74d29975471b0c13f4a784798a31dac85b35a69e","scripts":{"build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","watch":"tsc --watch","prepare":"npm run build"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"overrides":{"uri-js":"npm:uri-js-replace","whatwg-url":"^14.1.0"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for OpenRouter providing text chat and image analysis tools","directories":{},"_nodeVersion":"20.19.0","dependencies":{"axios":"^1.7.9","sharp":"^0.33.3","openai":"^4.83.0","node-fetch":"^3.3.2","@modelcontextprotocol/sdk":"^1.4.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","typescript":"^5.7.3","@types/node":"^22.13.1","@types/sharp":"^0.32.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_1.1.0_1743061968519_0.7772861856550801","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"1.2.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","modelcontextprotocol"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@1.2.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"79a9c5295472b8329f9f02a5d7ac0e1242c8e3cf","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-1.2.0.tgz","fileCount":32,"integrity":"sha512-i/L1MSKHAWK+cD00cJ6WO0RggxLimgUWbYlpAC7ECfCo4f/DooTbjaFiaQE0+lXS6o/MneZXlKYA9+8HIZTgcQ==","signatures":[{"sig":"MEQCIFhHjcOYkcIjJbW/d8WgIDhcNn6cFHxOVjTdRF/tLX/mAiBrLUGggtlGi3TvivU2Pu0O85IxJC9uubUsa51tBqrAPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98465},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"3f9840d884799b2feeaecddc0050e1534a8c0870","scripts":{"build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","watch":"tsc --watch","prepare":"npm run build"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"overrides":{"uri-js":"npm:uri-js-replace","whatwg-url":"^14.1.0"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for OpenRouter providing text chat and image analysis tools","directories":{},"_nodeVersion":"20.19.0","dependencies":{"axios":"^1.7.9","sharp":"^0.33.3","openai":"^4.83.0","node-fetch":"^3.3.2","@modelcontextprotocol/sdk":"^1.4.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","typescript":"^5.7.3","@types/node":"^22.13.1","@types/sharp":"^0.32.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_1.2.0_1743063186016_0.27641540981546386","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@stabgan/openrouter-mcp-multimodal","version":"1.2.1","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","modelcontextprotocol"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@1.2.1","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"1a1cd88b6081ad857b36d93cd733941b6fb91be7","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-1.2.1.tgz","fileCount":32,"integrity":"sha512-JpJlMuBNIsuIZHto7qOAdKpsXyopJaCDGNaLvkqNCi5L6ZjEWVxLj1v/cr1QtUblWMgp+cjrBa6p2V63zzs3RA==","signatures":[{"sig":"MEYCIQDaHT5bPilPU9jYwOiGFkSlsHDlf8nst6isK1dIc09BJwIhALsCorE+yDIQW0xMglqYyRg/7UJyK3Aiu/A4dB7HLLT6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118569},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"1fd46839ef1fa30518f0631473bf158a89ef61a6","scripts":{"build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","watch":"tsc --watch","prepare":"npm run build"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"overrides":{"uri-js":"npm:uri-js-replace","whatwg-url":"^14.1.0"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for OpenRouter providing text chat and image analysis tools","directories":{},"_nodeVersion":"20.19.0","dependencies":{"axios":"^1.8.4","sharp":"^0.33.3","dotenv":"^16.4.7","openai":"^4.89.1","node-fetch":"^3.3.2","@modelcontextprotocol/sdk":"^1.4.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","typescript":"^5.7.3","@types/node":"^22.13.1","@types/sharp":"^0.32.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_1.2.1_1743071113130_0.4186324907263199","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"1.3.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","modelcontextprotocol"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@1.3.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"d8484a27acc75fc0be7cff9676cc18fea85bd858","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-1.3.0.tgz","fileCount":32,"integrity":"sha512-kGePssIiAepkXNUfhdpJd8JKDOwlTAIAbvoeTYsopJqURCtupO+WuHSJco5K3NQQ9X/kWgSL0CIZHEN6UIuxrA==","signatures":[{"sig":"MEYCIQC5BeT6ts0bgh14lZZBe1N6S/njcp2NiXt/bupF2ad0AQIhAPFg6cmSYnME5hZjCrBpx8N8pK18AhQWsFe+I/r3R7tf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116489},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"3d9d07b2103653342f7c1a97bd58261b80fe3257","scripts":{"audit":"npm audit fix","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","watch":"tsc --watch","prepare":"npm run build","examples":"node examples/index.js"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"overrides":{"uri-js":"npm:uri-js-replace","whatwg-url":"^14.1.0"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for OpenRouter providing text chat and image analysis tools","directories":{},"_nodeVersion":"20.19.0","dependencies":{"axios":"^1.8.4","sharp":"^0.33.5","dotenv":"^16.4.7","openai":"^4.89.1","node-fetch":"^3.3.2","@modelcontextprotocol/sdk":"^1.8.0"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","typescript":"^5.8.2","@types/node":"^22.13.14","@types/sharp":"^0.32.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_1.3.0_1743073303858_0.9227899088156675","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"1.4.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","modelcontextprotocol"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@1.4.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"0e74466be83c1c223e5c2ffa12d5e71f46dc68a7","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-1.4.0.tgz","fileCount":32,"integrity":"sha512-3KLPgzcgIatCMQyGqseutXMAcHqBwQ34lxveIkKJSdbiCQ54x2dDZ5iT/dNJNSnsxPISpvfl2yI7xczZXVKIrg==","signatures":[{"sig":"MEQCIF44cA4okwFAnu4S1OuFd8+wx9BKKWiFJKMpMhqrBIfdAiBCdqh2iJ8wHirgk9NMG4FpKVtCqpn3XIH8iXx9ospXzw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":122428},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"8512f031f7af064f5856b5654c8cf6e53fa71557","scripts":{"audit":"npm audit fix","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","watch":"tsc --watch","prepare":"npm run build","examples":"node examples/index.js"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"overrides":{"uri-js":"npm:uri-js-replace","whatwg-url":"^14.1.0"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for OpenRouter providing text chat and image analysis tools","directories":{},"_nodeVersion":"20.19.0","dependencies":{"axios":"^1.8.4","sharp":"^0.33.5","dotenv":"^16.4.7","openai":"^4.89.1","node-fetch":"^3.3.2","@modelcontextprotocol/sdk":"^1.8.0"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","typescript":"^5.8.2","@types/node":"^22.13.14","@types/sharp":"^0.32.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_1.4.0_1743145982005_0.2107447916400509","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"1.5.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","modelcontextprotocol"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@1.5.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"0bde44a04adc79a5e8f64e47980c5f59201ca976","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-1.5.0.tgz","fileCount":32,"integrity":"sha512-HXzFXAqT9qMwOt+8RUNMzRkuOSFzhrlQXyCYhOEUQSZltB6Os9qu+rbdQyEx6PiFoXRFyb7UMO/nfb8ocwA88A==","signatures":[{"sig":"MEQCIEe1fY4+EITv/6gr6VGQPKll7lwOefXzoLqhKEFnh47gAiBlRzZcTfbdQiRnW5xR8PCDeIEJ94R6ysZAmUdsy1L/bQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":132463},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"50c2c43fd94f691163d26da11ccc1ad0b4329746","scripts":{"audit":"npm audit fix","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","watch":"tsc --watch","prepare":"npm run build","examples":"node examples/index.js"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"overrides":{"uri-js":"npm:uri-js-replace","whatwg-url":"^14.1.0"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for OpenRouter providing text chat and image analysis tools","directories":{},"_nodeVersion":"20.19.0","dependencies":{"axios":"^1.8.4","sharp":"^0.33.5","dotenv":"^16.4.7","openai":"^4.89.1","node-fetch":"^3.3.2","@modelcontextprotocol/sdk":"^1.8.0"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","typescript":"^5.8.2","@types/node":"^22.13.14","@types/sharp":"^0.32.0"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_1.5.0_1743147053735_0.5984655617008008","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"1.8.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@1.8.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"9503b261546e8374a7734cc63a361882dacf123b","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-1.8.0.tgz","fileCount":31,"integrity":"sha512-WrbPUTatErG2wps5DCTHCf79O31wKWyPNfhluFkIsYL21F3vwG1nHSzqx7VfyfQk3OWWn1Vp3ZOFqeDt3sWMAw==","signatures":[{"sig":"MEUCIBZFSrcRrDTfh9baE3MJRnrMxyOnePqNI5T5F0tUf2dbAiEA0RPs8oQAC+Fr6QFozunDnp6tymHGoDIyqOQfjgYBXU8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@1.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":57369},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"5fc0de25526fefcc47c69ca8f24c4f8e02dc6137","scripts":{"lint":"eslint src","test":"node --experimental-vm-modules node_modules/.bin/vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","prepare":"npm run build","format:check":"prettier --check \"src/**/*.ts\"","test:integration":"node --experimental-vm-modules node_modules/.bin/vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1ab9625-21f4-4242-b644-dd6a9d15d9ed"}},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"11.12.0","description":"MCP server for OpenRouter with text chat, image analysis, and image generation","directories":{},"_nodeVersion":"22.22.1","dependencies":{"sharp":"^0.33.5","openai":"^4.89.1","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","dotenv":"^16.4.7","eslint":"^9.39.2","vitest":"^3.1.1","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.8.2","@types/node":"^22.13.14","typescript-eslint":"^8.53.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_1.8.0_1773989184338_0.9595557571960838","host":"s3://npm-registry-packages-npm-production"}},"1.8.1":{"name":"@stabgan/openrouter-mcp-multimodal","version":"1.8.1","keywords":["mcp","openrouter","ai","llm","vision","image-analysis"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@1.8.1","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"32ff04ada6e9c5c8a6845cd108c3f1b1a58d0a3d","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-1.8.1.tgz","fileCount":31,"integrity":"sha512-UdBcDpKCkdU44bwuG9bbAw33AHqamXielSZOsba/WE/p4xhYVIRdwvUWDTPAji8DMM1uiunzt5SR9stAmVVFUQ==","signatures":[{"sig":"MEQCIFKVDzoXPFSbJCotM8JERuTFlCfiybPXWnV0adTUTALiAiBOPuir6YYN9f4BhxQvTvjLSTywDmuk3/mokL2QqxsNtw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@1.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":57407},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"7323e6feed4a68a96c842217c72b820005d820b6","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"lint":"eslint src","test":"node --experimental-vm-modules node_modules/.bin/vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","prepare":"npm run build","format:check":"prettier --check \"src/**/*.ts\"","test:integration":"node --experimental-vm-modules node_modules/.bin/vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1ab9625-21f4-4242-b644-dd6a9d15d9ed"}},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"11.12.1","description":"MCP server for OpenRouter with text chat, image analysis, and image generation","directories":{},"_nodeVersion":"22.22.1","dependencies":{"sharp":"^0.33.5","openai":"^4.89.1","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","dotenv":"^16.4.7","eslint":"^9.39.2","vitest":"^3.1.1","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.8.2","@types/node":"^22.13.14","typescript-eslint":"^8.53.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_1.8.1_1774707039210_0.8798929043258625","host":"s3://npm-registry-packages-npm-production"}},"1.8.2":{"name":"@stabgan/openrouter-mcp-multimodal","version":"1.8.2","keywords":["mcp","openrouter","ai","llm","vision","image-analysis"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@1.8.2","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"4d19651957b08a5e57af642c8d614c0206989706","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-1.8.2.tgz","fileCount":31,"integrity":"sha512-eL3uLMuP8x994rHh8KCfTZ/Lstr7eZCS/O4/IvhJ1KXPPaLaZufPXJzxZGdPMGcGcbEyyEqdpsVq6niNFl+Lig==","signatures":[{"sig":"MEQCICy/PqkEtDejCIMOWLJjGKVGcK6aJewISl6D7uvBm2nQAiBcam4qz81HTr11EiWDx/T5P2R8LDoi5VLnIPe/RGdVLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@1.8.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":57407},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"09bf6953f480e6667cfe1d5024195e8700cd8271","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"lint":"eslint src","test":"node --experimental-vm-modules node_modules/.bin/vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","prepare":"npm run build","format:check":"prettier --check \"src/**/*.ts\"","test:integration":"node --experimental-vm-modules node_modules/.bin/vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1ab9625-21f4-4242-b644-dd6a9d15d9ed"}},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"11.12.1","description":"MCP server for OpenRouter with text chat, image analysis, and image generation","directories":{},"_nodeVersion":"22.22.1","dependencies":{"sharp":"^0.33.5","openai":"^4.89.1","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","dotenv":"^16.4.7","eslint":"^9.39.2","vitest":"^3.1.1","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.8.2","@types/node":"^22.13.14","typescript-eslint":"^8.53.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_1.8.2_1774708006180_0.22087051469503982","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"1.9.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@1.9.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"e305839596f36b166e48205a38438739461783bb","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-1.9.0.tgz","fileCount":45,"integrity":"sha512-LXZqfXY8AoJMu77DSPEu5FylGF6frHoMcIwqy5UH50skw73ZuFZpysqpgb9nmxg13Y2jsaS1uTDtHQOkV0F/Gw==","signatures":[{"sig":"MEUCIQD6BMqL3Ys4/uFvp9jv1PYBbZIoIlECAgFokAYd6JFnxwIgOozP7Bw2TSlUCp4DLIJAlMHoWExdti5aWqyhKgJ1E0s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94643},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"a62f4c43b8914c3ee32e6eae049fdf1877ca587b","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"lint":"eslint src","test":"node --experimental-vm-modules node_modules/.bin/vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","prepare":"npm run build","format:check":"prettier --check \"src/**/*.ts\"","test:integration":"node --experimental-vm-modules node_modules/.bin/vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"11.6.2","description":"MCP server for OpenRouter with text chat, image analysis, image generation, audio analysis, and audio generation","directories":{},"_nodeVersion":"24.12.0","dependencies":{"sharp":"^0.33.5","dotenv":"^16.4.7","openai":"^4.89.1","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","eslint":"^9.39.2","vitest":"^3.1.1","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.8.2","@types/node":"^22.13.14","typescript-eslint":"^8.53.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_1.9.0_1775594409915_0.5351343722854025","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"2.0.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@2.0.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"a1c7ab7fdbb23bffd842d48ccb2ff36dfafdbbff","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-2.0.0.tgz","fileCount":45,"integrity":"sha512-Y/0pQ7pmQVJVl4ZvzEch6SlCM2nBaN/NnMn76fVe0fOBi1D7ZZgDmSs6Tb1zPwTSiU9yfyPOCUbOS++Z4CDy7g==","signatures":[{"sig":"MEUCIQCcbRbnqx8bC2C0dH/XAwYZWtei++oLE6atj23/wSCgvgIgOLOkU0lRf3sAfabbWFo6+8qLwTPVegVlR0OoaHRXHC4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98112},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"301f2fa1327a75dc3e09d2c25e1deec2a7c66f68","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"lint":"eslint src","test":"node --experimental-vm-modules node_modules/.bin/vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","prepare":"npm run build","format:check":"prettier --check \"src/**/*.ts\"","test:integration":"node --experimental-vm-modules node_modules/.bin/vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"11.6.2","description":"MCP server for OpenRouter with text chat, image analysis, image generation, audio analysis, and audio generation","directories":{},"_nodeVersion":"24.12.0","dependencies":{"sharp":"^0.33.5","dotenv":"^16.4.7","openai":"^4.89.1","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","eslint":"^9.39.2","vitest":"^3.1.1","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.8.2","@types/node":"^22.13.14","typescript-eslint":"^8.53.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_2.0.0_1775595241385_0.17679016858183672","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"3.0.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@3.0.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"642ac009d0b580b717c7cf7028a4d7da4e9915f5","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-3.0.0.tgz","fileCount":49,"integrity":"sha512-F8xTAmtefiSM3p3OZWwm9JB4KugQYYvGn5d9tNU6miAUmSvFdnt/CCPZNA3Yc603Htc3v3e8o2fnnfQRCa/+4Q==","signatures":[{"sig":"MEQCIHW+yN7p+TGlJ1XLXnFZKGxrnICP/hUZ3Md/9kl3wLkLAiBW1IUSWV+jhgvIH9GD6e4qHPdm9DKrlW0ClGaj/IV9jQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":160558},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"c7ef201347d8c40e892749edac43144249de8caa","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"lint":"eslint src","test":"node --experimental-vm-modules node_modules/.bin/vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run build","test:integration":"node --experimental-vm-modules node_modules/.bin/vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"11.6.2","description":"MCP server for OpenRouter with text chat, image analysis + generation, audio analysis + generation, video analysis, and video generation (Veo 3.1 / Sora 2 Pro / Seedance / Wan)","directories":{},"_nodeVersion":"24.12.0","dependencies":{"sharp":"^0.33.5","dotenv":"^16.4.7","openai":"^4.89.1","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","eslint":"^9.39.2","vitest":"^3.1.1","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.8.2","@types/node":"^22.13.14","typescript-eslint":"^8.53.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_3.0.0_1776679985504_0.8866242429244922","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"3.1.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@3.1.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"bfb336b1c4a28665b9958722f127484c79940cf8","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-3.1.0.tgz","fileCount":49,"integrity":"sha512-yoDZZ+igsugBuv8w6ipJGM3Gbt4c5q9KU62UBjpbdj+APYo8jxGfIOx3EfDgdr9pT2BngDHrkS9L/kgsiQUFuQ==","signatures":[{"sig":"MEUCIGOrmtkc81HuFrHi9g2im/0NIh3AYf9cav38u9I4SLH0AiEAvECoGBhjGGOrsJKB38ajyPWfjvOKLWQQHArCiIQWrGo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@3.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":163417},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"d11f84f65784302322c14f3ffafd1386d97e825f","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"lint":"eslint src","test":"node --experimental-vm-modules node_modules/.bin/vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run build","test:integration":"node --experimental-vm-modules node_modules/.bin/vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.7","description":"MCP server for OpenRouter with text chat, image analysis + generation, audio analysis + generation, video analysis, and video generation (Veo 3.1 / Sora 2 Pro / Seedance / Wan)","directories":{},"_nodeVersion":"22.22.2","dependencies":{"sharp":"^0.33.5","dotenv":"^16.4.7","openai":"^4.89.1","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","eslint":"^9.39.2","vitest":"^3.1.1","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.8.2","@types/node":"^22.13.14","typescript-eslint":"^8.53.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_3.1.0_1777830640037_0.7577858398955484","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"@stabgan/openrouter-mcp-multimodal","version":"3.1.1","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@3.1.1","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"675bf6be6653d9c619dca50e678da3bc96ebda24","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-3.1.1.tgz","fileCount":49,"integrity":"sha512-oX/tfjvapdoU5Yx/BlVgSKrZYuXpu95EcoUr7hfO8svcKAN2F7peMl+QlCEWPcuUTWwVuaKhPiRXIPpndgHlxQ==","signatures":[{"sig":"MEYCIQDJ6tMOkKc1n1cPrIJcVuoGd9rbyjgnDYZeAm8561MAgAIhAMXu/ejHm1u4JLcSY6owLI4Yo3jbnsYurjawKMPU+p4z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@3.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":163757},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"bffb7cd026c2740d2b45c31652b485b8c3af3f81","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"lint":"eslint src","test":"node --experimental-vm-modules node_modules/.bin/vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run build","test:integration":"node --experimental-vm-modules node_modules/.bin/vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.7","description":"MCP server for OpenRouter with text chat, image analysis + generation, audio analysis + generation, video analysis, and video generation (Veo 3.1 / Sora 2 Pro / Seedance / Wan)","directories":{},"_nodeVersion":"22.22.2","dependencies":{"sharp":"^0.33.5","dotenv":"^16.4.7","openai":"^4.89.1","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","eslint":"^9.39.2","vitest":"^3.1.1","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.8.2","@types/node":"^22.13.14","typescript-eslint":"^8.53.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_3.1.1_1777848257166_0.360441587813944","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"3.2.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"MIT","_id":"@stabgan/openrouter-mcp-multimodal@3.2.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"3a1b3ae4f5c3eec6cf3a9fdb77a3325342cd89a2","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-3.2.0.tgz","fileCount":49,"integrity":"sha512-MzOTehXMUS7fXImavIRuYWPjnRyXtTa1YLAXgCk/0Fk9Z1HStsdZoJfrnQiPitCyRxaFv+CZHIZrG/FQ/3XP4A==","signatures":[{"sig":"MEYCIQCudFFPZ3VMSvoDbnRRWGuWBCJgHoZHePAtk+ps7gJaTgIhANOF+Nfk4oKqKTbI9RcRoqqEMii4SCJgOEDd67REYREI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@3.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":170804},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"a72566b20ae17dd43547a27672307b042a4052c1","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"lint":"eslint src","test":"node --experimental-vm-modules node_modules/.bin/vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run build","test:integration":"node --experimental-vm-modules node_modules/.bin/vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.7","description":"MCP server for OpenRouter with text chat, image analysis + generation, audio analysis + generation, video analysis, and video generation (Veo 3.1 / Sora 2 Pro / Seedance / Wan)","directories":{},"_nodeVersion":"22.22.2","dependencies":{"sharp":"^0.33.5","dotenv":"^16.4.7","openai":"^4.89.1","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","eslint":"^9.39.2","vitest":"^3.1.1","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.8.2","@types/node":"^22.13.14","typescript-eslint":"^8.53.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_3.2.0_1777849999654_0.012103300646344017","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"4.0.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"Apache-2.0","_id":"@stabgan/openrouter-mcp-multimodal@4.0.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"fb274ce9d15c29ba03de36ea9c543b25e5106b0b","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-4.0.0.tgz","fileCount":51,"integrity":"sha512-A6oBpTP+NumsrOeEw45ym/kPI7ZeOl1Ks59gfdFrZ5Mdgu9oD+sSGchBIanZ0Bbq2PVhIr1Yk8kevO/AHj/IWg==","signatures":[{"sig":"MEUCICwqVFRhoV9Jpsi2e1ssc++vqVitdp02toeRe73pcG2sAiEAjw+V05CF43o8bqwFQqcedQiDqbSS5Q49XgzK8hQEg/A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":194845},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"bfc186091f8c2dd146639b913dc766f1cff9c604","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"lint":"eslint src","test":"node --experimental-vm-modules node_modules/.bin/vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run build","test:integration":"node --experimental-vm-modules node_modules/.bin/vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.7","description":"MCP server for OpenRouter with text chat, image analysis + generation, audio analysis + generation, video analysis, and video generation (Veo 3.1 / Sora 2 Pro / Seedance / Wan)","directories":{},"_nodeVersion":"22.22.2","dependencies":{"sharp":"^0.33.5","dotenv":"^16.4.7","openai":"^4.89.1","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","eslint":"^9.39.2","vitest":"^3.1.1","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.8.2","@types/node":"^22.13.14","typescript-eslint":"^8.53.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_4.0.0_1777888388306_0.07082983384673391","host":"s3://npm-registry-packages-npm-production"}},"4.0.1":{"name":"@stabgan/openrouter-mcp-multimodal","version":"4.0.1","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"Apache-2.0","_id":"@stabgan/openrouter-mcp-multimodal@4.0.1","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"1600bc603dde156c8195b99e6b4f80587b12924a","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-4.0.1.tgz","fileCount":51,"integrity":"sha512-U3t/1IlskVKA5XJemFRlBBcYmwkFrHgKua2BMQpPEqQAMWSKVa7IU6vNA/A21BmT0sqz0pVzPy1e50rtPd7gyw==","signatures":[{"sig":"MEQCIFhLEIXcxZPJhcFLAooc5BZPSyPhw1gI8+ENp8zDjIapAiAoAB/laLgNmycgTyh3LWl1TZQJrIU9KCN+TMr/dBOfHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@4.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":197290},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"06b193ca2aee58c32c9773c3b172e974231407fa","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"lint":"eslint src","test":"node --experimental-vm-modules node_modules/.bin/vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run build","test:integration":"node --experimental-vm-modules node_modules/.bin/vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.7","description":"MCP server for OpenRouter with text chat, image analysis + generation, audio analysis + generation, video analysis, and video generation (Veo 3.1 / Sora 2 Pro / Seedance / Wan)","directories":{},"_nodeVersion":"22.22.2","dependencies":{"sharp":"^0.33.5","dotenv":"^16.4.7","openai":"^4.89.1","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","eslint":"^9.39.2","vitest":"^3.1.1","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.8.2","@types/node":"^22.13.14","typescript-eslint":"^8.53.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_4.0.1_1777891468546_0.47077619044408503","host":"s3://npm-registry-packages-npm-production"}},"4.5.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"4.5.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"Apache-2.0","_id":"@stabgan/openrouter-mcp-multimodal@4.5.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"78a2ea0f6b4c637b5b652c29955c59d491f7f4e8","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-4.5.0.tgz","fileCount":63,"integrity":"sha512-JwJz3q2Xtzhny2PfP4xZwjC7RHggsJv7S6CAt6t9imWVJ4SfirIr+mdbcS840ow8xhNdk3BF3aR6uehwQGD53Q==","signatures":[{"sig":"MEUCIF34nP3gm0kwIislmShLh+2NQg8Zfm1EUQzIr77BCKc7AiEA9+LRgV0NYEwP5E3F7uQOjsrrniuhAWkCboK811fhbHs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@4.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":243859},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"7b5254dba670ef0badf0c6ad7289559ae27efb20","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"lint":"eslint src","test":"node --experimental-vm-modules node_modules/.bin/vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run build","test:integration":"node --experimental-vm-modules node_modules/.bin/vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.7","description":"MCP server for OpenRouter with text chat, image analysis + generation, audio analysis + generation, video analysis, and video generation (Veo 3.1 / Sora 2 Pro / Seedance / Wan)","directories":{},"_nodeVersion":"22.22.2","dependencies":{"sharp":"^0.33.5","dotenv":"^16.4.7","openai":"^4.89.1","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","eslint":"^9.39.2","vitest":"^3.1.1","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.8.2","@types/node":"^22.13.14","typescript-eslint":"^8.53.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_4.5.0_1777926329264_0.15455451671832177","host":"s3://npm-registry-packages-npm-production"}},"4.5.1":{"name":"@stabgan/openrouter-mcp-multimodal","version":"4.5.1","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"Apache-2.0","_id":"@stabgan/openrouter-mcp-multimodal@4.5.1","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"2343d7654d1c5879348e464385ea7b690f5e267c","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-4.5.1.tgz","fileCount":63,"integrity":"sha512-+/oOAWGyhqo5W5KRd7WwFjVMHaIRcdzuKuO/QVrOgBj95JFqi/4kWzx6hNmoy0fsdwAsNVGR4OqagJAVqDcC6Q==","signatures":[{"sig":"MEUCIQDu/xZqfGu4NAwAR9qX1wvbag356+uFwZhJJPX4spyYUAIgc3d/6clJwqMi1V/YeoGG3j1gbQG4DYXSkEu27mAN5Pc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@4.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":256972},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"bc5542eff9c317ba6d654806b574d6d9e55519d0","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"lint":"eslint src","test":"node --experimental-vm-modules node_modules/.bin/vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run build","test:integration":"node --experimental-vm-modules node_modules/.bin/vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.7","description":"MCP server for OpenRouter with text chat, image analysis + generation, audio analysis + generation, video analysis, and video generation (Veo 3.1 / Sora 2 Pro / Seedance / Wan)","directories":{},"_nodeVersion":"22.22.2","dependencies":{"sharp":"^0.33.5","dotenv":"^16.4.7","openai":"^4.89.1","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.3.4","eslint":"^9.39.2","vitest":"^3.1.1","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.8.2","@types/node":"^22.13.14","typescript-eslint":"^8.53.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_4.5.1_1777928700280_0.7106092448798311","host":"s3://npm-registry-packages-npm-production"}},"4.5.3":{"name":"@stabgan/openrouter-mcp-multimodal","version":"4.5.3","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"Apache-2.0","_id":"@stabgan/openrouter-mcp-multimodal@4.5.3","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"676fe94b84e15b4cdc560acac4effc4b739de25e","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-4.5.3.tgz","fileCount":67,"integrity":"sha512-nuDv3P41MToS4vANFgh9y2h+vXSAzRsWRPi8RjYc93TUDqzQRokNSeVZD6Obrd0MtoOJPyHE1FKc+da7HJaDvw==","signatures":[{"sig":"MEYCIQCKvHzK0YIclBYpjZNE4z6wz/u4AraVjo8rnTD50OWNRQIhAO/0plBPMoyH3L4vgE0fmuKm+prmPVZ6jfZG3xYwE6BR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@4.5.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":265027},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"78cb33caa5bfbdfb8c3e6da1de96db6f7bd22854","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"ci":"npm run lint && npm run format:check && npm run build && npm run test:all","lint":"eslint src","test":"vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","test:all":"npm test && npm run test:regression && npm run test:integration","test:e2e":"npm run build && node scripts/live-e2e.mjs","test:smoke":"npm run test:smoke:npm && npm run test:smoke:docker && npm run test:smoke:uvx:local","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run build","test:smoke:npm":"npm run build && npm pack --quiet && node scripts/smoke-npm-mcp.mjs","test:smoke:uvx":"node scripts/smoke-uvx-mcp.mjs","test:regression":"vitest run --config vitest.regression.config.ts","test:integration":"vitest run --config vitest.integration.config.ts","test:smoke:docker":"node scripts/smoke-docker-mcp.mjs","test:smoke:uvx:git":"MCP_UVX_FROM_GIT=1 node scripts/smoke-uvx-mcp.mjs","test:smoke:uvx:local":"npm run build && npm pack --quiet && MCP_UVX_LOCAL=1 node scripts/smoke-uvx-mcp.mjs"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for OpenRouter with text chat, image analysis + generation, audio analysis + generation, video analysis, and video generation (Veo 3.1 / Sora 2 Pro / Seedance / Wan)","directories":{},"_nodeVersion":"22.23.1","dependencies":{"sharp":"^0.35.3","dotenv":"^17.4.2","openai":"^4.104.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.4.0","eslint":"^9.39.2","vitest":"^4.1.9","js-yaml":"^4.3.0","prettier":"^3.9.4","form-data":"^4.0.6","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/node":"^22.20.0","typescript-eslint":"^8.62.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_4.5.3_1782940397249_0.9679577236140104","host":"s3://npm-registry-packages-npm-production"}},"4.6.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"4.6.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"Apache-2.0","_id":"@stabgan/openrouter-mcp-multimodal@4.6.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"91292a2eb94589b1e450e5490fc3465e8c75dfb0","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-4.6.0.tgz","fileCount":75,"integrity":"sha512-U2ONbzKn279SYNuJE+VpsQ0rQpDKd9UU7vsc1KmQr4AwdSdfrV/GFB4geLP9ohAngE5xVaxePVcX/iz4GVqaAA==","signatures":[{"sig":"MEQCIBiD6ALJCzrTbqOLBQNooJBTkx+anpGgCE72uKamian6AiAWhwXRszMGsBoUld1GTDAcTpL18o2B79nL/ZOe8lI3NA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@4.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":320589},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"4ce18ec79d9e5df6f7432c8cb46a96bec0f2a96f","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"ci":"npm run lint && npm run format:check && npm run build && npm run test:all","lint":"eslint src","test":"vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","test:all":"npm test && npm run test:regression && npm run test:integration","test:e2e":"npm run build && node scripts/live-e2e.mjs","test:smoke":"npm run test:smoke:npm && npm run test:smoke:docker && npm run test:smoke:uvx:local","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run build","test:smoke:npm":"npm run build && npm pack --quiet && node scripts/smoke-npm-mcp.mjs","test:smoke:uvx":"node scripts/smoke-uvx-mcp.mjs","test:regression":"vitest run --config vitest.regression.config.ts","test:integration":"vitest run --config vitest.integration.config.ts","test:smoke:docker":"node scripts/smoke-docker-mcp.mjs","test:smoke:uvx:git":"MCP_UVX_FROM_GIT=1 node scripts/smoke-uvx-mcp.mjs","test:smoke:uvx:local":"npm run build && npm pack --quiet && MCP_UVX_LOCAL=1 node scripts/smoke-uvx-mcp.mjs"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for OpenRouter — chat with 300+ LLMs, analyze images/audio/video, generate images (dedicated API), TTS/STT, video generation (Veo 3.1 / Seedance / Wan), async completions, response caching","directories":{},"_nodeVersion":"22.23.2","dependencies":{"sharp":"^0.35.3","dotenv":"^17.4.2","openai":"^4.104.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.4.0","eslint":"^9.39.2","vitest":"^4.1.9","js-yaml":"^4.3.0","prettier":"^3.9.4","form-data":"^4.0.6","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/node":"^22.20.0","typescript-eslint":"^8.62.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_4.6.0_1787402585452_0.5570161085647383","host":"s3://npm-registry-packages-npm-production"}},"4.6.1":{"name":"@stabgan/openrouter-mcp-multimodal","version":"4.6.1","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"Apache-2.0","_id":"@stabgan/openrouter-mcp-multimodal@4.6.1","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"3020efb9b65c330a3975f05aa0fd232eca8ff048","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-4.6.1.tgz","fileCount":77,"integrity":"sha512-PtO2p4CZ+U8aGeUApubiVjMX/rvL126o5LkV8u7vzCmw2JoJv1F5cKL6P5pmgTjc8bUEWDYEOxNsRhNCa3ICCg==","signatures":[{"sig":"MEUCIC8pyus8ecUksi5SzMbBeHC8v8h/j9fOnEOZDMHqu768AiEA5ALwjkFyNkO1ZM9rD89eVIASSga1EnibTsvwmZXDG98=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@4.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":328030},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"280e8b4a2f23be6cebeba667d3b31ec45cc51c54","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"ci":"npm run lint && npm run format:check && npm run build && npm run test:all","lint":"eslint src","test":"vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","test:all":"npm test && npm run test:regression && npm run test:integration","test:e2e":"npm run build && node scripts/live-e2e.mjs","test:smoke":"npm run test:smoke:npm && npm run test:smoke:docker && npm run test:smoke:uvx:local","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run build","test:smoke:npm":"npm run build && npm pack --quiet && node scripts/smoke-npm-mcp.mjs","test:smoke:uvx":"node scripts/smoke-uvx-mcp.mjs","test:regression":"vitest run --config vitest.regression.config.ts","test:integration":"vitest run --config vitest.integration.config.ts","test:smoke:docker":"node scripts/smoke-docker-mcp.mjs","test:smoke:uvx:git":"MCP_UVX_FROM_GIT=1 node scripts/smoke-uvx-mcp.mjs","test:smoke:uvx:local":"npm run build && npm pack --quiet && MCP_UVX_LOCAL=1 node scripts/smoke-uvx-mcp.mjs"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for OpenRouter — chat with 300+ LLMs, analyze images/audio/video, generate images (dedicated API), TTS/STT, video generation (Veo 3.1 / Seedance / Wan), async completions, response caching","directories":{},"_nodeVersion":"22.23.2","dependencies":{"sharp":"^0.35.3","dotenv":"^17.4.2","openai":"^4.104.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.4.0","eslint":"^9.39.2","vitest":"^4.1.9","js-yaml":"^4.3.0","prettier":"^3.9.4","form-data":"^4.0.6","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/node":"^22.20.0","typescript-eslint":"^8.62.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_4.6.1_1787405826266_0.23639316353486461","host":"s3://npm-registry-packages-npm-production"}},"4.6.2":{"name":"@stabgan/openrouter-mcp-multimodal","version":"4.6.2","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"Apache-2.0","_id":"@stabgan/openrouter-mcp-multimodal@4.6.2","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"d1343ce25a19a4e4594094ffcc278f58ae9952bd","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-4.6.2.tgz","fileCount":83,"integrity":"sha512-ytMZ5Xr0qP+XPstoYSpOvJX2oXoM4i+OIuNcFbZgLub0Z+CF8fykpyaUbHMucWTUIP6wlHBTprFmHFPoW8RT5A==","signatures":[{"sig":"MEUCIBT60QxAIX8TKf6Yf1uvMYeBNJ2AGIIfkWsz3tKBRcK2AiEA2gP0rVIt5KMF3JmeKIGDd1Tl+nDP/WQfWiiBM/pK3SQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@4.6.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":292936},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"d50cbe0fae96a934e22f4326f75a3fbed583eeb7","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"ci":"npm run lint && npm run format:check && npm run version:check && npm run build && npm run test:all","lint":"eslint src","test":"vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","test:all":"npm test && npm run test:regression && npm run test:integration","test:e2e":"npm run build && node scripts/live-e2e.mjs","test:smoke":"npm run test:smoke:npm && npm run test:smoke:docker && npm run test:smoke:uvx:local","format:check":"prettier --check \"src/**/*.ts\"","version:check":"node scripts/check-version-sync.mjs","prepublishOnly":"npm run build","test:smoke:npm":"npm run build && npm pack --quiet && node scripts/smoke-npm-mcp.mjs","test:smoke:uvx":"node scripts/smoke-uvx-mcp.mjs","test:regression":"vitest run --config vitest.regression.config.ts","test:integration":"vitest run --config vitest.integration.config.ts","test:smoke:docker":"node scripts/smoke-docker-mcp.mjs","test:smoke:uvx:git":"MCP_UVX_FROM_GIT=1 node scripts/smoke-uvx-mcp.mjs","test:smoke:uvx:local":"npm run build && npm pack --quiet && MCP_UVX_LOCAL=1 node scripts/smoke-uvx-mcp.mjs"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for OpenRouter — chat with 300+ LLMs, analyze images/audio/video, generate images (dedicated API), TTS/STT, video generation (Veo 3.1 / Seedance / Wan), async completions, response caching","directories":{},"_nodeVersion":"22.23.2","dependencies":{"sharp":"^0.35.3","dotenv":"^17.4.2","openai":"^4.104.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.4.0","eslint":"^9.39.2","vitest":"^4.1.9","js-yaml":"^4.3.0","prettier":"^3.9.4","form-data":"^4.0.6","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/node":"^22.20.0","typescript-eslint":"^8.62.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_4.6.2_1787427172080_0.8331857376739435","host":"s3://npm-registry-packages-npm-production"}},"4.7.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"4.7.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"Apache-2.0","_id":"@stabgan/openrouter-mcp-multimodal@4.7.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"fb9aad4eb3ae5ed1875d969f6086bd684ded187c","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-4.7.0.tgz","fileCount":89,"integrity":"sha512-N5yQBXHWgDw+IPMRNV8qPxV4xP+jMhD4QvSWlO77n8a7u1uA7yae8y4+7JTvIHRY7V8znQsYMfto0lEdPTqUvw==","signatures":[{"sig":"MEYCIQCMOInogHB+RDHrfeaKXAUtW6TXMNuzJbXOHYcaxTd23gIhAJnXnf7252NFr/5BH+0A24j8+QhU/EMAQptarrvM2Cu2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@4.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":301081},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"25bc74c3cef998fe830e4d3f11bcab93bb076661","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"ci":"npm run lint && npm run format:check && npm run version:check && npm run build && npm run test:all","lint":"eslint src","test":"vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","test:all":"npm test && npm run test:regression && npm run test:integration","test:e2e":"npm run build && node scripts/live-e2e.mjs","test:smoke":"npm run test:smoke:npm && npm run test:smoke:docker && npm run test:smoke:uvx:local","format:check":"prettier --check \"src/**/*.ts\"","version:check":"node scripts/check-version-sync.mjs","prepublishOnly":"npm run build","test:smoke:npm":"npm run build && npm pack --quiet && node scripts/smoke-npm-mcp.mjs","test:smoke:uvx":"node scripts/smoke-uvx-mcp.mjs","test:regression":"vitest run --config vitest.regression.config.ts","test:integration":"vitest run --config vitest.integration.config.ts","test:smoke:docker":"node scripts/smoke-docker-mcp.mjs","test:smoke:uvx:git":"MCP_UVX_FROM_GIT=1 node scripts/smoke-uvx-mcp.mjs","test:smoke:uvx:local":"npm run build && npm pack --quiet && MCP_UVX_LOCAL=1 node scripts/smoke-uvx-mcp.mjs"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for OpenRouter — chat with 300+ LLMs, analyze images/audio/video, generate images (dedicated API), TTS/STT, video generation (Veo 3.1 / Seedance / Wan), async completions, response caching","directories":{},"_nodeVersion":"22.23.2","dependencies":{"sharp":"^0.35.3","dotenv":"^17.4.2","openai":"^4.104.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.4.0","eslint":"^9.39.2","vitest":"^4.1.9","js-yaml":"^4.3.0","prettier":"^3.9.4","form-data":"^4.0.6","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/node":"^22.20.0","typescript-eslint":"^8.62.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_4.7.0_1788336955935_0.186745912625768","host":"s3://npm-registry-packages-npm-production"}},"4.8.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"4.8.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"Apache-2.0","_id":"@stabgan/openrouter-mcp-multimodal@4.8.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"9b30670f55b1cf22a1755ac2e5f61d2c339c9cbe","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-4.8.0.tgz","fileCount":89,"integrity":"sha512-YIDsOE/eWOXUnTaz8/sUDvsjNrwInKwTblbET58osWY22zA5ruUMSIGCNmVMRe30FygzS5rDlWepYGWA+4S4Eg==","signatures":[{"sig":"MEQCIFnDqv+xfpA/No0wGatYwN6L974KWmTtHLpCr7wNY6dnAiATLoDiAq8EoaqWrVTFzGnqHyxqKomm3uaAgKKxZJxN4g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@4.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":353303},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"28bf3a1aecf4ddff04a2ebcde9f18d94aa2b89c1","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"ci":"npm run lint && npm run format:check && npm run version:check && npm run build && npm run test:all","lint":"eslint src","test":"vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","test:all":"npm test && npm run test:regression && npm run test:integration","test:e2e":"npm run build && node scripts/live-e2e.mjs","test:smoke":"npm run test:smoke:npm && npm run test:smoke:docker && npm run test:smoke:uvx:local","format:check":"prettier --check \"src/**/*.ts\"","version:check":"node scripts/check-version-sync.mjs","prepublishOnly":"npm run build","test:smoke:npm":"npm run build && npm pack --quiet && node scripts/smoke-npm-mcp.mjs","test:smoke:uvx":"node scripts/smoke-uvx-mcp.mjs","test:regression":"vitest run --config vitest.regression.config.ts","test:integration":"vitest run --config vitest.integration.config.ts","test:smoke:docker":"node scripts/smoke-docker-mcp.mjs","test:smoke:uvx:git":"MCP_UVX_FROM_GIT=1 node scripts/smoke-uvx-mcp.mjs","test:smoke:uvx:local":"npm run build && npm pack --quiet && MCP_UVX_LOCAL=1 node scripts/smoke-uvx-mcp.mjs"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for OpenRouter — chat with 300+ LLMs, analyze images/audio/video, generate images (dedicated API), TTS/STT, video generation (Veo 3.1 / Seedance / Wan), async completions, response caching","directories":{},"_nodeVersion":"22.23.2","dependencies":{"sharp":"^0.35.3","dotenv":"^17.4.2","openai":"^4.104.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.4.0","eslint":"^9.39.2","vitest":"^4.1.9","prettier":"^3.9.4","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/node":"^22.20.0","typescript-eslint":"^8.62.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_4.8.0_1788347458832_0.21144510975793085","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"@stabgan/openrouter-mcp-multimodal","version":"5.0.0","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"license":"Apache-2.0","_id":"@stabgan/openrouter-mcp-multimodal@5.0.0","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"bin":{"openrouter-multimodal":"dist/index.js"},"dist":{"shasum":"cab8000093f76ff7f9c6c4ba168d2c69896ed288","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-5.0.0.tgz","fileCount":91,"integrity":"sha512-buq/ALkT58S+V8pJ1cHMbvKGdu1xNq8XPQFghC/dEsJCV3BSZ2mnocSoyH41vGflR6nPdAEYhQGvZpRpTZi60Q==","signatures":[{"sig":"MEYCIQDXijeF+Le4ekmeqQF2h+VpgjhpMcKnEL5cAe4tmi45+QIhAOoYk3e6h/Br15bwkXqZy2rNKbfj9/auM09bm+hwcuj3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@5.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":354145},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.0.0"},"gitHead":"94641fb010d7708617d9c78b215611d2bcf4598b","mcpName":"io.github.stabgan/openrouter-multimodal","scripts":{"ci":"npm run lint && npm run format:check && npm run version:check && npm run build && npm run test:all","lint":"eslint src","test":"vitest run","build":"tsc && shx chmod +x dist/*.js","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","test:all":"npm test && npm run test:regression && npm run test:integration","test:e2e":"npm run build && node scripts/live-e2e.mjs","test:smoke":"npm run test:smoke:npm && npm run test:smoke:docker && npm run test:smoke:uvx:local","format:check":"prettier --check \"src/**/*.ts\"","version:check":"node scripts/check-version-sync.mjs","prepublishOnly":"npm run build","test:smoke:npm":"npm run build && npm pack --quiet && node scripts/smoke-npm-mcp.mjs","test:smoke:uvx":"node scripts/smoke-uvx-mcp.mjs","test:regression":"vitest run --config vitest.regression.config.ts","test:integration":"vitest run --config vitest.integration.config.ts","test:smoke:docker":"node scripts/smoke-docker-mcp.mjs","test:smoke:uvx:git":"MCP_UVX_FROM_GIT=1 node scripts/smoke-uvx-mcp.mjs","test:smoke:uvx:local":"npm run build && npm pack --quiet && MCP_UVX_LOCAL=1 node scripts/smoke-uvx-mcp.mjs"},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"repository":{"url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for OpenRouter — chat with 300+ LLMs, analyze images/audio/video, generate images (dedicated API), TTS/STT, video generation (Veo 3.1 / Seedance / Wan), async completions, response caching","directories":{},"_nodeVersion":"22.23.2","dependencies":{"sharp":"^0.35.4","dotenv":"^17.4.2","openai":"^7.9.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"shx":"^0.4.0","eslint":"^10.9.1","vitest":"^4.1.11","prettier":"^3.9.6","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^22.20.1","typescript-eslint":"^8.69.0","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/openrouter-mcp-multimodal_5.0.0_1788554238497_0.6375859297114213","host":"s3://npm-registry-packages-npm-production"}},"5.0.1":{"name":"@stabgan/openrouter-mcp-multimodal","version":"5.0.1","mcpName":"io.github.stabgan/openrouter-multimodal","description":"MCP server for OpenRouter — chat with 300+ LLMs, analyze images/audio/video, generate images (dedicated API), TTS/STT, video generation (Veo 3.1 / Seedance / Wan), async completions, response caching","type":"module","main":"dist/index.js","bin":{"openrouter-multimodal":"dist/index.js"},"scripts":{"build":"tsc && shx chmod +x dist/*.js","prepublishOnly":"npm run build","start":"node dist/index.js","lint":"eslint src","format":"prettier --write \"src/**/*.ts\" *.json \"*.md\"","format:check":"prettier --check \"src/**/*.ts\"","test":"vitest run","test:regression":"vitest run --config vitest.regression.config.ts","test:integration":"vitest run --config vitest.integration.config.ts","test:e2e":"npm run build && node scripts/live-e2e.mjs","test:smoke:npm":"npm run build && npm pack --quiet && node scripts/smoke-npm-mcp.mjs","test:smoke:docker":"node scripts/smoke-docker-mcp.mjs","test:smoke:uvx":"node scripts/smoke-uvx-mcp.mjs","test:smoke:uvx:local":"npm run build && npm pack --quiet && MCP_UVX_LOCAL=1 node scripts/smoke-uvx-mcp.mjs","test:smoke:uvx:git":"MCP_UVX_FROM_GIT=1 node scripts/smoke-uvx-mcp.mjs","test:smoke":"npm run test:smoke:npm && npm run test:smoke:docker && npm run test:smoke:uvx:local","test:all":"npm test && npm run test:regression && npm run test:integration","version:check":"node scripts/check-version-sync.mjs","ci":"npm run lint && npm run format:check && npm run version:check && npm run build && npm run test:all"},"keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"author":{"name":"stabgan"},"repository":{"type":"git","url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git"},"bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","license":"Apache-2.0","engines":{"node":">=22.0.0"},"dependencies":{"@modelcontextprotocol/sdk":"^1.30.0","dotenv":"^17.4.2","openai":"^7.9.0","sharp":"^0.35.4"},"devDependencies":{"@eslint/js":"^10.0.1","@types/node":"^22.20.1","eslint":"^10.9.1","eslint-config-prettier":"^10.1.8","prettier":"^3.9.6","shx":"^0.4.0","typescript":"^5.9.3","typescript-eslint":"^8.69.0","vitest":"^4.1.11"},"_id":"@stabgan/openrouter-mcp-multimodal@5.0.1","gitHead":"e33b3d94f95ec6a8b9af55937f7602fc81327183","types":"./dist/index.d.ts","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-Iu98NOUqVZo2A4n1v1AgoXskbOSlW2IfmR9TD0DvNNKTP/mlk/lcdKVTfEoQY6+dVsub4FaLOrLDmXS59M+GrA==","shasum":"5eb0f5bc5c68186504734737ac0abee298703b0b","tarball":"https://registry.npmjs.org/@stabgan/openrouter-mcp-multimodal/-/openrouter-mcp-multimodal-5.0.1.tgz","fileCount":91,"unpackedSize":354145,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stabgan%2fopenrouter-mcp-multimodal@5.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCs/1uZb/tAxtNyRXg97ZXj7ffSC5Jm8VyDgHCWBItCKAIhAMC90HRW06nrtMeY9oZvXMJ2vxPXg4Z333bBp6NjyMZk"}]},"_npmUser":{"name":"stabgan","email":"kaustabhganguly@gmail.com"},"directories":{},"maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/openrouter-mcp-multimodal_5.0.1_1788634879045_0.8608318963993324"},"_hasShrinkwrap":false}},"time":{"created":"2025-03-26T19:38:44.897Z","modified":"2026-09-05T19:01:19.546Z","1.0.0":"2025-03-26T19:38:45.145Z","1.1.0":"2025-03-27T07:52:48.755Z","1.2.0":"2025-03-27T08:13:06.247Z","1.2.1":"2025-03-27T10:25:13.310Z","1.3.0":"2025-03-27T11:01:44.074Z","1.4.0":"2025-03-28T07:13:02.179Z","1.5.0":"2025-03-28T07:30:53.927Z","1.8.0":"2026-03-20T06:46:24.479Z","1.8.1":"2026-03-28T14:10:39.351Z","1.8.2":"2026-03-28T14:26:46.333Z","1.9.0":"2026-04-07T20:40:10.088Z","2.0.0":"2026-04-07T20:54:01.543Z","3.0.0":"2026-04-20T10:13:05.695Z","3.1.0":"2026-05-03T17:50:40.184Z","3.1.1":"2026-05-03T22:44:17.306Z","3.2.0":"2026-05-03T23:13:19.804Z","4.0.0":"2026-05-04T09:53:08.438Z","4.0.1":"2026-05-04T10:44:28.706Z","4.5.0":"2026-05-04T20:25:29.403Z","4.5.1":"2026-05-04T21:05:00.433Z","4.5.3":"2026-07-01T21:13:17.407Z","4.6.0":"2026-08-22T12:43:05.609Z","4.6.1":"2026-08-22T13:37:06.413Z","4.6.2":"2026-08-22T19:32:52.220Z","4.7.0":"2026-09-02T08:15:56.081Z","4.8.0":"2026-09-02T11:10:58.970Z","5.0.0":"2026-09-04T20:37:18.653Z","5.0.1":"2026-09-05T19:01:19.204Z"},"bugs":{"url":"https://github.com/stabgan/openrouter-mcp-multimodal/issues"},"author":{"name":"stabgan"},"license":"Apache-2.0","homepage":"https://github.com/stabgan/openrouter-mcp-multimodal#readme","keywords":["mcp","openrouter","ai","llm","vision","image-analysis","audio","transcription","text-to-speech"],"repository":{"type":"git","url":"git+https://github.com/stabgan/openrouter-mcp-multimodal.git"},"description":"MCP server for OpenRouter — chat with 300+ LLMs, analyze images/audio/video, generate images (dedicated API), TTS/STT, video generation (Veo 3.1 / Seedance / Wan), async completions, response caching","maintainers":[{"name":"stabgan","email":"kaustabhganguly@gmail.com"}],"readme":"<p align=\"center\">\n  <img src=\"assets/logo.png\" alt=\"OpenRouter MCP Multimodal — MCP server for chat, vision, audio, and video AI tools\" width=\"128\" height=\"128\" />\n</p>\n\n<h1 align=\"center\">OpenRouter MCP Multimodal</h1>\n\n<p align=\"center\">\n  <strong>The MCP server for multimodal AI agents.</strong><br/>\n  One install · 19 tools · 300+ OpenRouter models · text, vision, audio &amp; video — analysis and generation.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@stabgan/openrouter-mcp-multimodal\"><img src=\"https://img.shields.io/npm/v/@stabgan/openrouter-mcp-multimodal.svg?label=npm&color=cb3837&logo=npm\" alt=\"npm version\" /></a>\n  <a href=\"https://pypi.org/project/mcp-server-openrouter-multimodal/\"><img src=\"https://img.shields.io/pypi/v/mcp-server-openrouter-multimodal.svg?label=pypi&color=3775A9&logo=pypi&logoColor=white\" alt=\"PyPI version\" /></a>\n  <a href=\"https://github.com/stabgan/openrouter-mcp-multimodal/releases\"><img src=\"https://img.shields.io/github/v/release/stabgan/openrouter-mcp-multimodal?label=release&color=6366f1\" alt=\"GitHub release\" /></a>\n  <a href=\"https://hub.docker.com/r/stabgan/openrouter-mcp-multimodal\"><img src=\"https://img.shields.io/docker/v/stabgan/openrouter-mcp-multimodal/latest?label=docker&color=2496ed&logo=docker&logoColor=white\" alt=\"Docker version\" /></a>\n  <a href=\"https://github.com/stabgan/openrouter-mcp-multimodal/actions/workflows/ci.yml\"><img src=\"https://github.com/stabgan/openrouter-mcp-multimodal/actions/workflows/ci.yml/badge.svg\" alt=\"CI status\" /></a>\n  <a href=\"https://www.apache.org/licenses/LICENSE-2.0\"><img src=\"https://img.shields.io/badge/License-Apache_2.0-blue.svg\" alt=\"Apache 2.0 license\" /></a>\n  <a href=\"https://nodejs.org\"><img src=\"https://img.shields.io/badge/node-%E2%89%A522-43853d?logo=node.js&logoColor=white\" alt=\"Node.js 22+\" /></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@stabgan/openrouter-mcp-multimodal\"><img src=\"https://img.shields.io/npm/dt/@stabgan/openrouter-mcp-multimodal.svg?label=npm%20downloads&color=cb3837&logo=npm\" alt=\"npm downloads\" /></a>\n  <a href=\"https://hub.docker.com/r/stabgan/openrouter-mcp-multimodal\"><img src=\"https://img.shields.io/docker/pulls/stabgan/openrouter-mcp-multimodal.svg?label=docker%20pulls&color=2496ed&logo=docker&logoColor=white\" alt=\"Docker pulls\" /></a>\n  <a href=\"https://registry.modelcontextprotocol.io/servers/io.github.stabgan/openrouter-multimodal\"><img src=\"https://img.shields.io/badge/MCP_Registry-listed-6366f1\" alt=\"MCP Registry\" /></a>\n  <a href=\"https://smithery.ai/server/@stabgan/openrouter-mcp-multimodal\"><img src=\"https://img.shields.io/badge/Smithery-Install-6366f1\" alt=\"Smithery MCP registry\" /></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"#quick-start\">Quick start</a> ·\n  <a href=\"#tools\">Tools</a> ·\n  <a href=\"#examples\">Examples</a> ·\n  <a href=\"#security\">Security</a> ·\n  <a href=\"#troubleshooting\">Troubleshooting</a> ·\n  <a href=\"#development\">Development</a> ·\n  <a href=\"#releasing\">Releasing</a> ·\n  <a href=\"#faq\">FAQ</a>\n</p>\n\n---\n\n## What is this?\n\n**OpenRouter MCP Multimodal** is a production-grade [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server — listed on the [official MCP Registry](https://registry.modelcontextprotocol.io/servers/io.github.stabgan/openrouter-multimodal) as `io.github.stabgan/openrouter-multimodal`. It connects AI coding agents ([Cursor](https://cursor.com), [Claude Desktop](https://claude.ai/download), [VS Code](https://code.visualstudio.com), [Windsurf](https://codeium.com/windsurf), [Cline](https://github.com/cline/cline), and others) to [OpenRouter](https://openrouter.ai)'s unified LLM API over stdio.\n\nUnlike text-only MCP servers, one install covers the **full multimodal surface**:\n\n| Capability  | Tools                                                                                   | Highlights                                                                                                                                                                        |\n| :---------- | :-------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Chat**    | `chat_completion`, `start_chat_completion`, `get_chat_completion_status`                | 300+ models, `:nitro` / `:floor` / `:free` / `:online` / `:exacto` suffixes, provider routing, web search, response caching, reasoning tokens, async jobs for long-running models |\n| **Vision**  | `analyze_image`, `generate_image`, `generate_image_dedicated`                           | OCR, captioning, VQA, image generation with reference inputs, dedicated Image API with resolution/quality/format control                                                          |\n| **Audio**   | `analyze_audio`, `generate_audio`, `text_to_speech`, `speech_to_text`                   | Transcription, speech/music generation, dedicated TTS (free Deepgram default; model-specific voices, mp3/pcm), dedicated STT (Whisper/GPT-4o Transcribe)                                                   |\n| **Video**   | `analyze_video`, `generate_video`, `generate_video_from_image`, `get_video_status`      | Clip understanding, Veo 3.1 / Seedance 2.0 / Wan 2.7 generation with progress notifications                                                                                       |\n| **Catalog** | `search_models`, `get_model_info`, `validate_model`, `rerank_documents`, `health_check` | Model discovery, validation, reranking, ops health                                                                                                                                |\n\n**Production hardening:** input/output path sandboxes (including analyze\\_\\* local files as of v4.5.2), SSRF guards, structured errors with `_meta.code`, MCP 2025-06-18 structured outputs, tool icons (2025-11-25), async video progress notifications, and **1000+** automated tests (unit, mock, regression, and live integration).\n\n## Quick start\n\n**1. Get an API key** (free tier works) → [openrouter.ai/keys](https://openrouter.ai/keys)\n\n**2. Run the server**\n\n```bash\nexport OPENROUTER_API_KEY=sk-or-v1-...\nnpx -y @stabgan/openrouter-mcp-multimodal\n```\n\n**3. Add to your MCP client** — copy one JSON block from [Install](#install) into your client config:\n\n| Client             | Config location                                                                                                                   |\n| :----------------- | :-------------------------------------------------------------------------------------------------------------------------------- |\n| **Cursor**         | Project: `.cursor/mcp.json` · User: Cursor Settings → MCP                                                                         |\n| **Claude Desktop** | macOS: `~/Library/Application Support/Claude/claude_desktop_config.json` · Windows: `%APPDATA%\\Claude\\claude_desktop_config.json` |\n| **VS Code**        | `.vscode/mcp.json` (workspace) or User Settings → MCP                                                                             |\n| **Windsurf**       | Windsurf Settings → MCP (same `mcpServers` JSON shape as Cursor)                                                                  |\n\nUse the `mcpServers` object from [Manual config](#manual-config) below.\n\n> **No credits required to start.** Free models such as `google/gemma-4-26b-a4b-it:free` work for chat and vision. Video/audio generation typically needs credits.\n\n## Install\n\nMCP servers are distributed through several packaging models. **This server is implemented in Node.js/TypeScript**; the table below maps each ecosystem method to how you run it here.\n\n| Method                                  | Runtime                          | Best for                                                       | This server                                                                                            |\n| :-------------------------------------- | :------------------------------- | :------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------- |\n| **[npx](#manual-config)**               | Node.js 22+                      | Most MCP clients (default)                                     | ✅ `@stabgan/openrouter-mcp-multimodal`                                                                |\n| **[uvx / pipx](#manual-config)**        | Python 3.10+ **and** Node.js 22+ | Python-first workflows, same pattern as PyPI MCP servers       | ✅ [`mcp-server-openrouter-multimodal`](https://pypi.org/project/mcp-server-openrouter-multimodal/)    |\n| **[npm global](#manual-config)**        | Node.js 22+                      | Pin a version without re-downloading                           | ✅                                                                                                     |\n| **[node (local)](#manual-config)**      | Node.js 22+                      | Contributors / air-gapped builds                               | ✅                                                                                                     |\n| **[Docker Hub](#manual-config)**        | Docker                           | Isolation, no Node on host                                     | ✅ `stabgan/openrouter-mcp-multimodal`                                                                 |\n| **[GHCR](#manual-config)**              | Docker                           | GitHub-native OCI pulls                                        | ✅ `ghcr.io/stabgan/openrouter-mcp-multimodal`                                                         |\n| **[Smithery CLI](#smithery)**           | Node.js (via installer)          | Interactive install into Claude/Cursor/etc.                    | ✅                                                                                                     |\n| **[MCP Registry](#mcp-registry)**       | npm or OCI                       | Official discovery (`io.github.stabgan/openrouter-multimodal`) | ✅ [listing](https://registry.modelcontextprotocol.io/servers/io.github.stabgan/openrouter-multimodal) |\n| **[One-click deeplinks](#one-click)**   | Node.js                          | Cursor, VS Code, Kiro                                          | ✅                                                                                                     |\n| **[Claude Code CLI](#claude-code-cli)** | Node.js                          | Terminal-first Claude Code users                               | ✅                                                                                                     |\n| **[MCP Inspector](#mcp-inspector)**     | Node.js                          | Debug / list tools locally                                     | ✅                                                                                                     |\n| **Windows `cmd /c npx`**                | Node.js                          | Claude Desktop / Cursor when `npx` not on GUI PATH             | ✅ [see below](#windows-npx)                                                                           |\n| pip / uv (direct)                       | —                                | Native Python MCP servers only                                 | — use **uvx** row above                                                                                |\n| DXT desktop extensions                  | —                                | Bundled Claude Desktop `.dxt`                                  | not yet                                                                                                |\n| Remote HTTP / SSE                       | —                                | Hosted Smithery / Cloudflare endpoints                         | via [Smithery](https://smithery.ai/server/@stabgan/openrouter-mcp-multimodal)                          |\n\n> **uvx vs npx:** In the MCP ecosystem, **`npx` runs npm (Node) packages** and **`uvx` runs PyPI (Python) packages**. Because this server is Node-based, `uvx` uses a thin [Python launcher](./python/) that execs `npx -y @stabgan/openrouter-mcp-multimodal` — you still need Node installed.\n\n### One-click\n\n<table>\n<tr><td><strong>Cursor</strong></td><td><a href=\"https://cursor.com/en/install-mcp?name=openrouter&config=eyJ0eXBlIjoic3RkaW8iLCJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBzdGFiZ2FuL29wZW5yb3V0ZXItbWNwLW11bHRpbW9kYWwiXSwiZW52Ijp7Ik9QRU5ST1VURVJfQVBJX0tFWSI6InNrLW9yLXYxLS4uLiJ9fQ%3D%3D\"><img src=\"https://cursor.com/deeplink/mcp-install-dark.svg\" alt=\"Add OpenRouter MCP to Cursor\" /></a></td></tr>\n<tr><td><strong>VS Code</strong></td><td><a href=\"https://insiders.vscode.dev/redirect/mcp/install?name=openrouter&config=%7B%22type%22%3A%22stdio%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40stabgan%2Fopenrouter-mcp-multimodal%22%5D%2C%22env%22%3A%7B%22OPENROUTER_API_KEY%22%3A%22sk-or-v1-...%22%7D%7D\"><img src=\"https://img.shields.io/badge/Add_to-VS_Code-007ACC?style=for-the-badge&logo=visualstudiocode&logoColor=white\" alt=\"Add to VS Code\" /></a></td></tr>\n<tr><td><strong>Kiro</strong></td><td><a href=\"https://kiro.dev/launch/mcp/add?name=openrouter&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40stabgan%2Fopenrouter-mcp-multimodal%22%5D%2C%22env%22%3A%7B%22OPENROUTER_API_KEY%22%3A%22sk-or-v1-...%22%7D%2C%22disabled%22%3Afalse%2C%22autoApprove%22%3A%5B%5D%7D\"><img src=\"https://img.shields.io/badge/Add_to-Kiro-232F3E?style=for-the-badge&logo=amazonaws&logoColor=white\" alt=\"Add to Kiro\" /></a></td></tr>\n<tr><td><strong>Claude Desktop / Windsurf / Cline</strong></td><td><a href=\"#manual-config\">Manual JSON config</a> (pick any method below)</td></tr>\n<tr><td><strong>Smithery</strong></td><td><a href=\"https://smithery.ai/server/@stabgan/openrouter-mcp-multimodal\"><code>npx -y @smithery/cli install @stabgan/openrouter-mcp-multimodal --client claude</code></a></td></tr>\n<tr><td><strong>MCP Registry</strong></td><td><a href=\"https://registry.modelcontextprotocol.io/servers/io.github.stabgan/openrouter-multimodal\">Official registry page</a> — npm + OCI packages</td></tr>\n</table>\n\nPaste your `OPENROUTER_API_KEY` when prompted — deeplinks use placeholders so secrets never appear in URLs.\n\n### Manual config\n\n<details open>\n<summary><strong>npx (recommended)</strong></summary>\n\n```bash\nexport OPENROUTER_API_KEY=sk-or-v1-...\nnpx -y @stabgan/openrouter-mcp-multimodal\n```\n\n```json\n{\n  \"mcpServers\": {\n    \"openrouter\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@stabgan/openrouter-mcp-multimodal\"],\n      \"env\": {\n        \"OPENROUTER_API_KEY\": \"sk-or-v1-...\"\n      }\n    }\n  }\n}\n```\n\nPin a release: `\"args\": [\"-y\", \"@stabgan/openrouter-mcp-multimodal@5.0.1\"]`\n\n</details>\n\n<details>\n<summary><strong>uvx / pipx (Python launcher)</strong></summary>\n\nInstall [uv](https://docs.astral.sh/uv/getting-started/installation/) (includes `uvx`), ensure **Node.js 22+** is also on your `PATH`, then:\n\n```bash\nexport OPENROUTER_API_KEY=sk-or-v1-...\nuvx mcp-server-openrouter-multimodal\n# pin npm version: OPENROUTER_MCP_NPM_VERSION=5.0.1 uvx mcp-server-openrouter-multimodal\n```\n\n```json\n{\n  \"mcpServers\": {\n    \"openrouter\": {\n      \"command\": \"uvx\",\n      \"args\": [\"mcp-server-openrouter-multimodal\"],\n      \"env\": {\n        \"OPENROUTER_API_KEY\": \"sk-or-v1-...\"\n      }\n    }\n  }\n}\n```\n\n**pipx equivalent:** `pipx run mcp-server-openrouter-multimodal`\n\nOptional: `OPENROUTER_MCP_NPM_VERSION=5.0.1` pins the underlying npm package.\n\n</details>\n\n<details>\n<summary><strong>npm global</strong></summary>\n\n```bash\nnpm install -g @stabgan/openrouter-mcp-multimodal\n```\n\n```json\n{\n  \"mcpServers\": {\n    \"openrouter\": {\n      \"command\": \"openrouter-multimodal\",\n      \"env\": { \"OPENROUTER_API_KEY\": \"sk-or-v1-...\" }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>node (local clone)</strong></summary>\n\n```bash\ngit clone https://github.com/stabgan/openrouter-mcp-multimodal.git\ncd openrouter-mcp-multimodal\nnpm ci && npm run build\n```\n\n```json\n{\n  \"mcpServers\": {\n    \"openrouter\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/openrouter-mcp-multimodal/dist/index.js\"],\n      \"env\": { \"OPENROUTER_API_KEY\": \"sk-or-v1-...\" }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Docker</strong></summary>\n\n```bash\ndocker run --rm -i -e OPENROUTER_API_KEY=sk-or-v1-... stabgan/openrouter-mcp-multimodal:latest\n```\n\n```json\n{\n  \"mcpServers\": {\n    \"openrouter\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\",\n        \"--rm\",\n        \"-i\",\n        \"-e\",\n        \"OPENROUTER_API_KEY=sk-or-v1-...\",\n        \"stabgan/openrouter-mcp-multimodal:latest\"\n      ]\n    }\n  }\n}\n```\n\nUse `-i` (interactive stdio). Avoid `-t` (TTY corrupts MCP framing on some hosts).\n\n</details>\n\n<details>\n<summary><strong>GHCR (GitHub Container Registry)</strong></summary>\n\n```bash\ndocker run --rm -i -e OPENROUTER_API_KEY=sk-or-v1-... \\\n  ghcr.io/stabgan/openrouter-mcp-multimodal:5.0.1\n```\n\n```json\n{\n  \"mcpServers\": {\n    \"openrouter\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\",\n        \"--rm\",\n        \"-i\",\n        \"-e\",\n        \"OPENROUTER_API_KEY=sk-or-v1-...\",\n        \"ghcr.io/stabgan/openrouter-mcp-multimodal:5.0.1\"\n      ]\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Smithery</strong></summary>\n\nInteractive install (writes config for your client):\n\n```bash\nnpx -y @smithery/cli install @stabgan/openrouter-mcp-multimodal --client claude\n# or: --client cursor | vscode | windsurf | ...\n```\n\nListing: [smithery.ai/server/@stabgan/openrouter-mcp-multimodal](https://smithery.ai/server/@stabgan/openrouter-mcp-multimodal)\n\n</details>\n\n<details>\n<summary><strong>MCP Registry</strong></summary>\n\nOfficial name: `io.github.stabgan/openrouter-multimodal`\n\n- Registry: [registry.modelcontextprotocol.io](https://registry.modelcontextprotocol.io/servers/io.github.stabgan/openrouter-multimodal)\n- npm package: `@stabgan/openrouter-mcp-multimodal`\n- OCI image: `docker.io/stabgan/openrouter-mcp-multimodal`\n\nClients that support registry-driven install will offer npm or Docker; otherwise use the JSON blocks above.\n\n</details>\n\n<details>\n<summary><strong>Claude Code CLI</strong></summary>\n\n```bash\nclaude mcp add openrouter -- npx -y @stabgan/openrouter-mcp-multimodal\n# project scope:\nclaude mcp add --scope project openrouter -- npx -y @stabgan/openrouter-mcp-multimodal\n```\n\nSet `OPENROUTER_API_KEY` in your shell or client env before starting Claude Code.\n\n</details>\n\n<details>\n<summary><strong>MCP Inspector</strong></summary>\n\nDebug tools/list and tool calls against a live OpenRouter key:\n\n```bash\nexport OPENROUTER_API_KEY=sk-or-v1-...\nnpx -y @modelcontextprotocol/inspector npx -y @stabgan/openrouter-mcp-multimodal\n```\n\n</details>\n\n<details>\n<summary><strong>Windows npx</strong></summary>\n\nWhen Claude Desktop or Cursor cannot find `npx` (GUI apps often miss shell `PATH`), wrap with `cmd`:\n\n```json\n{\n  \"mcpServers\": {\n    \"openrouter\": {\n      \"command\": \"cmd\",\n      \"args\": [\"/c\", \"npx\", \"-y\", \"@stabgan/openrouter-mcp-multimodal\"],\n      \"env\": { \"OPENROUTER_API_KEY\": \"sk-or-v1-...\" }\n    }\n  }\n}\n```\n\nIf still failing, use the full path from `where npx` as the command.\n\n</details>\n\n## Why this server?\n\n| Capability                           | This server | Typical MCP LLM servers |\n| :----------------------------------- | :---------: | :---------------------: |\n| Text chat (300+ models)              |     ✅      |           ✅            |\n| Image analysis + generation          |     ✅      |         partial         |\n| Audio analysis + TTS                 |     ✅      |           ❌            |\n| Video analysis + generation          |     ✅      |           ❌            |\n| Model search / validate / rerank     |     ✅      |           ❌            |\n| Path sandbox + SSRF protection       |     ✅      |          rare           |\n| MCP 2025 structured outputs          |     ✅      |          rare           |\n| Async video + progress notifications |     ✅      |           ❌            |\n\n## Tools\n\n19 MCP tools. Each description includes **Use when**, **Good/Bad examples**, **Fails when**, and **Works with** so agents pick the right tool and recover from errors.\n\n| Tool                         | Purpose                                                                    |\n| :--------------------------- | :------------------------------------------------------------------------- |\n| `chat_completion`            | Text chat, web search, provider routing, caching, reasoning                |\n| `start_chat_completion`      | Async background job for long-running reasoning models                     |\n| `get_chat_completion_status` | Poll / retrieve async completion results                                   |\n| `analyze_image`              | Vision — local path, URL, or data URL + `question`                         |\n| `analyze_audio`              | Transcribe / analyze audio files                                           |\n| `analyze_video`              | Describe / Q&A over video files                                            |\n| `generate_image`             | Text-to-image via chat completions with reference images                   |\n| `generate_image_dedicated`   | Text-to-image via dedicated `/api/v1/images` (resolution, quality, format) |\n| `generate_audio`             | Text-to-speech / music via chat completions                                |\n| `text_to_speech`             | Dedicated TTS (`/api/v1/audio/speech`) — free Deepgram default, voices, speed, mp3/pcm |\n| `speech_to_text`             | Dedicated STT (`/api/v1/audio/transcriptions`) — Whisper, GPT-4o           |\n| `generate_video`             | Text-to-video (async, resumable)                                           |\n| `generate_video_from_image`  | Image-to-video (narrower schema)                                           |\n| `get_video_status`           | Poll / resume video jobs                                                   |\n| `search_models`              | Paginated model catalog search                                             |\n| `get_model_info`             | Pricing, context, modalities                                               |\n| `validate_model`             | Cheap model ID existence check                                             |\n| `rerank_documents`           | Relevance ranking for RAG                                                  |\n| `health_check`               | API key + reachability probe                                               |\n\nErrors use a closed `_meta.code` taxonomy: `INVALID_INPUT` · `UNSAFE_PATH` · `UPSTREAM_*` · `MODEL_NOT_FOUND` · `JOB_STILL_RUNNING` · and more.\n\n### Binary tool results (v4.7.0+)\n\nGenerate tools (`generate_image`, `generate_image_dedicated`, `generate_audio`, `text_to_speech`, `generate_video`, `generate_video_from_image`, `get_video_status`) return image, audio, or video bytes. As of **4.7.0** the behavior is explicit:\n\n| `save_path`                   | Tool result                                                                                                                                                                      |\n| :---------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Set**                       | **Text pointer only** — e.g. `Image saved to: out.png (… bytes, image/png)` plus `_meta.save_path`. **No inline base64** (avoids duplicating large payloads in the MCP channel). |\n| **Unset, under byte ceiling** | Inline media block **and** summary text (images/audio use MCP `image` / `audio` types; video uses MCP `resource` blocks).                                                        |\n| **Unset, over ceiling**       | Text only with a hint to pass `save_path`.                                                                                                                                       |\n\nDefault inline ceilings (override per kind or globally):\n\n| Kind  | Default | Env vars (precedence: per-kind → global)                            |\n| :---- | :------ | :------------------------------------------------------------------ |\n| Image | 1 MiB   | `OPENROUTER_IMAGE_INLINE_MAX_BYTES` → `OPENROUTER_INLINE_MAX_BYTES` |\n| Audio | 1 MiB   | `OPENROUTER_AUDIO_INLINE_MAX_BYTES` → `OPENROUTER_INLINE_MAX_BYTES` |\n| Video | 10 MiB  | `OPENROUTER_VIDEO_INLINE_MAX_BYTES` → `OPENROUTER_INLINE_MAX_BYTES` |\n\nIf you previously relied on **both** a saved file **and** inline media in the same tool result, read the file from `_meta.save_path` (or omit `save_path` to get inline media when under the ceiling).\n\n## Examples\n\n### Chat (free model)\n\n```json\n{\n  \"tool\": \"chat_completion\",\n  \"arguments\": {\n    \"model\": \"google/gemma-4-26b-a4b-it:free\",\n    \"messages\": [{ \"role\": \"user\", \"content\": \"Summarize MCP in one sentence.\" }]\n  }\n}\n```\n\n### Analyze an image\n\n```json\n{\n  \"tool\": \"analyze_image\",\n  \"arguments\": {\n    \"image_path\": \"diagram.png\",\n    \"question\": \"List every label in this diagram.\"\n  }\n}\n```\n\n> Use `image_path` and `question` — not `image` / `prompt`.\n\n### Search models (vision + free)\n\n```json\n{\n  \"tool\": \"search_models\",\n  \"arguments\": {\n    \"query\": \"gemma\",\n    \"capabilities\": { \"vision\": true },\n    \"limit\": 10,\n    \"offset\": 0\n  }\n}\n```\n\n### Generate video (async)\n\n```json\n{\n  \"tool\": \"generate_video\",\n  \"arguments\": {\n    \"model\": \"google/veo-3.1\",\n    \"prompt\": \"Ocean waves at sunrise, cinematic drone shot\",\n    \"duration\": 4,\n    \"save_path\": \"river.mp4\"\n  }\n}\n```\n\nIf the job is still running when `max_wait_ms` elapses, the response succeeds with `_meta.code: JOB_STILL_RUNNING` and a `video_id` — call `get_video_status` to resume. **This is not an error.**\n\nWith `save_path` set (as above), the result is a **text pointer** to the saved file once complete — not inline video. See [Binary tool results](#binary-tool-results-v470).\n\nMore examples: [docs/plans/tool-description-improvement.md](./docs/plans/tool-description-improvement.md)\n\n## Security\n\n- **Input path sandbox** — local paths on `analyze_*` and reference images must stay inside `OPENROUTER_INPUT_DIR` (falls back to `OPENROUTER_OUTPUT_DIR`, then `cwd`)\n- **Output path sandbox** — `save_path` must stay inside `OPENROUTER_OUTPUT_DIR`\n- **Async job reads** — `get_chat_completion_status` resolves disk paths only under `OPENROUTER_OUTPUT_DIR/openrouter-jobs/` (4.7.0+)\n- **SSRF protection** — private/reserved IPs blocked on URL fetches\n- **Untrusted content** — analyze outputs tagged `_meta.content_is_untrusted: true`\n\nOverride sandboxes only with `OPENROUTER_ALLOW_UNSAFE_PATHS=1` (discouraged).\n\nReport vulnerabilities: **[SECURITY.md](./SECURITY.md)** (private disclosure — do not file public issues for exploits).\n\n## Configuration\n\n<details>\n<summary><strong>Environment variables</strong></summary>\n\n| Variable                            | Required | Default                               | Description                         |\n| :---------------------------------- | :------: | :------------------------------------ | :---------------------------------- |\n| `OPENROUTER_API_KEY`                | **Yes**  | —                                     | OpenRouter API key                  |\n| `OPENROUTER_DEFAULT_MODEL`          |    No    | `google/gemma-4-26b-a4b-it:free` | Default when tools omit `model`     |\n| `OPENROUTER_OUTPUT_DIR`             |    No    | `cwd`                                 | Sandbox root for `save_path`        |\n| `OPENROUTER_INPUT_DIR`              |    No    | `OUTPUT_DIR` or `cwd`                 | Sandbox root for local input files  |\n| `OPENROUTER_INLINE_MAX_BYTES`       |    No    | `1048576` (image/audio)               | Global inline media ceiling         |\n| `OPENROUTER_IMAGE_INLINE_MAX_BYTES` |    No    | falls back to global                  | Per-kind inline ceiling             |\n| `OPENROUTER_AUDIO_INLINE_MAX_BYTES` |    No    | falls back to global                  | Per-kind inline ceiling             |\n| `OPENROUTER_VIDEO_INLINE_MAX_BYTES` |    No    | `10485760`                            | Video inline ceiling                |\n| `OPENROUTER_LOG_LEVEL`              |    No    | `info`                                | `error` / `warn` / `info` / `debug` |\n\nSee [`.env.example`](./.env.example) for the full list (provider routing, fetch limits, caching, video polling, async jobs, integration-test overrides).\n\n</details>\n\n## Development\n\n```bash\ngit clone https://github.com/stabgan/openrouter-mcp-multimodal.git\ncd openrouter-mcp-multimodal\nnpm install\ncp .env.example .env   # add OPENROUTER_API_KEY\nnpm run build\n```\n\n### Testing\n\n| Command                    | What it runs                                               |\n| :------------------------- | :--------------------------------------------------------- |\n| `npm test`                 | **1018** unit + mock tests (no API key, &lt;20s)           |\n| `npm run test:regression`  | Security + schema regression guards                        |\n| `npm run test:integration` | **16** live OpenRouter scenarios (**requires** `.env` key) |\n| `npm run test:e2e`         | Full MCP stdio smoke (`scripts/live-e2e.mjs`)              |\n| `npm run ci`               | lint + format + build + **all** of the above except e2e    |\n\n**Free models for CI / zero-credit accounts:** integration tests default to `google/gemma-4-26b-a4b-it:free` (override with `OPENROUTER_INTEGRATION_MODEL`). GitHub Actions requires the `OPENROUTER_API_KEY` repository secret.\n\nMock tests live under `src/__tests__/mock/` and cover handlers, path sandboxes, SSRF blocks, model-cache pagination, tool descriptions, and structured outputs — **330+** additional cases beyond the core suite.\n\n```bash\nnpm run lint\nnpm run format:check\nnpm run version:check   # package.json vs src/version.ts, server.json, pyproject.toml\n```\n\n## Releasing\n\nPublished artifacts (**npm**, **PyPI/uvx**, **Docker**, **GHCR**) all ship from the **same semver** on a git tag (`vX.Y.Z`). Pushing to `main` runs tests but does **not** publish to npm or PyPI.\n\n**Normal flow:** merge conventional commits to `main` → [Release Please](https://github.com/googleapis/release-please) opens a Release PR → merge it → tag is created → CI publishes everywhere.\n\n**Manual flow:** bump all version files → `npm run version:check` → `npm run ci` + smoke tests → commit → `git tag vX.Y.Z` → `git push origin vX.Y.Z`.\n\nFull checklist, file list, CI secrets, and agent instructions:\n\n- **[`docs/RELEASING.md`](docs/RELEASING.md)** — maintainer release guide\n- **[`AGENTS.md`](AGENTS.md)** — quick reference for AI agents\n\n## Troubleshooting\n\n| Symptom                                                     | Likely cause                             | Fix                                                                                                             |\n| :---------------------------------------------------------- | :--------------------------------------- | :-------------------------------------------------------------------------------------------------------------- |\n| Server exits immediately / `OPENROUTER_API_KEY is required` | Missing or empty API key                 | Set `OPENROUTER_API_KEY` in client `env` or shell — get one at [openrouter.ai/keys](https://openrouter.ai/keys) |\n| `_meta.code: INVALID_CREDENTIALS` or HTTP 401               | Bad or revoked key                       | Regenerate at [openrouter.ai/keys](https://openrouter.ai/keys); restart the MCP client                          |\n| `_meta.code: MODEL_NOT_FOUND`                               | Typo or retired model ID                 | Run `search_models` or `validate_model`; check [openrouter.ai/models](https://openrouter.ai/models)             |\n| HTTP 402 / insufficient credits                             | Paid model or generation on zero balance | Add credits at [openrouter.ai/credits](https://openrouter.ai/credits) or use a `:free` model                    |\n| `_meta.code: UPSTREAM_HTTP` with 429                        | Rate limit                               | Wait for `_meta.retry_after_seconds` if present; reduce concurrency                                             |\n| `_meta.code: UNSAFE_PATH`                                   | Local path outside sandbox               | Put files under `OPENROUTER_INPUT_DIR` or set `OPENROUTER_OUTPUT_DIR` wider; see [Security](#security)          |\n| `npx` not found (Windows GUI apps)                          | GUI `PATH` differs from terminal         | Use the [Windows npx](#windows-npx) `cmd /c` wrapper                                                            |\n| No inline image/audio after upgrade                         | **v4.7.0** with `save_path` set          | Expected — result is text + `_meta.save_path` only; omit `save_path` or read the saved file                     |\n| MCP client shows stale tool list                            | Client cache                             | Restart MCP / reload window after upgrading the package pin                                                     |\n\nStructured errors include `_meta.suggestions` with agent-oriented next steps when available.\n\n## FAQ\n\n### Do I need paid OpenRouter credits?\n\nNo, to get started. Free models work for chat and vision. Audio/video **generation** usually requires credits; analysis may return `402` on some models — the server surfaces that as a structured error.\n\n### Which MCP clients are supported?\n\nAny MCP-compatible client over stdio: Cursor, Claude Desktop, VS Code Copilot, Windsurf, Cline, Kiro, and custom agents.\n\n### How is this different from calling OpenRouter directly?\n\nThis server adds MCP tool schemas, security sandboxes, error taxonomy, model caching, async video polling with progress notifications, and agent-oriented tool descriptions — so LLMs invoke the right capability without custom HTTP glue.\n\n### Where is the security advisory for path traversal?\n\nFixed in 4.5.2+ — see [GHSA-3q7p-736f-x44v](https://github.com/stabgan/openrouter-mcp-multimodal/security/advisories/GHSA-3q7p-736f-x44v), [`SECURITY.md`](./SECURITY.md), and `docs/solutions/security-issues/`.\n\n## Compatibility\n\nWorks with any MCP client. Protocol: **MCP 2025-06-18**. Node **≥ 22** (Docker image uses Node 24).\n\n## License\n\nApache 2.0 — see [LICENSE](./LICENSE).\n\n## Contributing\n\nIssues and PRs welcome. For large changes, open an issue first.\n\nBefore submitting: run **`npm run ci`**. Use [Conventional Commits](https://www.conventionalcommits.org/) (`fix:`, `feat:`, etc.) so [Release Please](docs/RELEASING.md) can cut the next release. See **[`docs/RELEASING.md`](docs/RELEASING.md)** if you need to ship a version.\n","readmeFilename":"README.md"}