{"_id":"@bioinfornatics/gpt-image-mcp","_rev":"8-0ff08bfb255bb465d459a23bf28e8bf9","name":"@bioinfornatics/gpt-image-mcp","dist-tags":{"latest":"0.1.7"},"versions":{"0.0.2":{"name":"@bioinfornatics/gpt-image-mcp","version":"0.0.2","license":"CECILL-2.1","_id":"@bioinfornatics/gpt-image-mcp@0.0.2","maintainers":[{"name":"bioinfornatics","email":"jonathan@mercier.paris"}],"homepage":"https://github.com/bioinfornatics/gpt-image-mcp#readme","bugs":{"url":"https://github.com/bioinfornatics/gpt-image-mcp/issues"},"bin":{"gpt-image-mcp":"dist/main.js"},"dist":{"shasum":"89d75e8525a5492c3123bf2844e06cd55d66d6a9","tarball":"https://registry.npmjs.org/@bioinfornatics/gpt-image-mcp/-/gpt-image-mcp-0.0.2.tgz","fileCount":70,"integrity":"sha512-VxTJN3p0WjF6WDID2yGDUep2ymn2uxx8TT7GJ7I8VUpxz7nG+ne81XFhrO7ylLeQ715tHEOZ3Mj80pWZDrY8lA==","signatures":[{"sig":"MEUCIHibzPC/Efa5VVb9Q6EAxyoIpYgM2SOabBWXc79e5P1aAiEAvWYWs/uarIkwsGrSOozaArVYggnA8hX4AUC33FiKifg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":165447},"engines":{"bun":">=1.1.0"},"gitHead":"f6b1fd0322d7513ae64c5c32acf85d2244da7ad6","scripts":{"lint":"eslint 'src/**/*.ts' 'test/**/*.ts'","test":"bun test --coverage","build":"node --max-old-space-size=8192 node_modules/.bin/tsc -p tsconfig.build.json","start":"node dist/main.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'test/**/*.ts' --fix","postbuild":"chmod +x dist/main.js","start:dev":"bun run src/main.ts","start:http":"MCP_TRANSPORT=http bun run src/main.ts","test:watch":"bun test --watch","type-check":"node --max-old-space-size=8192 node_modules/.bin/tsc -p tsconfig.build.json --noEmit","publish:dry":"npm pack --dry-run","start:stdio":"MCP_TRANSPORT=stdio bun run src/main.ts","secret:store":"bun run src/cli/store-secret.ts","secret:delete":"bun run src/cli/store-secret.ts","test:coverage":"bun test --coverage","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","prepublishOnly":"bun test && bun run build"},"_npmUser":{"name":"bioinfornatics","email":"jonathan@mercier.paris"},"overrides":{"lodash":"^4.18.1","multer":"^2.1.1","file-type":"^21.3.2"},"repository":{"url":"git+https://github.com/bioinfornatics/gpt-image-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for AI image generation via OpenAI and Azure OpenAI gpt-image-* models","directories":{},"_nodeVersion":"20.20.2","dependencies":{"joi":"^17.13.3","zod":"^3.25.76","rxjs":"^7.8.2","openai":"^4.104.0","express":"^4.22.1","winston":"^3.19.0","prom-client":"^15.1.3","@nestjs/core":"^11.1.18","@nestjs/common":"^11.1.18","@nestjs/config":"^3.3.0","class-validator":"^0.14.4","@nestjs/terminus":"^11.0.0","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-express":"^11.1.18","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://npm.pkg.github.com"},"_hasShrinkwrap":false,"devDependencies":{"nock":"^13.5.6","eslint":"^8.57.1","prettier":"^3.8.3","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^22.19.17","@types/express":"^4.17.25","@nestjs/testing":"^11.1.18","@types/supertest":"^6.0.3","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/gpt-image-mcp_0.0.2_1777486020450_0.7026535192299865","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@bioinfornatics/gpt-image-mcp","version":"0.1.1","license":"CECILL-2.1","_id":"@bioinfornatics/gpt-image-mcp@0.1.1","maintainers":[{"name":"bioinfornatics","email":"jonathan@mercier.paris"}],"homepage":"https://github.com/bioinfornatics/gpt-image-mcp#readme","bugs":{"url":"https://github.com/bioinfornatics/gpt-image-mcp/issues"},"bin":{"gpt-image-mcp":"dist/main.js"},"dist":{"shasum":"2f4c6f0f40d481eee2c02502544b13a57f341b08","tarball":"https://registry.npmjs.org/@bioinfornatics/gpt-image-mcp/-/gpt-image-mcp-0.1.1.tgz","fileCount":76,"integrity":"sha512-Vp/SXLwMaRUeEzFDa2ABVjw9aPPGk9JV7jcbbR+nFWG4IbjZU2AwHjh03IzgSjzhe8Pbnu0o+olNVKmznPM6qw==","signatures":[{"sig":"MEUCIEwO3zW6JUQjZ3RT+X0ijsaG0J+w7TmAtpdTq9HnX1rOAiEA1M9Di/UHQHknycC4p8wKnl/UHc+JCLucIe2oET9cGQQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201391},"engines":{"bun":">=1.1.0","node":">=20"},"gitHead":"c713b133bed72091b2cb219acbed1a9990ec118f","scripts":{"lint":"eslint 'src/**/*.ts' 'test/**/*.ts'","test":"bun test --coverage","build":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json","start":"node dist/main.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'test/**/*.ts' --fix","postbuild":"chmod +x dist/main.js","start:dev":"bun run src/main.ts","start:http":"IMAGE_MCP_TRANSPORT=http bun run src/main.ts","test:watch":"bun test --watch","type-check":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json --noEmit","publish:dry":"npm pack --dry-run","start:stdio":"IMAGE_MCP_TRANSPORT=stdio bun run src/main.ts","secret:store":"bun run src/cli/store-secret.ts","secret:delete":"bun run src/cli/store-secret.ts","test:coverage":"bun test --coverage","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","prepublishOnly":"bun test && bun run build"},"_npmUser":{"name":"bioinfornatics","email":"jonathan@mercier.paris"},"overrides":{"lodash":"^4.18.1","multer":"^2.2.0","js-yaml":"^4.3.0","file-type":"^21.3.2","form-data":"^4.0.6","find-my-way":"^9.7.0","brace-expansion":"^1.1.17"},"repository":{"url":"git+https://github.com/bioinfornatics/gpt-image-mcp.git","type":"git"},"_npmVersion":"10.9.7","description":"MCP server for AI image generation via OpenAI and Azure OpenAI gpt-image-* models","directories":{},"_nodeVersion":"22.22.2","dependencies":{"joi":"^17.13.3","zod":"^4.2.0","rxjs":"^7.8.2","openai":"^4.104.0","fastify":"^5.11.3","winston":"^3.19.0","prom-client":"^15.1.3","@nestjs/core":"^11.1.29","@nestjs/common":"^11.1.29","@nestjs/config":"^3.3.0","class-validator":"^0.14.4","@nestjs/terminus":"^11.0.0","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-fastify":"11.1.29","@modelcontextprotocol/node":"^2.0.0","@modelcontextprotocol/server":"^2.0.0","@modelcontextprotocol/fastify":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://npm.pkg.github.com"},"_hasShrinkwrap":false,"devDependencies":{"nock":"^13.5.6","eslint":"^8.57.1","prettier":"^3.8.3","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^22.19.17","@nestjs/testing":"^11.1.29","@types/supertest":"^6.0.3","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/gpt-image-mcp_0.1.1_1786378859641_0.23440611761210284","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@bioinfornatics/gpt-image-mcp","version":"0.1.2","license":"CECILL-2.1","_id":"@bioinfornatics/gpt-image-mcp@0.1.2","maintainers":[{"name":"bioinfornatics","email":"jonathan@mercier.paris"}],"homepage":"https://github.com/bioinfornatics/gpt-image-mcp#readme","bugs":{"url":"https://github.com/bioinfornatics/gpt-image-mcp/issues"},"bin":{"gpt-image-mcp":"dist/main.js"},"dist":{"shasum":"aab4457dc5a2a4efccac52bd7adc0975dbeda0b0","tarball":"https://registry.npmjs.org/@bioinfornatics/gpt-image-mcp/-/gpt-image-mcp-0.1.2.tgz","fileCount":76,"integrity":"sha512-LQKdHbwqgQ8fJfyFupKP9TfYectxiNSRiGUyVEzquU8RDV+CTog0wR6kwomnMXfWlwgDPdUCqdyWtO3BlZH3hA==","signatures":[{"sig":"MEUCIQCnfni2h/AXyu2JDn+EcwEReMSaa+QXWkawev8ycjzyOQIgZb1/aF21s5wLBiPHQaV/AHpHUcUAZEcL0kD45paqzq8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201849},"engines":{"bun":">=1.1.0","node":">=20"},"gitHead":"0ecf34a72a1a59a4cade2b0a651a4788059d328e","scripts":{"lint":"eslint 'src/**/*.ts' 'test/**/*.ts'","test":"bun test --coverage","build":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json","start":"node dist/main.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'test/**/*.ts' --fix","postbuild":"chmod +x dist/main.js","start:dev":"bun run src/main.ts","start:http":"IMAGE_MCP_TRANSPORT=http bun run src/main.ts","test:watch":"bun test --watch","type-check":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json --noEmit","publish:dry":"npm pack --dry-run","start:stdio":"IMAGE_MCP_TRANSPORT=stdio bun run src/main.ts","secret:store":"bun run src/cli/store-secret.ts","secret:delete":"bun run src/cli/store-secret.ts","test:coverage":"bun test --coverage","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","prepublishOnly":"bun test && bun run build"},"_npmUser":{"name":"bioinfornatics","email":"jonathan@mercier.paris"},"overrides":{"lodash":"^4.18.1","multer":"^2.2.0","js-yaml":"^4.3.0","file-type":"^21.3.2","form-data":"^4.0.6","find-my-way":"^9.7.0","brace-expansion":"^1.1.17"},"repository":{"url":"git+https://github.com/bioinfornatics/gpt-image-mcp.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for AI image generation via OpenAI and Azure OpenAI gpt-image-* models","directories":{},"_nodeVersion":"22.23.1","dependencies":{"joi":"^17.13.3","zod":"^4.2.0","rxjs":"^7.8.2","openai":"^4.104.0","fastify":"^5.11.3","winston":"^3.19.0","prom-client":"^15.1.3","@nestjs/core":"^11.1.29","@nestjs/common":"^11.1.29","@nestjs/config":"^3.3.0","class-validator":"^0.14.4","@nestjs/terminus":"^11.0.0","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-fastify":"11.1.29","@modelcontextprotocol/node":"^2.0.0","@modelcontextprotocol/server":"^2.0.0","@modelcontextprotocol/fastify":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://npm.pkg.github.com"},"_hasShrinkwrap":false,"devDependencies":{"nock":"^13.5.6","eslint":"^8.57.1","prettier":"^3.8.3","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^22.19.17","@nestjs/testing":"^11.1.29","@types/supertest":"^6.0.3","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/gpt-image-mcp_0.1.2_1786383416458_0.13872292807442177","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@bioinfornatics/gpt-image-mcp","version":"0.1.3","license":"CECILL-2.1","_id":"@bioinfornatics/gpt-image-mcp@0.1.3","maintainers":[{"name":"bioinfornatics","email":"jonathan@mercier.paris"}],"homepage":"https://github.com/bioinfornatics/gpt-image-mcp#readme","bugs":{"url":"https://github.com/bioinfornatics/gpt-image-mcp/issues"},"bin":{"gpt-image-mcp":"dist/main.js"},"dist":{"shasum":"3a0183dae8904fa7b76d358cc97b6525c89d4060","tarball":"https://registry.npmjs.org/@bioinfornatics/gpt-image-mcp/-/gpt-image-mcp-0.1.3.tgz","fileCount":109,"integrity":"sha512-VU3gctCiZFLeW6divCVUadbcx4nNZRMOE58bZ2hXvZe6Er0rIf5MD87OOTlEvP2MAPaJRVfuH6Ac9Xu2BzsVOA==","signatures":[{"sig":"MEUCIEnRRbYQ4SKibq3TKiBhx+5nmgQxFR0M4ijsnlpB16rNAiEAuU4C5I7KCejqEK4s/nVaAEhCaUAH6YjRdqx/pPOS8Kg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":273243},"engines":{"bun":">=1.1.0","node":">=20"},"gitHead":"e23a329fbc755c151e3bc789ff08a393a0fe67c7","scripts":{"lint":"eslint 'src/**/*.ts' 'test/**/*.ts'","test":"bun test --coverage","build":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json","start":"node dist/main.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts'","prepack":"bun run build","lint:fix":"eslint 'src/**/*.ts' 'test/**/*.ts' --fix","postbuild":"chmod +x dist/main.js","start:dev":"bun run src/main.ts","start:http":"IMAGE_MCP_TRANSPORT=http bun run src/main.ts","test:watch":"bun test --watch","type-check":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json --noEmit","auth:doctor":"bun run src/cli/auth-doctor.ts","publish:dry":"npm pack --dry-run","start:stdio":"IMAGE_MCP_TRANSPORT=stdio bun run src/main.ts","secret:store":"bun run src/cli/store-secret.ts","secret:delete":"bun run src/cli/store-secret.ts","test:coverage":"bun test --coverage","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","prepublishOnly":"bun test && bun run build"},"_npmUser":{"name":"bioinfornatics","email":"jonathan@mercier.paris"},"overrides":{"lodash":"^4.18.1","multer":"^2.2.0","js-yaml":"^4.3.0","file-type":"^21.3.2","form-data":"^4.0.6","find-my-way":"^9.7.0","brace-expansion":"^1.1.17","@hono/node-server":"^2.1.0"},"repository":{"url":"git+https://github.com/bioinfornatics/gpt-image-mcp.git","type":"git"},"_npmVersion":"10.9.7","description":"MCP server for AI image generation via OpenAI and Azure OpenAI gpt-image-* models","directories":{},"_nodeVersion":"22.22.2","dependencies":{"joi":"^17.13.3","zod":"^4.2.0","jose":"^6.2.8","rxjs":"^7.8.2","openai":"^4.104.0","fastify":"^5.11.3","winston":"^3.19.0","prom-client":"^15.1.3","@nestjs/core":"^11.1.29","@nestjs/common":"^11.1.29","@nestjs/config":"^3.3.0","@azure/identity":"^4.13.1","class-validator":"^0.14.4","@azure/msal-node":"^5.5.0","@nestjs/terminus":"^11.0.0","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-fastify":"11.1.29","@modelcontextprotocol/node":"^2.0.0","@modelcontextprotocol/server":"^2.0.0","@modelcontextprotocol/fastify":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://npm.pkg.github.com"},"_hasShrinkwrap":false,"devDependencies":{"nock":"^13.5.6","eslint":"^8.57.1","prettier":"^3.8.3","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^22.19.17","@nestjs/testing":"^11.1.29","@types/supertest":"^6.0.3","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/gpt-image-mcp_0.1.3_1786405816869_0.47244117403878816","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@bioinfornatics/gpt-image-mcp","version":"0.1.4","license":"CECILL-2.1","_id":"@bioinfornatics/gpt-image-mcp@0.1.4","maintainers":[{"name":"bioinfornatics","email":"jonathan@mercier.paris"}],"homepage":"https://github.com/bioinfornatics/gpt-image-mcp#readme","bugs":{"url":"https://github.com/bioinfornatics/gpt-image-mcp/issues"},"bin":{"gpt-image-mcp":"dist/main.js"},"dist":{"shasum":"07c95b8caf13b9f03f2198b7b5f37f0e38bbfc63","tarball":"https://registry.npmjs.org/@bioinfornatics/gpt-image-mcp/-/gpt-image-mcp-0.1.4.tgz","fileCount":109,"integrity":"sha512-PDdD4bbZygE+IhjPogmuDAqnVXbDQ2yTi+SE93BwQbjZu9PuzZEU5GMqmssCXmIRopnoOxoIx0pPi1bINwcTLg==","signatures":[{"sig":"MEUCIQDMbWT4lDZJpaSojtc+ZO7NJ5QVXLdWyUW0RqvxbrHYSAIgFhWohPc/H9rQmJ7yjFEPOvjPeX4wW1My7Q/zra+JyNM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":273202},"engines":{"bun":">=1.1.0","node":">=20"},"gitHead":"e23a329fbc755c151e3bc789ff08a393a0fe67c7","scripts":{"lint":"eslint 'src/**/*.ts' 'test/**/*.ts'","test":"bun test --coverage","build":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json","start":"node dist/main.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts'","prepack":"bun run build","lint:fix":"eslint 'src/**/*.ts' 'test/**/*.ts' --fix","postbuild":"chmod +x dist/main.js","start:dev":"bun run src/main.ts","start:http":"IMAGE_MCP_TRANSPORT=http bun run src/main.ts","test:watch":"bun test --watch","type-check":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json --noEmit","auth:doctor":"bun run src/cli/auth-doctor.ts","publish:dry":"npm pack --dry-run","start:stdio":"IMAGE_MCP_TRANSPORT=stdio bun run src/main.ts","secret:store":"bun run src/cli/store-secret.ts","secret:delete":"bun run src/cli/store-secret.ts","test:coverage":"bun test --coverage","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","prepublishOnly":"bun test && bun run build"},"_npmUser":{"name":"bioinfornatics","email":"jonathan@mercier.paris"},"overrides":{"lodash":"^4.18.1","multer":"^2.2.0","js-yaml":"^4.3.0","file-type":"^21.3.2","form-data":"^4.0.6","find-my-way":"^9.7.0","brace-expansion":"^1.1.17","@hono/node-server":"^2.1.0"},"repository":{"url":"git+https://github.com/bioinfornatics/gpt-image-mcp.git","type":"git"},"_npmVersion":"10.9.7","description":"MCP server for AI image generation via OpenAI and Azure OpenAI gpt-image-* models","directories":{},"_nodeVersion":"22.22.2","dependencies":{"joi":"^17.13.3","zod":"^4.2.0","jose":"^6.2.8","rxjs":"^7.8.2","openai":"^4.104.0","fastify":"^5.11.3","winston":"^3.19.0","prom-client":"^15.1.3","@nestjs/core":"^11.1.29","@nestjs/common":"^11.1.29","@nestjs/config":"^3.3.0","@azure/identity":"^4.13.1","class-validator":"^0.14.4","@azure/msal-node":"^5.5.0","@nestjs/terminus":"^11.0.0","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-fastify":"11.1.29","@modelcontextprotocol/node":"^2.0.0","@modelcontextprotocol/server":"^2.0.0","@modelcontextprotocol/fastify":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://npm.pkg.github.com"},"_hasShrinkwrap":false,"devDependencies":{"nock":"^13.5.6","eslint":"^8.57.1","prettier":"^3.8.3","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^22.19.17","@nestjs/testing":"^11.1.29","@types/supertest":"^6.0.3","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/gpt-image-mcp_0.1.4_1786408622861_0.2520710684057281","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@bioinfornatics/gpt-image-mcp","version":"0.1.5","license":"CECILL-2.1","_id":"@bioinfornatics/gpt-image-mcp@0.1.5","maintainers":[{"name":"bioinfornatics","email":"jonathan@mercier.paris"}],"homepage":"https://github.com/bioinfornatics/gpt-image-mcp#readme","bugs":{"url":"https://github.com/bioinfornatics/gpt-image-mcp/issues"},"bin":{"gpt-image-mcp":"dist/main.js"},"dist":{"shasum":"45212cd274d82934e1b068cb8838e64d9b147d8f","tarball":"https://registry.npmjs.org/@bioinfornatics/gpt-image-mcp/-/gpt-image-mcp-0.1.5.tgz","fileCount":131,"integrity":"sha512-qESozZAPfFZPjSNrOBoPV3WyLFvGJTuQycXWIQ80JumxIx1qR/uoWUGP08JobLZJs4tCp1pkdb+qepsS9IcPKw==","signatures":[{"sig":"MEUCIQCJOU3TDwXGM9wsRZ55uJQ1IcV3aeYtL457We03K6fuvwIgdnBmHK1EVyoouPFyOhOS61CYl5RSLpiLU4WTGxb2iQs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":358956},"engines":{"bun":">=1.1.0","node":">=20"},"gitHead":"fabb9694df67724058c616fb30022fd4a9a914d0","scripts":{"lint":"eslint 'src/**/*.ts' 'test/**/*.ts'","test":"bun test --coverage","build":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json","start":"node dist/main.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts'","prepack":"bun run build","lint:fix":"eslint 'src/**/*.ts' 'test/**/*.ts' --fix","postbuild":"chmod +x dist/main.js","start:dev":"bun run src/main.ts","start:http":"IMAGE_MCP_TRANSPORT=http bun run src/main.ts","test:watch":"bun test --watch","type-check":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json --noEmit","auth:doctor":"bun run src/cli/auth-doctor.ts","publish:dry":"npm pack --dry-run","start:stdio":"IMAGE_MCP_TRANSPORT=stdio bun run src/main.ts","quality-gate":"bash bin/quality-gate.sh","secret:store":"bun run src/cli/store-secret.ts","secret:delete":"bun run src/cli/store-secret.ts","test:coverage":"bun test --coverage","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","prepublishOnly":"bun test && bun run build"},"_npmUser":{"name":"bioinfornatics","email":"jonathan@mercier.paris"},"overrides":{"lodash":"^4.18.1","multer":"^2.2.0","js-yaml":"^4.3.0","file-type":"^21.3.2","form-data":"^4.0.6","find-my-way":"^9.7.0","brace-expansion":"^1.1.17","@hono/node-server":"^2.1.0"},"repository":{"url":"git+https://github.com/bioinfornatics/gpt-image-mcp.git","type":"git"},"_npmVersion":"10.9.7","description":"MCP server for AI image generation via OpenAI and Azure OpenAI gpt-image-* models","directories":{},"_nodeVersion":"22.22.2","dependencies":{"joi":"^17.13.3","zod":"^4.2.0","jose":"^6.2.8","rxjs":"^7.8.2","openai":"^4.104.0","fastify":"^5.11.3","winston":"^3.19.0","prom-client":"^15.1.3","@nestjs/core":"^11.1.29","@nestjs/common":"^11.1.29","@nestjs/config":"^3.3.0","@azure/identity":"^4.13.1","class-validator":"^0.14.4","@azure/msal-node":"^5.5.0","@nestjs/terminus":"^11.0.0","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-fastify":"11.1.29","@modelcontextprotocol/node":"^2.0.0","@modelcontextprotocol/server":"^2.0.0","@modelcontextprotocol/fastify":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"nock":"^13.5.6","eslint":"^8.57.1","prettier":"^3.8.3","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^22.19.17","@nestjs/testing":"^11.1.29","@types/supertest":"^6.0.3","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/gpt-image-mcp_0.1.5_1787164720001_0.3096990971100362","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@bioinfornatics/gpt-image-mcp","version":"0.1.6","license":"CECILL-2.1","_id":"@bioinfornatics/gpt-image-mcp@0.1.6","maintainers":[{"name":"bioinfornatics","email":"jonathan@mercier.paris"}],"homepage":"https://github.com/bioinfornatics/gpt-image-mcp#readme","bugs":{"url":"https://github.com/bioinfornatics/gpt-image-mcp/issues"},"bin":{"gpt-image-mcp":"dist/main.js"},"dist":{"shasum":"bd485dc29945bd5332c9735a8f6ff57d870e0fea","tarball":"https://registry.npmjs.org/@bioinfornatics/gpt-image-mcp/-/gpt-image-mcp-0.1.6.tgz","fileCount":131,"integrity":"sha512-l9MyZPQJ4QIRk4/JSCdC3jV+PS+0VnzZ4wBdMLpXTHokeai6NYG9PSLpC0zwTfT60k+++GFFAyYt34LlIpBulQ==","signatures":[{"sig":"MEYCIQCgN4TI0xXYmuY8QgXyC6gvB3x/1OUm175Hj23eDNPF+AIhAM797SJK+S0jdVbETKLRdHhX0kOfj7xbQxz2rvIkLIlF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":361613},"engines":{"bun":">=1.1.0","node":">=20"},"gitHead":"a53c35fd8d9f643ba6e38dc742cb1189b49c4946","scripts":{"lint":"eslint 'src/**/*.ts' 'test/**/*.ts'","test":"bun test --coverage","build":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json","start":"node dist/main.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts'","prepack":"bun run build","lint:fix":"eslint 'src/**/*.ts' 'test/**/*.ts' --fix","postbuild":"chmod +x dist/main.js","start:dev":"bun run src/main.ts","start:http":"IMAGE_MCP_TRANSPORT=http bun run src/main.ts","test:watch":"bun test --watch","type-check":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json --noEmit","auth:doctor":"bun run src/cli/auth-doctor.ts","publish:dry":"npm pack --dry-run","start:stdio":"IMAGE_MCP_TRANSPORT=stdio bun run src/main.ts","quality-gate":"bash bin/quality-gate.sh","secret:store":"bun run src/cli/store-secret.ts","secret:delete":"bun run src/cli/store-secret.ts","test:coverage":"bun test --coverage","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","prepublishOnly":"bun test && bun run build"},"_npmUser":{"name":"bioinfornatics","email":"jonathan@mercier.paris"},"overrides":{"lodash":"^4.18.1","multer":"^2.2.0","js-yaml":"^4.3.0","file-type":"^21.3.2","form-data":"^4.0.6","find-my-way":"^9.7.0","brace-expansion":"^1.1.17","@hono/node-server":"^2.1.0"},"repository":{"url":"git+https://github.com/bioinfornatics/gpt-image-mcp.git","type":"git"},"_npmVersion":"10.9.7","description":"MCP server for AI image generation via OpenAI and Azure OpenAI gpt-image-* models","directories":{},"_nodeVersion":"22.22.2","dependencies":{"joi":"^17.13.3","zod":"^4.2.0","jose":"^6.2.8","rxjs":"^7.8.2","openai":"^4.104.0","fastify":"^5.11.3","winston":"^3.19.0","prom-client":"^15.1.3","@nestjs/core":"^11.1.29","@nestjs/common":"^11.1.29","@nestjs/config":"^3.3.0","@azure/identity":"^4.13.1","class-validator":"^0.14.4","@azure/msal-node":"^5.5.0","@nestjs/terminus":"^11.0.0","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-fastify":"11.1.29","@modelcontextprotocol/node":"^2.0.0","@modelcontextprotocol/server":"^2.0.0","@modelcontextprotocol/fastify":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"nock":"^13.5.6","eslint":"^8.57.1","prettier":"^3.8.3","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^22.19.17","@nestjs/testing":"^11.1.29","@types/supertest":"^6.0.3","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/gpt-image-mcp_0.1.6_1787166370999_0.7229012591785557","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@bioinfornatics/gpt-image-mcp","version":"0.1.7","description":"MCP server for AI image generation via OpenAI and Azure OpenAI gpt-image-* models","license":"CECILL-2.1","repository":{"type":"git","url":"git+https://github.com/bioinfornatics/gpt-image-mcp.git"},"publishConfig":{"registry":"https://registry.npmjs.org","access":"public"},"bin":{"gpt-image-mcp":"dist/main.js"},"scripts":{"build":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json","postbuild":"chmod +x dist/main.js","prepack":"bun run build","start":"node dist/main.js","start:dev":"bun run src/main.ts","start:http":"IMAGE_MCP_TRANSPORT=http bun run src/main.ts","start:stdio":"IMAGE_MCP_TRANSPORT=stdio bun run src/main.ts","quality-gate":"bash bin/quality-gate.sh","test":"bun test --coverage","test:watch":"bun test --watch","test:coverage":"bun test --coverage","lint":"eslint 'src/**/*.ts' 'test/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'test/**/*.ts' --fix","type-check":"node --max-old-space-size=8192 ./node_modules/typescript/bin/tsc -p tsconfig.build.json --noEmit","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts'","secret:store":"bun run src/cli/store-secret.ts","secret:delete":"bun run src/cli/store-secret.ts","auth:doctor":"bun run src/cli/auth-doctor.ts","prepublishOnly":"bun test && bun run build","publish:dry":"npm pack --dry-run","version:patch":"npm version patch --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:major":"npm version major --no-git-tag-version"},"dependencies":{"@azure/identity":"^4.13.1","@azure/msal-node":"^5.5.0","@modelcontextprotocol/fastify":"^2.0.0","@modelcontextprotocol/node":"^2.0.0","@modelcontextprotocol/server":"^2.0.0","@nestjs/common":"^11.1.29","@nestjs/config":"^3.3.0","@nestjs/core":"^11.1.29","@nestjs/platform-fastify":"11.1.29","@nestjs/terminus":"^11.0.0","class-transformer":"^0.5.1","class-validator":"^0.14.4","fastify":"^5.11.3","joi":"^17.13.3","jose":"^6.2.8","openai":"^4.104.0","prom-client":"^15.1.3","reflect-metadata":"^0.2.2","rxjs":"^7.8.2","winston":"^3.19.0","zod":"^4.2.0"},"optionalDependencies":{"keytar":"^7.9.0"},"devDependencies":{"@nestjs/testing":"^11.1.29","@types/node":"^22.19.17","@types/supertest":"^6.0.3","@typescript-eslint/eslint-plugin":"^7.18.0","@typescript-eslint/parser":"^7.18.0","eslint":"^8.57.1","nock":"^13.5.6","prettier":"^3.8.3","supertest":"^7.2.2","typescript":"^5.9.3"},"engines":{"bun":">=1.1.0","node":">=20"},"overrides":{"multer":"^2.2.0","lodash":"^4.18.1","file-type":"^21.3.2","form-data":"^4.0.6","find-my-way":"^9.7.0","js-yaml":"^4.3.0","brace-expansion":"^1.1.17","@hono/node-server":"^2.1.0"},"_id":"@bioinfornatics/gpt-image-mcp@0.1.7","gitHead":"734f6ecb1734387b4ad37308373d35dbdd9b375c","bugs":{"url":"https://github.com/bioinfornatics/gpt-image-mcp/issues"},"homepage":"https://github.com/bioinfornatics/gpt-image-mcp#readme","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-6sRZGbDVIO1DxPdYDQE4FwDuLHu+lLlOGwpNO6Vp4WSSi6a+4uUfue5dvXqDhQSUoaRozuPizjawEbWTPoRXDA==","shasum":"6a1be1bf235511f1662c1f954d59d12641dbc555","tarball":"https://registry.npmjs.org/@bioinfornatics/gpt-image-mcp/-/gpt-image-mcp-0.1.7.tgz","fileCount":133,"unpackedSize":363969,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDmVG71iY3nz1wUJlKyywYkQT5dCqDff22/qWPGzqE7qgIhAI1i7o2U5AzYq6wB4SWGoBdEDjJxCX/KIOHpaYnzAifw"}]},"_npmUser":{"name":"bioinfornatics","email":"jonathan@mercier.paris"},"directories":{},"maintainers":[{"name":"bioinfornatics","email":"jonathan@mercier.paris"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/gpt-image-mcp_0.1.7_1787166830887_0.557133050490896"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-29T18:07:00.362Z","modified":"2026-08-19T19:13:51.289Z","0.0.2":"2026-04-29T18:07:00.611Z","0.1.1":"2026-08-10T16:20:59.807Z","0.1.2":"2026-08-10T17:36:56.600Z","0.1.3":"2026-08-10T23:50:17.018Z","0.1.4":"2026-08-11T00:37:03.026Z","0.1.5":"2026-08-19T18:38:40.148Z","0.1.6":"2026-08-19T19:06:11.183Z","0.1.7":"2026-08-19T19:13:51.127Z"},"bugs":{"url":"https://github.com/bioinfornatics/gpt-image-mcp/issues"},"license":"CECILL-2.1","homepage":"https://github.com/bioinfornatics/gpt-image-mcp#readme","repository":{"type":"git","url":"git+https://github.com/bioinfornatics/gpt-image-mcp.git"},"description":"MCP server for AI image generation via OpenAI and Azure OpenAI gpt-image-* models","maintainers":[{"name":"bioinfornatics","email":"jonathan@mercier.paris"}],"readme":"# gpt-image-mcp\n\n> **MCP server** for AI image generation via **OpenAI** and **Azure OpenAI** gpt-image-* models.  \n> Built with **Bun + NestJS** · **Streamable HTTP + stdio** transports · **305 tests, 92 % coverage**\n\n---\n\n## Features\n\n| Capability | Detail |\n|-----------|--------|\n| 🖼️ **image_generate** | Text → image with all gpt-image-* models |\n| ✏️ **image_edit** | Inpainting with optional mask (up to 16 input images) |\n| 🔀 **image_variation** | dall-e-2 variations (dall-e-2 only) |\n| 🔍 **provider_list / validate** | Connectivity check without generating an image |\n| ⚡ **MCP Elicitation** | Interactive parameter refinement (quality, size) |\n| 🧠 **MCP Sampling** | Prompt enhancement via client LLM |\n| 💾 **MCP Roots** | Save images directly to your workspace |\n| 🔒 **Security** | Bearer-token auth, rate limiting, secret masking, path traversal prevention |\n| 📊 **Observability** | Prometheus `/metrics`, `/health/live`, `/health/ready` |\n\n---\n\n## Quick Start\n\n### Prerequisites\n\n- [Bun](https://bun.sh) ≥ 1.1 **or** Node.js ≥ 18 **or** Docker\n- An OpenAI API key **or** Azure OpenAI resource\n\n---\n\n### Option A — Zero-install with `bunx` (recommended)\n\n```bash\n# stdio transport (Claude Desktop, Goose, Cursor)\nIMAGE_PROVIDER=openai IMAGE_API_KEY=sk-... IMAGE_MCP_TRANSPORT=stdio bunx @bioinfornatics/gpt-image-mcp\n\n# HTTP transport on port 3000\nIMAGE_PROVIDER=openai IMAGE_API_KEY=sk-... IMAGE_MCP_TRANSPORT=http IMAGE_PORT=3000 bunx @bioinfornatics/gpt-image-mcp\n\n# Azure AI Foundry\nIMAGE_PROVIDER=azure \\\n  IMAGE_BASE_URL=https://my-resource.openai.azure.com \\\n  IMAGE_API_KEY=... \\\n  IMAGE_DEPLOYMENT=gpt-image-2 \\\n  bunx @bioinfornatics/gpt-image-mcp\n```\n\n**With `npx` (Node.js users):**\n\n```bash\nIMAGE_PROVIDER=openai IMAGE_API_KEY=sk-... IMAGE_MCP_TRANSPORT=stdio npx @bioinfornatics/gpt-image-mcp\n```\n\n### Repeated launches and port reuse\n\n- **Goose and other local MCP hosts should use `stdio`.** Each host launch gets its own pipe-backed process and never binds the shared HTTP port. The packaged command should set `IMAGE_MCP_TRANSPORT=stdio`; the local `bin/start.sh` also defaults to `stdio` when it is omitted.\n- **HTTP is a persistent, multi-client server.** Start it once and configure Goose with a `streamable_http` URI. If the HTTP command is run again with the same host and port, it probes `/health/live`: a compatible `gpt-image-mcp` listener is reused and the duplicate process exits successfully. An unrelated listener still produces a port conflict rather than being mistaken for this server.\n\n---\n\n### Option B — Install globally\n\n```bash\nbun add -g @bioinfornatics/gpt-image-mcp\nIMAGE_PROVIDER=openai IMAGE_API_KEY=sk-... gpt-image-mcp\n```\n\n---\n\n### Option C — Clone & run from source\n\n```bash\ngit clone https://github.com/bioinfornatics/gpt-image-mcp\ncd gpt-image-mcp\nbun install\ncp .env.example .env   # then edit with your keys\n\nbun run start:http     # HTTP on :3000\nbun run start:stdio    # stdio\n```\n\n---\n\n### Option D — Docker\n\n```bash\ndocker build -t gpt-image-mcp .\n\ndocker run -p 3000:3000 \\\n  -e IMAGE_PROVIDER=openai \\\n  -e IMAGE_API_KEY=sk-... \\\n  gpt-image-mcp\n```\n\n---\n\n## Configuration\n\nAzure users can choose among **API key**, **Azure CLI**, and **Microsoft Entra OBO**. Start with the [authentication decision guide](docs/authentication/README.md).\n\n| Variable | Required | Default | Description |\n|----------|----------|---------|-------------|\n| `IMAGE_PROVIDER` | ✅ | — | `openai`, `azure`, `together`, or `custom` |\n| `IMAGE_API_KEY` | Conditional | — | API key for OpenAI/Together and Azure `api_key` mode |\n| `IMAGE_AZURE_AUTH_MODE` | Azure only | inferred from existing key | `api_key`, `azure_cli`, or `on_behalf_of` |\n| `IMAGE_AZURE_TENANT_ID` | ❌ | active CLI tenant | Optional tenant for `azure_cli` |\n| `IMAGE_MCP_AUTH_MODE` | ❌ | transport-sensitive | `none`, `static_bearer`, or `entra`; OBO requires `entra` |\n| `IMAGE_ENTRA_TENANT_ID` | OBO | — | Trusted Entra tenant |\n| `IMAGE_ENTRA_CLIENT_ID` | OBO | — | MCP server app registration ID |\n| `IMAGE_ENTRA_AUDIENCE` | OBO | — | Exact MCP API token audience |\n| `IMAGE_ENTRA_SCOPE` | OBO | `mcp.access` | Required delegated scope |\n| `IMAGE_ENTRA_ALLOWED_CLIENT_IDS` | ❌ | all | Comma-separated allowed OAuth clients |\n| `IMAGE_ENTRA_CLIENT_SECRET` | Current OBO baseline | — | Confidential credential; use a secure secret source |\n| `IMAGE_BASE_URL` | ✅ if `azure`/`custom` | `https://api.openai.com/v1` | Provider endpoint (Azure resource URL or custom OpenAI-compatible URL) |\n| `IMAGE_DEPLOYMENT` | ✅ if `azure` | — | Azure deployment name |\n| `IMAGE_API_VERSION` | ❌ | `2025-04-01-preview` | Azure API version |\n| `IMAGE_MODELS` | ❌ | `custom` | Comma-separated model list (custom provider only) |\n| `IMAGE_DEFAULT_MODEL` | ❌ | `gpt-image-2` | Default model (override per-request via tool param) |\n| `IMAGE_MCP_TRANSPORT` | ❌ | `http` | `http` or `stdio` |\n| `IMAGE_HTTP_HOST` | ❌ | `127.0.0.1` | HTTP bind address |\n| `IMAGE_PORT` | ❌ | `3000` | HTTP listen port |\n| `IMAGE_HTTP_ALLOWED_HOSTS` | ❌ | localhost addresses | Comma-separated hostnames accepted by MCP Fastify DNS-rebinding protection |\n| `IMAGE_HTTP_ALLOWED_ORIGINS` | ❌ | localhost addresses | Comma-separated browser origin hostnames |\n| `IMAGE_MCP_API_KEY` | ❌ | — | Bearer token to protect `/mcp` |\n| `IMAGE_USE_ELICITATION` | ❌ | `true` | Enable MCP Elicitation |\n| `IMAGE_USE_SAMPLING` | ❌ | `true` | Enable MCP Sampling |\n| `IMAGE_MAX_REQUESTS_PER_MINUTE` | ❌ | `60` | Rate limit per client |\n| `IMAGE_OUTPUT_DIR` | ❌ | OS Pictures directory | Override the directory where every generated image is persisted |\n| `IMAGE_LOG_LEVEL` | ❌ | `info` | `debug`/`info`/`warn`/`error` |\n\nEvery generated, edited, or variation image is returned as native MCP image content and persisted automatically. The default directory is the freedesktop `XDG_PICTURES_DIR/gpt-image-mcp` on Linux (falling back to `~/Images/gpt-image-mcp`), `~/Pictures/gpt-image-mcp` on macOS, and `%USERPROFILE%\\\\Pictures\\\\gpt-image-mcp` on Windows. `save_to_workspace: true` additionally creates a copy in the MCP workspace.\n\n---\n\n## MCP Client Setup\n\nPrefer CLI arguments for non-secret runtime settings (`--base-url`, `--foundry-project-endpoint`,\n`--deployment`, `--transport`). A canonical `https://<resource>.services.ai.azure.com` base URL\ninfers `--provider azure` when no provider is explicitly configured. The hostname contains the\nFoundry resource/account name—not the Azure resource-group or project name—so the project endpoint\ncannot be derived and remains explicit. Keep only secrets in `env_keys` or `*_FILE` variables. For Azure, `--deployment` already defines the runtime default; do not duplicate\nit with `IMAGE_DEFAULT_MODEL`. API versions are adapter-owned unless a legacy endpoint explicitly\nrequires an override. `IMAGE_LOG_LEVEL` defaults to `info` and may be omitted.\n\n### Claude Desktop\n\n`~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) — `%APPDATA%\\Claude\\claude_desktop_config.json` (Windows):\n\n```json\n{\n  \"mcpServers\": {\n    \"gpt-image-mcp\": {\n      \"command\": \"bunx\",\n      \"args\": [\"@bioinfornatics/gpt-image-mcp\"],\n      \"env\": {\n        \"IMAGE_PROVIDER\": \"openai\",\n        \"IMAGE_API_KEY\": \"sk-...\",\n        \"IMAGE_MCP_TRANSPORT\": \"stdio\",\n        \"IMAGE_LOG_LEVEL\": \"error\"\n      }\n    }\n  }\n}\n```\n\n### Goose\n\nFor a copy-paste `npx` setup on Linux, macOS, or Windows, including secrets, Azure, first-run verification, output paths, and troubleshooting, see **[Use gpt-image-mcp with Goose](docs/HOWTO_GOOSE.md)**.\n\nAdd to `~/.config/goose/config.yaml` under `extensions:`:\n\n**OpenAI:**\n```yaml\nextensions:\n  gptimagemcp:\n    enabled: true\n    type: stdio\n    name: GPT Image MCP\n    description: AI image generation — gpt-image-1 via OpenAI\n    cmd: npx\n    args:\n      - \"--yes\"\n      - \"@bioinfornatics/gpt-image-mcp@0.1.7\"\n      - --provider\n      - openai\n      - --transport\n      - stdio\n    env_keys:\n      - IMAGE_API_KEY        # set via `goose configure`; a plain shell `export` alone does not populate Goose's keyring/env_keys\n    timeout: 300\n```\n\n**Azure AI Foundry:**\n```yaml\nextensions:\n  gptimagemcp:\n    enabled: true\n    type: stdio\n    name: GPT Image MCP\n    description: AI image generation — gpt-image-2 via Azure AI Foundry\n    cmd: npx\n    args:\n      - \"--yes\"\n      - \"@bioinfornatics/gpt-image-mcp@0.1.7\"\n      - --provider\n      - azure\n      - --base-url\n      - https://my-resource.services.ai.azure.com\n      - --foundry-project-endpoint\n      - https://my-resource.services.ai.azure.com/api/projects/my-project\n      - --deployment\n      - MAI-Image-2.5\n      - --transport\n      - stdio\n    env_keys:\n      - IMAGE_API_KEY\n    timeout: 300\n```\n\n> See [`examples/goose-config.yaml`](examples/goose-config.yaml) for all options including HTTP transport and local development.\n\n### HTTP / Remote Client\n\n```\nPOST http://localhost:3000/mcp\nAccept: application/json, text/event-stream\nContent-Type: application/json\nAuthorization: Bearer <IMAGE_MCP_API_KEY>   # only if IMAGE_MCP_API_KEY is set\n\n{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"image_generate\",\"arguments\":{\"prompt\":\"a cat\"}}}\n```\n\n---\n\n## Available Models\n\n> **As of April 23, 2026** — model landscape has changed significantly. dall-e-3 was retired.\n\n### OpenAI (`IMAGE_PROVIDER=openai`)\n\n| Model | Status | Sizes | Best for |\n|-------|--------|-------|----------|\n| `gpt-image-2` | ✅ **Default · Recommended** | Arbitrary up to 4K (multiples of 16 px, ≤ 3:1 ratio) | Production — best quality, 4K, flexible resolution |\n| `gpt-image-1.5` | ✅ Available | `1024×1024`, `1024×1536`, `1536×1024` | Compatibility / migration |\n| `gpt-image-1-mini` | ✅ Available | `1024×1024`, `1024×1536`, `1536×1024` | High-volume, cost-sensitive pipelines |\n| `gpt-image-1` | ✅ Available | `1024×1024`, `1024×1536`, `1536×1024` | Legacy workflows |\n| `dall-e-2` | ⚠️ Variations only | `256×256`, `512×512`, `1024×1024` | Image variations endpoint only |\n| ~~`dall-e-3`~~ | ⛔ **Retired 2026-03-04** | — | No longer available |\n\n### Azure AI Foundry (`IMAGE_PROVIDER=azure`)\n\n| Model | Status | Notes |\n|-------|--------|-------|\n| `gpt-image-2` | ✅ **Available · No access application needed** | Arbitrary resolution up to 4K. |\n| `gpt-image-1.5` | ⚠️ Limited Access | Apply at [aka.ms/oai/gptimage1.5access](https://aka.ms/oai/gptimage1.5access) |\n| `gpt-image-1-mini` | ⚠️ Limited Access | Apply at [aka.ms/oai/gptimage1access](https://aka.ms/oai/gptimage1access) |\n| `gpt-image-1` | ⚠️ Limited Access | Apply at [aka.ms/oai/gptimage1access](https://aka.ms/oai/gptimage1access) |\n| ~~`dall-e-3`~~ | ⛔ **Retired 2026-03-04** | Existing deployments are non-functional |\n\n> 💡 **Azure users:** `gpt-image-2` is the easiest to start with — it requires no prior access approval today.  \n> A 403 for gpt-image-1.x means you need to register at the links above.\n>\n> ℹ️ IMAGE_DEPLOYMENT selects the Azure default. The same server routes explicit MAI-Image-2.5 and gpt-image-2 requests to their respective adapters. See docs/authentication/TROUBLESHOOTING.md.\n\n---\n\n## gpt-image-2 Highlights\n\n`gpt-image-2` (released **April 21, 2026**) is the flagship model and the recommended default:\n\n| Feature | Detail |\n|---------|--------|\n| **Resolution** | Arbitrary — both edges must be multiples of **16 px**, max edge **3840 px (4K)**, max ratio **3:1**, pixel range **655 360 – 8 294 400** |\n| **Quality** | `low` · `medium` · `high` · `auto` |\n| **Output formats** | `png` (with transparency), `webp` (with transparency + compression), `jpeg` (compression) |\n| **Background** | `transparent` · `opaque` · `auto` |\n| **Images per request** | 1 – 10 (`n` parameter) |\n| **Prompt length** | Up to **32 000 characters** |\n| **Image editing inputs** | Up to **16 images** per edit request |\n| **Streaming** | ✅ `stream: true`, `partial_images: 0–3` |\n| **Variations** | ❌ Not supported (use `dall-e-2` for variations) |\n| **Text rendering** | ✅ Excellent — infographics, banners, labels |\n| **Photorealism** | ✅ Best-in-class — use keyword `photorealistic` in prompt |\n\n**Popular resolution examples for gpt-image-2:**\n\n| Use case | Resolution |\n|----------|-----------|\n| Square (general) | `1024×1024` |\n| Portrait | `1024×1536` |\n| Landscape | `1536×1024` |\n| Widescreen / slides | `1536×864` |\n| 2K / QHD _(reliability limit)_ | `2560×1440` |\n| 4K / UHD _(experimental)_ | `3840×2160` |\n\n---\n\n## Tools Reference\n\n### `image_generate`\n\n```json\n{\n  \"prompt\": \"A serene Japanese garden at dawn, photorealistic\",\n  \"model\": \"gpt-image-2\",\n  \"n\": 1,\n  \"size\": \"1536×1024\",\n  \"quality\": \"high\",\n  \"background\": \"transparent\",\n  \"output_format\": \"webp\",\n  \"output_compression\": 85,\n  \"save_to_workspace\": false,\n  \"response_format\": \"markdown\"\n}\n```\n\n### `image_edit`\n\n```json\n{\n  \"image\": \"<base64-encoded-png>\",\n  \"mask\": \"<base64-encoded-mask>\",\n  \"prompt\": \"Add a red hat to the person\",\n  \"model\": \"gpt-image-2\"\n}\n```\n\n### `image_variation`\n\n```json\n{\n  \"image\": \"<base64-encoded-square-png>\",\n  \"n\": 3,\n  \"size\": \"1024×1024\"\n}\n```\n\n> ⚠️ Variations use `dall-e-2` exclusively. Not supported by Azure OpenAI or any gpt-image-* model.\n\n### `provider_validate`\n\n```json\n{ \"provider\": \"openai\" }\n```\n\n---\n\n## Development\n\n```bash\nbun test                  # 305 tests\nbun test --coverage       # with coverage report (≥ 92 %)\nbun run lint              # ESLint\nbun run type-check        # tsc --noEmit\nbun run build             # compile to dist/\n```\n\n### Project Structure\n\n```\nsrc/\n├── config/          # Joi-validated env config + models.ts (LATEST_MODEL)\n├── mcp/\n│   ├── tools/       # 5 MCP tools + Zod schemas\n│   ├── features/    # Elicitation, Sampling, Roots\n│   └── transport/   # HTTP (stateless) + stdio\n├── providers/       # OpenAI + Azure + Together + Custom adapters\n├── security/        # Auth guard, rate limiter, sanitiser\n└── health/          # /health/* + /metrics\ntest/\n├── unit/            # 240+ unit tests (mocked deps)\n└── integration/     # 65+ integration tests (nock + supertest)\n```\n\n---\n\n## Security\n\n- API keys are **never** logged — masked with `***` in all output\n- Input prompts sanitised (null bytes stripped, bidi control chars removed, length enforced)\n- Path traversal prevented when saving to workspace roots\n- Rate limiting: configurable per-client sliding window\n- Optional bearer-token auth on the `/mcp` endpoint\n- Container runs as **non-root** user (`mcpuser`)\n- Trivy vulnerability scan on every CI build\n- `bun audit` dependency audit on every CI build\n\nSee [`docs/SECURITY.md`](docs/SECURITY.md) for full threat model.\n\n---\n\n## Architecture\n\n```\nMCP Client (Claude / Goose / Cursor)\n      │  JSON-RPC 2.0\n      ▼\n  POST /mcp  (Streamable HTTP)\n  or stdio\n      │\n  ┌───┴────────────────────────────────┐\n  │  NestJS Application                │\n  │  ┌──────────┐  ┌────────────────┐  │\n  │  │ 5 Tools  │  │ MCP Features   │  │\n  │  │ schemas  │  │ Elicitation    │  │\n  │  │ Zod val. │  │ Sampling       │  │\n  │  └────┬─────┘  │ Roots          │  │\n  │       │        └────────────────┘  │\n  │  ┌────▼──────────────────────────┐ │\n  │  │  IImageProvider               │ │\n  │  │  OpenAI · Azure · Together    │ │\n  │  │  Custom OpenAI-compatible     │ │\n  │  └────┬──────────────────────────┘ │\n  └───────┼────────────────────────────┘\n          │  HTTPS\n          ▼\n  OpenAI API / Azure OpenAI\n```\n\nSee [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) for C4 diagrams and ADRs.\n\n---\n\n## Contributing\n\n1. Fork → branch → implement with TDD (Red → Green → Refactor)\n2. All PRs must have a failing-test commit before the implementation commit\n3. Coverage must not drop below 90 %\n4. Run `bun run lint && bun run type-check && bun test` before pushing\n\nSee [`docs/TDD_STRATEGY.md`](docs/TDD_STRATEGY.md) for the full TDD workflow.\n\n---\n\n## License\n\n[CeCILL-2.1](./LICENSE) — a French open-source licence compatible with GNU GPL, endorsed by CEA, CNRS, and Inria.  \n© 2026 PhD Jonathan MERCIER\n","readmeFilename":"README.md"}