@agimon-ai/imagine-mcp 0.8.2 → 0.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./stdio-By-VQNao.cjs`);let e=require(`commander`);const t={version:`0.1.0`},n=[{name:`mcp-serve`,description:`Start MCP server with specified transport`,loader:()=>Promise.resolve().then(()=>require(`./commands-BR2T0A9Z.cjs`)).then(e=>e.mcpServeCommand)}];var r=class extends Error{code;recovery;constructor(e,t=`CLI_EXECUTION_FAILED`,n){super(e,n),this.name=`CLIExecutionError`,this.code=t,this.recovery=n?.recovery}},i=class extends Error{code=`COMMAND_LOAD_ERROR`;recovery;commandName;constructor(e,t,n){super(`Failed to load command '${e}': ${t}`,n),this.name=`CommandLoadError`,this.commandName=e,this.recovery=`Check that the command module exists and exports the expected command. Run with --help to see available commands.`}};function a(t){let n=new e.Command(t.name).description(t.description).allowUnknownOption(!0).allowExcessArguments(!0);return n.action(async()=>{let n;try{n=await t.loader()}catch(e){throw e instanceof i?e:new i(t.name,e instanceof Error?e.message:String(e),{cause:e})}let r=process.argv.slice(2);await new e.Command().addCommand(n).parseAsync([`node`,`imagine-mcp`,...r])}),n}async function o(){let o=process.argv[2]??`unknown`;try{let r=new e.Command;r.name(`imagine`).description(`MCP server for AI image generation and manipulation`).version(t.version);for(let e of n)r.addCommand(a(e));await r.parseAsync(process.argv)}catch(e){if(e instanceof r)process.stderr.write(`Error [${e.code}] ${JSON.stringify({command:o,recovery:e.recovery,message:e.message,cause:e.cause instanceof Error?e.cause.message:e.cause})}\n`),e.recovery&&process.stderr.write(`Recovery: ${e.recovery}\n`),e.cause&&process.stderr.write(`Caused by: ${e.cause instanceof Error?e.cause.message:String(e.cause)}\n`);else if(e instanceof i)process.stderr.write(`Error [${e.code}] ${JSON.stringify({command:o,recovery:e.recovery,message:e.message})}\n`),e.recovery&&process.stderr.write(`Recovery: ${e.recovery}\n`),e.cause&&process.stderr.write(`Caused by: ${e.cause instanceof Error?e.cause.message:String(e.cause)}\n`);else{let t=e.code??`CLI_EXECUTION_FAILED`;process.stderr.write(`Error [${t}] ${JSON.stringify({command:o,message:e instanceof Error?e.message:String(e)})}\n`),process.stderr.write(`Recovery: Run with --help for usage information.
2
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./stdio-DJj0hMw8.cjs`);let e=require(`commander`);const t={version:`0.1.0`},n=[{name:`mcp-serve`,description:`Start MCP server with specified transport`,loader:()=>Promise.resolve().then(()=>require(`./commands-YSHB0mVp.cjs`)).then(e=>e.mcpServeCommand)}];var r=class extends Error{code;recovery;constructor(e,t=`CLI_EXECUTION_FAILED`,n){super(e,n),this.name=`CLIExecutionError`,this.code=t,this.recovery=n?.recovery}},i=class extends Error{code=`COMMAND_LOAD_ERROR`;recovery;commandName;constructor(e,t,n){super(`Failed to load command '${e}': ${t}`,n),this.name=`CommandLoadError`,this.commandName=e,this.recovery=`Check that the command module exists and exports the expected command. Run with --help to see available commands.`}};function a(t){let n=new e.Command(t.name).description(t.description).allowUnknownOption(!0).allowExcessArguments(!0);return n.action(async()=>{let n;try{n=await t.loader()}catch(e){throw e instanceof i?e:new i(t.name,e instanceof Error?e.message:String(e),{cause:e})}let r=process.argv.slice(2);await new e.Command().addCommand(n).parseAsync([`node`,`imagine-mcp`,...r])}),n}async function o(){let o=process.argv[2]??`unknown`;try{let r=new e.Command;r.name(`imagine`).description(`MCP server for AI image generation and manipulation`).version(t.version);for(let e of n)r.addCommand(a(e));await r.parseAsync(process.argv)}catch(e){if(e instanceof r)process.stderr.write(`Error [${e.code}] ${JSON.stringify({command:o,recovery:e.recovery,message:e.message,cause:e.cause instanceof Error?e.cause.message:e.cause})}\n`),e.recovery&&process.stderr.write(`Recovery: ${e.recovery}\n`),e.cause&&process.stderr.write(`Caused by: ${e.cause instanceof Error?e.cause.message:String(e.cause)}\n`);else if(e instanceof i)process.stderr.write(`Error [${e.code}] ${JSON.stringify({command:o,recovery:e.recovery,message:e.message})}\n`),e.recovery&&process.stderr.write(`Recovery: ${e.recovery}\n`),e.cause&&process.stderr.write(`Caused by: ${e.cause instanceof Error?e.cause.message:String(e.cause)}\n`);else{let t=e.code??`CLI_EXECUTION_FAILED`;process.stderr.write(`Error [${t}] ${JSON.stringify({command:o,message:e instanceof Error?e.message:String(e)})}\n`),process.stderr.write(`Recovery: Run with --help for usage information.
3
3
  `),e instanceof Error&&e.cause&&process.stderr.write(`Caused by: ${e.cause instanceof Error?e.cause.message:String(e.cause)}\n`)}process.exit(1)}}o(),exports.CLIExecutionError=r,exports.CommandLoadError=i,exports.commandDefinitions=n,exports.createLazyCommand=a;
package/dist/cli.mjs CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{Command as e}from"commander";const t={version:`0.1.0`},n=[{name:`mcp-serve`,description:`Start MCP server with specified transport`,loader:()=>import(`./commands-D43qMydW.mjs`).then(e=>e.mcpServeCommand)}];var r=class extends Error{code;recovery;constructor(e,t=`CLI_EXECUTION_FAILED`,n){super(e,n),this.name=`CLIExecutionError`,this.code=t,this.recovery=n?.recovery}},i=class extends Error{code=`COMMAND_LOAD_ERROR`;recovery;commandName;constructor(e,t,n){super(`Failed to load command '${e}': ${t}`,n),this.name=`CommandLoadError`,this.commandName=e,this.recovery=`Check that the command module exists and exports the expected command. Run with --help to see available commands.`}};function a(t){let n=new e(t.name).description(t.description).allowUnknownOption(!0).allowExcessArguments(!0);return n.action(async()=>{let n;try{n=await t.loader()}catch(e){throw e instanceof i?e:new i(t.name,e instanceof Error?e.message:String(e),{cause:e})}let r=process.argv.slice(2);await new e().addCommand(n).parseAsync([`node`,`imagine-mcp`,...r])}),n}async function o(){let o=process.argv[2]??`unknown`;try{let r=new e;r.name(`imagine`).description(`MCP server for AI image generation and manipulation`).version(t.version);for(let e of n)r.addCommand(a(e));await r.parseAsync(process.argv)}catch(e){if(e instanceof r)process.stderr.write(`Error [${e.code}] ${JSON.stringify({command:o,recovery:e.recovery,message:e.message,cause:e.cause instanceof Error?e.cause.message:e.cause})}\n`),e.recovery&&process.stderr.write(`Recovery: ${e.recovery}\n`),e.cause&&process.stderr.write(`Caused by: ${e.cause instanceof Error?e.cause.message:String(e.cause)}\n`);else if(e instanceof i)process.stderr.write(`Error [${e.code}] ${JSON.stringify({command:o,recovery:e.recovery,message:e.message})}\n`),e.recovery&&process.stderr.write(`Recovery: ${e.recovery}\n`),e.cause&&process.stderr.write(`Caused by: ${e.cause instanceof Error?e.cause.message:String(e.cause)}\n`);else{let t=e.code??`CLI_EXECUTION_FAILED`;process.stderr.write(`Error [${t}] ${JSON.stringify({command:o,message:e instanceof Error?e.message:String(e)})}\n`),process.stderr.write(`Recovery: Run with --help for usage information.
2
+ import{Command as e}from"commander";const t={version:`0.1.0`},n=[{name:`mcp-serve`,description:`Start MCP server with specified transport`,loader:()=>import(`./commands-D73fMnhh.mjs`).then(e=>e.mcpServeCommand)}];var r=class extends Error{code;recovery;constructor(e,t=`CLI_EXECUTION_FAILED`,n){super(e,n),this.name=`CLIExecutionError`,this.code=t,this.recovery=n?.recovery}},i=class extends Error{code=`COMMAND_LOAD_ERROR`;recovery;commandName;constructor(e,t,n){super(`Failed to load command '${e}': ${t}`,n),this.name=`CommandLoadError`,this.commandName=e,this.recovery=`Check that the command module exists and exports the expected command. Run with --help to see available commands.`}};function a(t){let n=new e(t.name).description(t.description).allowUnknownOption(!0).allowExcessArguments(!0);return n.action(async()=>{let n;try{n=await t.loader()}catch(e){throw e instanceof i?e:new i(t.name,e instanceof Error?e.message:String(e),{cause:e})}let r=process.argv.slice(2);await new e().addCommand(n).parseAsync([`node`,`imagine-mcp`,...r])}),n}async function o(){let o=process.argv[2]??`unknown`;try{let r=new e;r.name(`imagine`).description(`MCP server for AI image generation and manipulation`).version(t.version);for(let e of n)r.addCommand(a(e));await r.parseAsync(process.argv)}catch(e){if(e instanceof r)process.stderr.write(`Error [${e.code}] ${JSON.stringify({command:o,recovery:e.recovery,message:e.message,cause:e.cause instanceof Error?e.cause.message:e.cause})}\n`),e.recovery&&process.stderr.write(`Recovery: ${e.recovery}\n`),e.cause&&process.stderr.write(`Caused by: ${e.cause instanceof Error?e.cause.message:String(e.cause)}\n`);else if(e instanceof i)process.stderr.write(`Error [${e.code}] ${JSON.stringify({command:o,recovery:e.recovery,message:e.message})}\n`),e.recovery&&process.stderr.write(`Recovery: ${e.recovery}\n`),e.cause&&process.stderr.write(`Caused by: ${e.cause instanceof Error?e.cause.message:String(e.cause)}\n`);else{let t=e.code??`CLI_EXECUTION_FAILED`;process.stderr.write(`Error [${t}] ${JSON.stringify({command:o,message:e instanceof Error?e.message:String(e)})}\n`),process.stderr.write(`Recovery: Run with --help for usage information.
3
3
  `),e instanceof Error&&e.cause&&process.stderr.write(`Caused by: ${e.cause instanceof Error?e.cause.message:String(e.cause)}\n`)}process.exit(1)}}o();export{r as CLIExecutionError,i as CommandLoadError,n as commandDefinitions,a as createLazyCommand};
@@ -0,0 +1 @@
1
+ import{i as e,n as t,r as n,t as r}from"./stdio-BLp8KDWd.mjs";import{existsSync as i}from"node:fs";import a from"node:path";import{Command as o}from"commander";import{DEFAULT_PORT_RANGE as s,PortRegistryService as c}from"@agimon-ai/foundation-port-registry";import{createProcessLease as l}from"@agimon-ai/foundation-process-registry";const u=[`pnpm-workspace.yaml`,`nx.json`,`.git`],d=`tool`,f=process.env.NODE_ENV||`development`,p=process.env.MCP_HOST||`localhost`;function m(e=process.cwd()){let t=a.resolve(e);for(;;){for(let e of u)if(i(a.join(t,e)))return t;let e=a.dirname(t);if(e===t)return process.cwd();t=e}}function h(){return new c(process.env.PORT_REGISTRY_PATH)}function g(e){if(typeof e==`number`)return Number.isInteger(e)&&e>0&&e<=65535?e:void 0;if(typeof e==`string`&&e.trim().length>0){let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0&&t<=65535?t:void 0}}async function _(e,t,n,r){let i=h(),a=r??s.min,o=r?{min:r,max:Math.max(s.max,r)}:s,c=await i.reservePort({repositoryPath:e,serviceName:t,serviceType:d,environment:f,preferredPort:a,portRange:o,pid:process.pid,host:p,force:!0,metadata:{transport:n}});if(!c.success||!c.record)throw Error(c.error||`Failed to reserve port for ${t}`);let l=!1;return{port:c.record.port,release:async()=>{if(l)return;l=!0;let n=await i.releasePort({repositoryPath:e,serviceName:t,serviceType:d,environment:f,pid:process.pid});if(!n.success&&!n.error?.includes(`No matching registry entry`))throw Error(n.error||`Failed to release port for ${t}`)}}}async function v(e){for(let t of e)t&&await t.release()}async function y(e,t){await e.start();let n=async n=>{process.stderr.write(`\nReceived ${n}, shutting down gracefully...\n`);let r;try{await e.stop()}catch(e){r=e}try{await t?.()}catch(e){r??=e}r&&(process.stderr.write(`Error during shutdown: ${r instanceof Error?r.message:String(r)}\n`),process.exit(1)),process.exit(0)};process.on(`SIGINT`,()=>n(`SIGINT`)),process.on(`SIGTERM`,()=>n(`SIGTERM`))}const b=new o(`mcp-serve`).description(`Start MCP server with specified transport`).option(`-t, --type <type>`,`Transport type: stdio, http, or sse`,`stdio`).option(`-p, --port <port>`,`Port to listen on (http/sse only)`,e=>Number.parseInt(e,10)).option(`--host <host>`,`Host to bind to (http/sse only)`,`localhost`).action(async i=>{let a,o;try{let s=i.type.toLowerCase(),c=m(process.cwd());if(s===`stdio`){let t=new r(e());o=await l({repositoryPath:c,serviceName:`imagine-mcp-stdio`,pid:process.pid,metadata:{transport:`stdio`}}),await y(t,async()=>{await o?.release()})}else s===`http`?(a=await _(c,`imagine-mcp-http`,`http`,g(i.port)??g(process.env.MCP_PORT)),o=await l({repositoryPath:c,serviceName:`imagine-mcp-http`,pid:process.pid,metadata:{transport:`http`},port:a.port,host:i.host||p,command:process.argv[1],args:process.argv.slice(2)}),await y(new n(()=>e(),{mode:`http`,port:a.port,host:i.host||p}),async()=>{await v([o,a])})):s===`sse`?(a=await _(c,`imagine-mcp-sse`,`sse`,g(i.port)??g(process.env.MCP_PORT)),o=await l({repositoryPath:c,serviceName:`imagine-mcp-sse`,pid:process.pid,metadata:{transport:`sse`},port:a.port,host:i.host||p,command:process.argv[1],args:process.argv.slice(2)}),await y(new t(()=>e(),{mode:`sse`,port:a.port,host:i.host||p}),async()=>{await v([o,a])})):(process.stderr.write(`Unknown transport type: ${s}. Use: stdio, http, or sse\n`),process.exit(1))}catch(e){await v([o,a]).catch(()=>void 0),process.stderr.write(`Failed to start MCP server: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}});export{b as mcpServeCommand};
@@ -0,0 +1 @@
1
+ const e=require(`./stdio-DJj0hMw8.cjs`);let t=require(`node:fs`),n=require(`node:path`);n=e.s(n,1);let r=require(`commander`),i=require(`@agimon-ai/foundation-port-registry`),a=require(`@agimon-ai/foundation-process-registry`);const o=[`pnpm-workspace.yaml`,`nx.json`,`.git`],s=`tool`,c=process.env.NODE_ENV||`development`,l=process.env.MCP_HOST||`localhost`;function u(e=process.cwd()){let r=n.default.resolve(e);for(;;){for(let e of o)if((0,t.existsSync)(n.default.join(r,e)))return r;let e=n.default.dirname(r);if(e===r)return process.cwd();r=e}}function d(){return new i.PortRegistryService(process.env.PORT_REGISTRY_PATH)}function f(e){if(typeof e==`number`)return Number.isInteger(e)&&e>0&&e<=65535?e:void 0;if(typeof e==`string`&&e.trim().length>0){let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0&&t<=65535?t:void 0}}async function p(e,t,n,r){let a=d(),o=r??i.DEFAULT_PORT_RANGE.min,u=r?{min:r,max:Math.max(i.DEFAULT_PORT_RANGE.max,r)}:i.DEFAULT_PORT_RANGE,f=await a.reservePort({repositoryPath:e,serviceName:t,serviceType:s,environment:c,preferredPort:o,portRange:u,pid:process.pid,host:l,force:!0,metadata:{transport:n}});if(!f.success||!f.record)throw Error(f.error||`Failed to reserve port for ${t}`);let p=!1;return{port:f.record.port,release:async()=>{if(p)return;p=!0;let n=await a.releasePort({repositoryPath:e,serviceName:t,serviceType:s,environment:c,pid:process.pid});if(!n.success&&!n.error?.includes(`No matching registry entry`))throw Error(n.error||`Failed to release port for ${t}`)}}}async function m(e){for(let t of e)t&&await t.release()}async function h(e,t){await e.start();let n=async n=>{process.stderr.write(`\nReceived ${n}, shutting down gracefully...\n`);let r;try{await e.stop()}catch(e){r=e}try{await t?.()}catch(e){r??=e}r&&(process.stderr.write(`Error during shutdown: ${r instanceof Error?r.message:String(r)}\n`),process.exit(1)),process.exit(0)};process.on(`SIGINT`,()=>n(`SIGINT`)),process.on(`SIGTERM`,()=>n(`SIGTERM`))}const g=new r.Command(`mcp-serve`).description(`Start MCP server with specified transport`).option(`-t, --type <type>`,`Transport type: stdio, http, or sse`,`stdio`).option(`-p, --port <port>`,`Port to listen on (http/sse only)`,e=>Number.parseInt(e,10)).option(`--host <host>`,`Host to bind to (http/sse only)`,`localhost`).action(async t=>{let n,r;try{let i=t.type.toLowerCase(),o=u(process.cwd());if(i===`stdio`){let t=new e.t(e.i());r=await(0,a.createProcessLease)({repositoryPath:o,serviceName:`imagine-mcp-stdio`,pid:process.pid,metadata:{transport:`stdio`}}),await h(t,async()=>{await r?.release()})}else i===`http`?(n=await p(o,`imagine-mcp-http`,`http`,f(t.port)??f(process.env.MCP_PORT)),r=await(0,a.createProcessLease)({repositoryPath:o,serviceName:`imagine-mcp-http`,pid:process.pid,metadata:{transport:`http`},port:n.port,host:t.host||l,command:process.argv[1],args:process.argv.slice(2)}),await h(new e.r(()=>e.i(),{mode:`http`,port:n.port,host:t.host||l}),async()=>{await m([r,n])})):i===`sse`?(n=await p(o,`imagine-mcp-sse`,`sse`,f(t.port)??f(process.env.MCP_PORT)),r=await(0,a.createProcessLease)({repositoryPath:o,serviceName:`imagine-mcp-sse`,pid:process.pid,metadata:{transport:`sse`},port:n.port,host:t.host||l,command:process.argv[1],args:process.argv.slice(2)}),await h(new e.n(()=>e.i(),{mode:`sse`,port:n.port,host:t.host||l}),async()=>{await m([r,n])})):(process.stderr.write(`Unknown transport type: ${i}. Use: stdio, http, or sse\n`),process.exit(1))}catch(e){await m([r,n]).catch(()=>void 0),process.stderr.write(`Failed to start MCP server: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}});exports.mcpServeCommand=g;
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./stdio-By-VQNao.cjs`);exports.HttpTransportHandler=e.r,exports.ReadImageTool=e.o,exports.SseTransportHandler=e.n,exports.StdioTransportHandler=e.t,exports.UnsplashSearchTool=e.a,exports.createServer=e.i;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./stdio-DJj0hMw8.cjs`);exports.HttpTransportHandler=e.r,exports.ReadImageTool=e.o,exports.SseTransportHandler=e.n,exports.StdioTransportHandler=e.t,exports.UnsplashSearchTool=e.a,exports.createServer=e.i;
@@ -0,0 +1,21 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`@agimon-ai/foundation-validator`),l=require(`@modelcontextprotocol/sdk/server/index.js`),u=require(`@modelcontextprotocol/sdk/types.js`),d=require(`zod`),f=require(`node:crypto`),p=require(`node:fs`),m=require(`node:fs/promises`),h=require(`node:path`),g=require(`node-fetch`);g=s(g,1);let _=require(`unsplash-js`),v=require(`@modelcontextprotocol/sdk/server/streamableHttp.js`),y=require(`express`);y=s(y,1);let b=require(`@modelcontextprotocol/sdk/server/sse.js`),x=require(`@modelcontextprotocol/sdk/server/stdio.js`);function S(e){let t=e.replace(/\\+ /g,` `);return t=t.replace(/\\+'/g,`'`).replace(/\\+"/g,`"`).replace(/\\+`/g,"`").replace(/\\+\(/g,`(`).replace(/\\+\)/g,`)`).replace(/\\+\[/g,`[`).replace(/\\+\]/g,`]`).replace(/\\+\{/g,`{`).replace(/\\+\}/g,`}`),t}const C=`application/octet-stream`,w={".png":`image/png`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".gif":`image/gif`,".webp":`image/webp`,".bmp":`image/bmp`,".svg":`image/svg+xml`,".heic":`image/heic`,".heif":`image/heif`};var T=class{async readImage(e,t={}){let n=await this.resolveImageSource(e),r=(0,f.createHash)(`sha256`).update(n.data).digest(`hex`),i={source:n.source,sourceType:n.sourceType,mimeType:n.mimeType,sizeBytes:n.sizeBytes,sha256:r};return n.sourceType!==`data-uri`&&(i.fileName=(0,h.basename)(n.source)),t.includeBase64&&(i.base64=n.data.toString(`base64`)),i}async resolveImageSource(e){let t=e.trim();if(!t)throw new u.McpError(u.ErrorCode.InvalidParams,`Image source cannot be empty.`);return t.startsWith(`data:`)?this.resolveDataUri(t):/^https?:\/\//i.test(t)?this.resolveRemoteImage(t):this.resolveFile(t)}async resolveFile(e){let t=(0,h.resolve)(S(e));try{await(0,m.access)(t,p.constants.F_OK)}catch{throw new u.McpError(u.ErrorCode.InvalidParams,`Image file not found at path: ${e}`)}let n;try{n=await(0,m.readFile)(t)}catch(e){throw new u.McpError(u.ErrorCode.InternalError,`Failed to read image file: ${e instanceof Error?e.message:String(e)}`)}return{source:t,sourceType:`file`,mimeType:w[(0,h.extname)(t).toLowerCase()]||C,sizeBytes:n.length,data:n}}async resolveRemoteImage(e){try{let t=await(0,g.default)(e,{redirect:`follow`});if(!t.ok)throw new u.McpError(u.ErrorCode.InvalidParams,`Failed to fetch image from URL: ${e} (${t.status} ${t.statusText})`);let n=await t.arrayBuffer(),r=Buffer.from(n),i=t.headers.get(`content-type`)?.split(`;`)[0],a=(0,h.basename)(new URL(e).pathname||`image`);return{source:e,sourceType:`url`,mimeType:i??w[(0,h.extname)(a)]??C,sizeBytes:r.length,data:r}}catch(e){throw e instanceof u.McpError?e:new u.McpError(u.ErrorCode.InternalError,`Failed to download image from URL: ${e instanceof Error?e.message:String(e)}`)}}resolveDataUri(e){let t=e.indexOf(`,`);if(t===-1||t===e.length-1)throw new u.McpError(u.ErrorCode.InvalidParams,"Invalid data URI format. Expected `data:[<mime>];base64,<payload>`.");let n=e.slice(5,t).toLowerCase(),r=e.slice(t+1),i=n.includes(`base64`),a=n.split(`;`)[0]||C;try{let t=i?Buffer.from(r,`base64`):Buffer.from(decodeURIComponent(r));return{source:e,sourceType:`data-uri`,mimeType:a||C,sizeBytes:t.length,data:t}}catch(e){throw new u.McpError(u.ErrorCode.InvalidParams,`Failed to decode data URI payload: ${e instanceof Error?e.message:String(e)}`)}}};const E=d.z.object({source:d.z.string().min(1).describe(`Image source as a local path, HTTP(S) URL, or data URI.`),includeBase64:d.z.boolean().optional().default(!1).describe(`Whether to include base64-encoded output.`)});var D=class e{static TOOL_NAME=`read-image`;service=new T;getInputSchema(){return E}getDefinition(){return{name:e.TOOL_NAME,description:`Read an image from a local path, URL, or data URI and return metadata.`,inputSchema:d.z.toJSONSchema(E,{reused:`inline`})}}async execute(e){try{let t=E.parse(e),n=await this.service.readImage(t.source,{includeBase64:t.includeBase64});return{content:[{type:`text`,text:JSON.stringify(n,null,2)}]}}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:`Unknown error`}`}],isError:!0}}}};const O=d.z.object({UPLOAD_SERVICE:d.z.enum([`s3`,`cloudflare`,`gcloud`]).optional().default(`s3`),S3_BUCKET:d.z.string().optional(),AWS_ACCESS_KEY_ID:d.z.string().optional(),AWS_SECRET_ACCESS_KEY:d.z.string().optional(),S3_REGION:d.z.string().optional().default(`us-east-1`),S3_ENDPOINT:d.z.string().url(`S3_ENDPOINT must be a valid URL`).optional(),CLOUDFLARE_R2_BUCKET:d.z.string().optional(),CLOUDFLARE_R2_ACCESS_KEY_ID:d.z.string().optional(),CLOUDFLARE_R2_SECRET_ACCESS_KEY:d.z.string().optional(),CLOUDFLARE_R2_REGION:d.z.string().optional().default(`auto`),CLOUDFLARE_R2_ENDPOINT:d.z.string().url(`CLOUDFLARE_R2_ENDPOINT must be a valid URL`).optional(),GCLOUD_BUCKET:d.z.string().optional(),GCLOUD_PROJECT_ID:d.z.string().optional(),GCLOUD_CREDENTIALS_PATH:d.z.string().optional(),UNSPLASH_ACCESS_KEY:d.z.string().optional()}).refine(e=>e.AWS_ACCESS_KEY_ID||e.AWS_SECRET_ACCESS_KEY?e.AWS_ACCESS_KEY_ID&&e.AWS_SECRET_ACCESS_KEY:!0,{message:`Both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY must be provided together`,path:[`AWS_ACCESS_KEY_ID`]}),k=class e{static instance;config;constructor(){try{this.config=O.parse(process.env)}catch(e){if(e instanceof d.z.ZodError){let t=e.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`; `);throw new u.McpError(u.ErrorCode.InternalError,`Environment configuration validation failed: ${t}`)}throw e}}static getInstance(){return e.instance||=new e,e.instance}getConfig(){return this.config}getS3Config(){return{bucket:this.config.S3_BUCKET,accessKeyId:this.config.AWS_ACCESS_KEY_ID,secretAccessKey:this.config.AWS_SECRET_ACCESS_KEY,region:this.config.S3_REGION,endpoint:this.config.S3_ENDPOINT}}getCloudflareConfig(){return{bucket:this.config.CLOUDFLARE_R2_BUCKET,accessKeyId:this.config.CLOUDFLARE_R2_ACCESS_KEY_ID,secretAccessKey:this.config.CLOUDFLARE_R2_SECRET_ACCESS_KEY,region:this.config.CLOUDFLARE_R2_REGION,endpoint:this.config.CLOUDFLARE_R2_ENDPOINT}}getGCloudConfig(){return{bucket:this.config.GCLOUD_BUCKET,projectId:this.config.GCLOUD_PROJECT_ID,credentialsPath:this.config.GCLOUD_CREDENTIALS_PATH}}getUploadService(){return this.config.UPLOAD_SERVICE}getUnsplashConfig(){return{accessKey:this.config.UNSPLASH_ACCESS_KEY}}validateServiceConfig(e){switch(e){case`s3`:if(!this.config.S3_BUCKET)throw new u.McpError(u.ErrorCode.InvalidParams,`S3_BUCKET is required for S3 upload service`);break;case`cloudflare`:if(!this.config.CLOUDFLARE_R2_BUCKET)throw new u.McpError(u.ErrorCode.InvalidParams,`CLOUDFLARE_R2_BUCKET is required for Cloudflare upload service`);if(!this.config.CLOUDFLARE_R2_ACCESS_KEY_ID||!this.config.CLOUDFLARE_R2_SECRET_ACCESS_KEY)throw new u.McpError(u.ErrorCode.InvalidParams,`CLOUDFLARE_R2_ACCESS_KEY_ID and CLOUDFLARE_R2_SECRET_ACCESS_KEY are required for Cloudflare upload service`);if(!this.config.CLOUDFLARE_R2_ENDPOINT)throw new u.McpError(u.ErrorCode.InvalidParams,`CLOUDFLARE_R2_ENDPOINT is required for Cloudflare upload service`);break;case`gcloud`:if(!this.config.GCLOUD_BUCKET)throw new u.McpError(u.ErrorCode.InvalidParams,`GCLOUD_BUCKET is required for Google Cloud upload service`);if(!this.config.GCLOUD_PROJECT_ID)throw new u.McpError(u.ErrorCode.InvalidParams,`GCLOUD_PROJECT_ID is required for Google Cloud upload service`);break}}}.getInstance();var A=class{api;constructor(e){let t=k.getUnsplashConfig(),n=e||t.accessKey;if(!n)throw Error(`Unsplash API key is required. Set UNSPLASH_ACCESS_KEY environment variable.`);this.api=(0,_.createApi)({accessKey:n})}async searchImages(e){try{let t=await this.api.search.getPhotos({query:e.query,page:e.page||1,perPage:e.perPage||10,orientation:e.orientation,color:e.color});if(t.errors)throw Error(`Unsplash API error: ${t.errors.join(`, `)}`);if(!t.response)throw Error(`No response from Unsplash API`);return t.response.results.map(e=>({id:e.id,description:e.description,alt_description:e.alt_description,urls:{raw:e.urls.raw,full:e.urls.full,regular:e.urls.regular,small:e.urls.small,thumb:e.urls.thumb},links:{html:e.links.html,download:e.links.download},user:{name:e.user.name,username:e.user.username,portfolio_url:e.user.portfolio_url},width:e.width,height:e.height,color:e.color||`#000000`,likes:e.likes}))}catch(e){throw Error(`Failed to search Unsplash images: ${e instanceof Error?e.message:`Unknown error`}`,{cause:e})}}};const j=d.z.object({query:d.z.string().describe(`Search query (e.g., "sunset", "technology", "nature")`),perPage:d.z.number().min(1).max(30).optional().describe(`Number of results per page (1-30, default: 10)`),page:d.z.number().min(1).optional().describe(`Page number for pagination (default: 1)`),orientation:d.z.enum([`landscape`,`portrait`,`squarish`]).optional().describe(`Filter by photo orientation`),color:d.z.enum([`black_and_white`,`black`,`white`,`yellow`,`orange`,`red`,`purple`,`magenta`,`green`,`teal`,`blue`]).optional().describe(`Filter by photo color`)});var M=class e{static TOOL_NAME=`unsplash_search`;service;accessKey;constructor(e){this.accessKey=e,this.service=null}getService(){return this.service||=new A(this.accessKey),this.service}getInputSchema(){return j}getDefinition(){return{name:e.TOOL_NAME,description:`Search for stock images from Unsplash by keyword and return image URLs with metadata`,inputSchema:d.z.toJSONSchema(j,{reused:`inline`})}}async execute(e){try{let t=j.parse(e),n=await this.getService().searchImages({query:t.query,perPage:t.perPage,page:t.page,orientation:t.orientation,color:t.color});if(n.length===0)return{content:[{type:`text`,text:`No images found for query: "${t.query}"`}]};let r=n.map((e,t)=>`
2
+ 📷 **Image ${t+1}**
3
+ - **ID**: ${e.id}
4
+ - **Description**: ${e.alt_description||e.description||`No description`}
5
+ - **Photographer**: ${e.user.name} (@${e.user.username})
6
+ - **Dimensions**: ${e.width}x${e.height}px
7
+ - **Color**: ${e.color}
8
+ - **Likes**: ${e.likes}
9
+
10
+ **URLs**:
11
+ - Full: ${e.urls.full}
12
+ - Regular: ${e.urls.regular}
13
+ - Small: ${e.urls.small}
14
+ - Thumbnail: ${e.urls.thumb}
15
+
16
+ **Links**:
17
+ - View on Unsplash: ${e.links.html}
18
+ - Download: ${e.links.download}
19
+ ${e.user.portfolio_url?`- Photographer Portfolio: ${e.user.portfolio_url}`:``}
20
+ `.trim()).join(`\n\n${`-`.repeat(80)}\n\n`);return{content:[{type:`text`,text:`Found ${n.length} image(s) for "${t.query}":\n\n${r}`}]}}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:`Unknown error`}`}],isError:!0}}}};function N(){let e=new l.Server({name:`imagine-mcp`,version:`0.1.0`},{capabilities:{tools:{}}}),t=[new M,new D],n=new Map(t.map(e=>[e.getDefinition().name,e]));return e.setRequestHandler(u.ListToolsRequestSchema,async()=>({tools:t.map(e=>e.getDefinition())})),e.setRequestHandler(u.CallToolRequestSchema,async e=>{let{name:t,arguments:r}=e.params,i=n.get(t);if(!i)return{content:[{type:`text`,text:`Unknown tool: ${t}`}],isError:!0};let a=(0,c.coerceArgs)(r??{},i.getInputSchema());try{return await i.execute(a)}catch(e){if(e instanceof d.z.ZodError)return{content:[{type:`text`,text:(0,c.formatZodError)(e,{schemaName:t,schema:i.getInputSchema()})}],isError:!0};throw e}}),e}var P=class{sessions=new Map;getSession(e){return this.sessions.get(e)}setSession(e,t,n){this.sessions.set(e,{transport:t,server:n})}deleteSession(e){let t=this.sessions.get(e);t&&t.server.close(),this.sessions.delete(e)}hasSession(e){return this.sessions.has(e)}clear(){for(let e of this.sessions.values())e.server.close();this.sessions.clear()}},F=class{serverFactory;app;server=null;sessionManager;config;constructor(e,t){this.serverFactory=typeof e==`function`?e:()=>e,this.app=(0,y.default)(),this.sessionManager=new P;let n=t.port;if(typeof n!=`number`||!Number.isInteger(n)||n<=0||n>65535)throw Error(`HTTP transport requires an explicit port`);this.config={mode:t.mode,port:n,host:t.host??`localhost`},this.setupMiddleware(),this.setupRoutes()}setupMiddleware(){this.app.use(y.default.json())}setupRoutes(){this.app.post(`/mcp`,async(e,t)=>{await this.handlePostRequest(e,t)}),this.app.get(`/mcp`,async(e,t)=>{await this.handleGetRequest(e,t)}),this.app.delete(`/mcp`,async(e,t)=>{await this.handleDeleteRequest(e,t)}),this.app.get(`/health`,(e,t)=>{t.json({status:`ok`,transport:`http`})})}async handlePostRequest(e,t){let n=e.headers[`mcp-session-id`],r;if(n&&this.sessionManager.hasSession(n))r=this.sessionManager.getSession(n).transport;else if(!n&&(0,u.isInitializeRequest)(e.body)){let e=this.serverFactory();r=new v.StreamableHTTPServerTransport({sessionIdGenerator:()=>(0,f.randomUUID)(),enableJsonResponse:!0,onsessioninitialized:t=>{this.sessionManager.setSession(t,r,e)}}),r.onclose=()=>{r.sessionId&&this.sessionManager.deleteSession(r.sessionId)},await e.connect(r)}else{t.status(400).json({jsonrpc:`2.0`,error:{code:-32e3,message:`Bad Request: No valid session ID provided`},id:null});return}await r.handleRequest(e,t,e.body)}async handleGetRequest(e,t){let n=e.headers[`mcp-session-id`];if(!n||!this.sessionManager.hasSession(n)){t.status(400).send(`Invalid or missing session ID`);return}await this.sessionManager.getSession(n).transport.handleRequest(e,t)}async handleDeleteRequest(e,t){let n=e.headers[`mcp-session-id`];if(!n||!this.sessionManager.hasSession(n)){t.status(400).send(`Invalid or missing session ID`);return}await this.sessionManager.getSession(n).transport.handleRequest(e,t),this.sessionManager.deleteSession(n)}async start(){return new Promise((e,t)=>{try{this.server=this.app.listen(this.config.port,this.config.host,()=>{process.stderr.write(`imagine-mcp MCP server started on http://${this.config.host}:${this.config.port}/mcp\n`),process.stderr.write(`Health check: http://${this.config.host}:${this.config.port}/health\n`),e()}),this.server.on(`error`,e=>{t(e)})}catch(e){t(e)}})}async stop(){return new Promise((e,t)=>{this.server?(this.sessionManager.clear(),this.server.close(n=>{n?t(n):(this.server=null,e())})):e()})}getPort(){return this.config.port}getHost(){return this.config.host}},I=class{sessions=new Map;getSession(e){return this.sessions.get(e)?.transport}setSession(e,t,n){this.sessions.set(e,{transport:t,server:n})}deleteSession(e){let t=this.sessions.get(e);t&&t.server.close(),this.sessions.delete(e)}hasSession(e){return this.sessions.has(e)}clear(){for(let e of this.sessions.values())e.server.close();this.sessions.clear()}},L=class{serverFactory;app;server=null;sessionManager;config;constructor(e,t){this.serverFactory=typeof e==`function`?e:()=>e,this.app=(0,y.default)(),this.sessionManager=new I;let n=t.port;if(typeof n!=`number`||!Number.isInteger(n)||n<=0||n>65535)throw Error(`SSE transport requires an explicit port`);this.config={mode:t.mode,port:n,host:t.host??`localhost`},this.setupMiddleware(),this.setupRoutes()}setupMiddleware(){this.app.use(y.default.json())}setupRoutes(){this.app.get(`/sse`,async(e,t)=>{await this.handleSseConnection(e,t)}),this.app.post(`/messages`,async(e,t)=>{await this.handlePostMessage(e,t)}),this.app.get(`/health`,(e,t)=>{t.json({status:`ok`,transport:`sse`})})}async handleSseConnection(e,t){try{let e=this.serverFactory(),n=new b.SSEServerTransport(`/messages`,t);this.sessionManager.setSession(n.sessionId,n,e),t.on(`close`,()=>{this.sessionManager.deleteSession(n.sessionId)}),await e.connect(n),process.stderr.write(`SSE session established: ${n.sessionId}\n`)}catch(e){process.stderr.write(`Error handling SSE connection: ${e instanceof Error?e.message:String(e)}\n`),t.headersSent||t.status(500).send(`Internal Server Error`)}}async handlePostMessage(e,t){let n=e.query.sessionId;if(!n){t.status(400).send(`Missing sessionId query parameter`);return}let r=this.sessionManager.getSession(n);if(!r){t.status(404).send(`No transport found for sessionId`);return}try{await r.handlePostMessage(e,t,e.body)}catch(e){process.stderr.write(`Error handling post message: ${e instanceof Error?e.message:String(e)}\n`),t.headersSent||t.status(500).send(`Internal Server Error`)}}async start(){return new Promise((e,t)=>{try{this.server=this.app.listen(this.config.port,this.config.host,()=>{process.stderr.write(`imagine-mcp MCP server started with SSE transport on http://${this.config.host}:${this.config.port}\n`),process.stderr.write(`SSE endpoint: http://${this.config.host}:${this.config.port}/sse\n`),process.stderr.write(`Messages endpoint: http://${this.config.host}:${this.config.port}/messages\n`),process.stderr.write(`Health check: http://${this.config.host}:${this.config.port}/health\n`),e()}),this.server.on(`error`,e=>{t(e)})}catch(e){t(e)}})}async stop(){return new Promise((e,t)=>{this.server?(this.sessionManager.clear(),this.server.close(n=>{n?t(n):(this.server=null,e())})):e()})}getPort(){return this.config.port}getHost(){return this.config.host}},R=class{server;transport=null;constructor(e){this.server=e}async start(){this.transport=new x.StdioServerTransport,await this.server.connect(this.transport),process.stderr.write(`imagine-mcp MCP server started on stdio
21
+ `)}async stop(){this.transport&&=(await this.transport.close(),null)}};Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return R}});
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@agimon-ai/imagine-mcp",
3
3
  "description": "MCP server for AI image generation and manipulation",
4
- "version": "0.8.2",
4
+ "version": "0.8.4",
5
5
  "license": "AGPL-3.0",
6
6
  "keywords": [
7
7
  "mcp",
@@ -19,7 +19,7 @@
19
19
  "README.md"
20
20
  ],
21
21
  "dependencies": {
22
- "@aws-sdk/client-s3": "3.1028.0",
22
+ "@aws-sdk/client-s3": "3.1040.0",
23
23
  "@google-cloud/storage": "7.19.0",
24
24
  "@modelcontextprotocol/sdk": "1.29.0",
25
25
  "chalk": "5.6.2",
@@ -29,17 +29,17 @@
29
29
  "node-fetch": "3.3.2",
30
30
  "sharp": "0.34.5",
31
31
  "unsplash-js": "7.0.20",
32
- "zod": "4.3.6",
33
- "@agimon-ai/foundation-port-registry": "0.8.2",
34
- "@agimon-ai/foundation-validator": "0.5.2",
35
- "@agimon-ai/foundation-process-registry": "0.8.2"
32
+ "zod": "4.4.1",
33
+ "@agimon-ai/foundation-port-registry": "0.8.4",
34
+ "@agimon-ai/foundation-validator": "0.5.4",
35
+ "@agimon-ai/foundation-process-registry": "0.8.4"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/express": "5.0.6",
39
39
  "@types/node": "25.6.0",
40
- "tsdown": "0.21.7",
41
- "typescript": "6.0.2",
42
- "vitest": "4.1.4"
40
+ "tsdown": "0.21.10",
41
+ "typescript": "6.0.3",
42
+ "vitest": "4.1.5"
43
43
  },
44
44
  "type": "module",
45
45
  "exports": {
@@ -1 +0,0 @@
1
- const e=require(`./stdio-By-VQNao.cjs`);let t=require(`node:fs`),n=require(`node:path`);n=e.s(n);let r=require(`commander`),i=require(`@agimon-ai/foundation-port-registry`),a=require(`@agimon-ai/foundation-process-registry`),o=function(e){return e.STDIO=`stdio`,e.HTTP=`http`,e.SSE=`sse`,e}({});const s=[`pnpm-workspace.yaml`,`nx.json`,`.git`],c=`tool`,l=process.env.NODE_ENV||`development`,u=process.env.MCP_HOST||`localhost`;function d(e=process.cwd()){let r=n.default.resolve(e);for(;;){for(let e of s)if((0,t.existsSync)(n.default.join(r,e)))return r;let e=n.default.dirname(r);if(e===r)return process.cwd();r=e}}function f(){return new i.PortRegistryService(process.env.PORT_REGISTRY_PATH)}function p(e){if(typeof e==`number`)return Number.isInteger(e)&&e>0&&e<=65535?e:void 0;if(typeof e==`string`&&e.trim().length>0){let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0&&t<=65535?t:void 0}}async function m(e,t,n,r){let a=f(),o=r??i.DEFAULT_PORT_RANGE.min,s=r?{min:r,max:Math.max(i.DEFAULT_PORT_RANGE.max,r)}:i.DEFAULT_PORT_RANGE,d=await a.reservePort({repositoryPath:e,serviceName:t,serviceType:c,environment:l,preferredPort:o,portRange:s,pid:process.pid,host:u,force:!0,metadata:{transport:n}});if(!d.success||!d.record)throw Error(d.error||`Failed to reserve port for ${t}`);let p=!1;return{port:d.record.port,release:async()=>{if(p)return;p=!0;let n=await a.releasePort({repositoryPath:e,serviceName:t,serviceType:c,environment:l,pid:process.pid});if(!n.success&&!n.error?.includes(`No matching registry entry`))throw Error(n.error||`Failed to release port for ${t}`)}}}async function h(e){for(let t of e)t&&await t.release()}async function g(e,t){await e.start();let n=async n=>{process.stderr.write(`\nReceived ${n}, shutting down gracefully...\n`);let r;try{await e.stop()}catch(e){r=e}try{await t?.()}catch(e){r??=e}r&&(process.stderr.write(`Error during shutdown: ${r instanceof Error?r.message:String(r)}\n`),process.exit(1)),process.exit(0)};process.on(`SIGINT`,()=>n(`SIGINT`)),process.on(`SIGTERM`,()=>n(`SIGTERM`))}const _=new r.Command(`mcp-serve`).description(`Start MCP server with specified transport`).option(`-t, --type <type>`,`Transport type: stdio, http, or sse`,`stdio`).option(`-p, --port <port>`,`Port to listen on (http/sse only)`,e=>Number.parseInt(e,10)).option(`--host <host>`,`Host to bind to (http/sse only)`,`localhost`).action(async t=>{let n,r;try{let i=t.type.toLowerCase(),s=d(process.cwd());if(i===`stdio`){let t=new e.t(e.i());r=await(0,a.createProcessLease)({repositoryPath:s,serviceName:`imagine-mcp-stdio`,pid:process.pid,metadata:{transport:`stdio`}}),await g(t,async()=>{await r?.release()})}else if(i===`http`){let i=p(t.port)??p(process.env.MCP_PORT);n=await m(s,`imagine-mcp-http`,o.HTTP,i),r=await(0,a.createProcessLease)({repositoryPath:s,serviceName:`imagine-mcp-http`,pid:process.pid,metadata:{transport:`http`},port:n.port,host:t.host||u,command:process.argv[1],args:process.argv.slice(2)}),await g(new e.r(()=>e.i(),{mode:o.HTTP,port:n.port,host:t.host||u}),async()=>{await h([r,n])})}else if(i===`sse`){let i=p(t.port)??p(process.env.MCP_PORT);n=await m(s,`imagine-mcp-sse`,o.SSE,i),r=await(0,a.createProcessLease)({repositoryPath:s,serviceName:`imagine-mcp-sse`,pid:process.pid,metadata:{transport:`sse`},port:n.port,host:t.host||u,command:process.argv[1],args:process.argv.slice(2)}),await g(new e.n(()=>e.i(),{mode:o.SSE,port:n.port,host:t.host||u}),async()=>{await h([r,n])})}else process.stderr.write(`Unknown transport type: ${i}. Use: stdio, http, or sse\n`),process.exit(1)}catch(e){await h([r,n]).catch(()=>void 0),process.stderr.write(`Failed to start MCP server: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}});exports.mcpServeCommand=_;
@@ -1 +0,0 @@
1
- import{i as e,n as t,r as n,t as r}from"./stdio-BLp8KDWd.mjs";import{existsSync as i}from"node:fs";import a from"node:path";import{Command as o}from"commander";import{DEFAULT_PORT_RANGE as s,PortRegistryService as c}from"@agimon-ai/foundation-port-registry";import{createProcessLease as l}from"@agimon-ai/foundation-process-registry";let u=function(e){return e.STDIO=`stdio`,e.HTTP=`http`,e.SSE=`sse`,e}({});const d=[`pnpm-workspace.yaml`,`nx.json`,`.git`],f=`tool`,p=process.env.NODE_ENV||`development`,m=process.env.MCP_HOST||`localhost`;function h(e=process.cwd()){let t=a.resolve(e);for(;;){for(let e of d)if(i(a.join(t,e)))return t;let e=a.dirname(t);if(e===t)return process.cwd();t=e}}function g(){return new c(process.env.PORT_REGISTRY_PATH)}function _(e){if(typeof e==`number`)return Number.isInteger(e)&&e>0&&e<=65535?e:void 0;if(typeof e==`string`&&e.trim().length>0){let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0&&t<=65535?t:void 0}}async function v(e,t,n,r){let i=g(),a=r??s.min,o=r?{min:r,max:Math.max(s.max,r)}:s,c=await i.reservePort({repositoryPath:e,serviceName:t,serviceType:f,environment:p,preferredPort:a,portRange:o,pid:process.pid,host:m,force:!0,metadata:{transport:n}});if(!c.success||!c.record)throw Error(c.error||`Failed to reserve port for ${t}`);let l=!1;return{port:c.record.port,release:async()=>{if(l)return;l=!0;let n=await i.releasePort({repositoryPath:e,serviceName:t,serviceType:f,environment:p,pid:process.pid});if(!n.success&&!n.error?.includes(`No matching registry entry`))throw Error(n.error||`Failed to release port for ${t}`)}}}async function y(e){for(let t of e)t&&await t.release()}async function b(e,t){await e.start();let n=async n=>{process.stderr.write(`\nReceived ${n}, shutting down gracefully...\n`);let r;try{await e.stop()}catch(e){r=e}try{await t?.()}catch(e){r??=e}r&&(process.stderr.write(`Error during shutdown: ${r instanceof Error?r.message:String(r)}\n`),process.exit(1)),process.exit(0)};process.on(`SIGINT`,()=>n(`SIGINT`)),process.on(`SIGTERM`,()=>n(`SIGTERM`))}const x=new o(`mcp-serve`).description(`Start MCP server with specified transport`).option(`-t, --type <type>`,`Transport type: stdio, http, or sse`,`stdio`).option(`-p, --port <port>`,`Port to listen on (http/sse only)`,e=>Number.parseInt(e,10)).option(`--host <host>`,`Host to bind to (http/sse only)`,`localhost`).action(async i=>{let a,o;try{let s=i.type.toLowerCase(),c=h(process.cwd());if(s===`stdio`){let t=new r(e());o=await l({repositoryPath:c,serviceName:`imagine-mcp-stdio`,pid:process.pid,metadata:{transport:`stdio`}}),await b(t,async()=>{await o?.release()})}else if(s===`http`){let t=_(i.port)??_(process.env.MCP_PORT);a=await v(c,`imagine-mcp-http`,u.HTTP,t),o=await l({repositoryPath:c,serviceName:`imagine-mcp-http`,pid:process.pid,metadata:{transport:`http`},port:a.port,host:i.host||m,command:process.argv[1],args:process.argv.slice(2)}),await b(new n(()=>e(),{mode:u.HTTP,port:a.port,host:i.host||m}),async()=>{await y([o,a])})}else if(s===`sse`){let n=_(i.port)??_(process.env.MCP_PORT);a=await v(c,`imagine-mcp-sse`,u.SSE,n),o=await l({repositoryPath:c,serviceName:`imagine-mcp-sse`,pid:process.pid,metadata:{transport:`sse`},port:a.port,host:i.host||m,command:process.argv[1],args:process.argv.slice(2)}),await b(new t(()=>e(),{mode:u.SSE,port:a.port,host:i.host||m}),async()=>{await y([o,a])})}else process.stderr.write(`Unknown transport type: ${s}. Use: stdio, http, or sse\n`),process.exit(1)}catch(e){await y([o,a]).catch(()=>void 0),process.stderr.write(`Failed to start MCP server: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}});export{x as mcpServeCommand};
@@ -1,21 +0,0 @@
1
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`@agimon-ai/foundation-validator`),l=require(`@modelcontextprotocol/sdk/server/index.js`),u=require(`@modelcontextprotocol/sdk/types.js`),d=require(`zod`),f=require(`node:crypto`),p=require(`node:fs`),m=require(`node:fs/promises`),h=require(`node:path`),g=require(`node-fetch`);g=s(g);let _=require(`unsplash-js`),v=require(`@modelcontextprotocol/sdk/server/streamableHttp.js`),y=require(`express`);y=s(y);let b=require(`@modelcontextprotocol/sdk/server/sse.js`),x=require(`@modelcontextprotocol/sdk/server/stdio.js`);function S(e){let t=e.replace(/\\+ /g,` `);return t=t.replace(/\\+'/g,`'`).replace(/\\+"/g,`"`).replace(/\\+`/g,"`").replace(/\\+\(/g,`(`).replace(/\\+\)/g,`)`).replace(/\\+\[/g,`[`).replace(/\\+\]/g,`]`).replace(/\\+\{/g,`{`).replace(/\\+\}/g,`}`),t}const C=`application/octet-stream`,w={".png":`image/png`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".gif":`image/gif`,".webp":`image/webp`,".bmp":`image/bmp`,".svg":`image/svg+xml`,".heic":`image/heic`,".heif":`image/heif`};var T=class{async readImage(e,t={}){let n=await this.resolveImageSource(e),r=(0,f.createHash)(`sha256`).update(n.data).digest(`hex`),i={source:n.source,sourceType:n.sourceType,mimeType:n.mimeType,sizeBytes:n.sizeBytes,sha256:r};return n.sourceType!==`data-uri`&&(i.fileName=(0,h.basename)(n.source)),t.includeBase64&&(i.base64=n.data.toString(`base64`)),i}async resolveImageSource(e){let t=e.trim();if(!t)throw new u.McpError(u.ErrorCode.InvalidParams,`Image source cannot be empty.`);return t.startsWith(`data:`)?this.resolveDataUri(t):/^https?:\/\//i.test(t)?this.resolveRemoteImage(t):this.resolveFile(t)}async resolveFile(e){let t=(0,h.resolve)(S(e));try{await(0,m.access)(t,p.constants.F_OK)}catch{throw new u.McpError(u.ErrorCode.InvalidParams,`Image file not found at path: ${e}`)}let n;try{n=await(0,m.readFile)(t)}catch(e){throw new u.McpError(u.ErrorCode.InternalError,`Failed to read image file: ${e instanceof Error?e.message:String(e)}`)}return{source:t,sourceType:`file`,mimeType:w[(0,h.extname)(t).toLowerCase()]||C,sizeBytes:n.length,data:n}}async resolveRemoteImage(e){try{let t=await(0,g.default)(e,{redirect:`follow`});if(!t.ok)throw new u.McpError(u.ErrorCode.InvalidParams,`Failed to fetch image from URL: ${e} (${t.status} ${t.statusText})`);let n=await t.arrayBuffer(),r=Buffer.from(n),i=t.headers.get(`content-type`)?.split(`;`)[0],a=(0,h.basename)(new URL(e).pathname||`image`);return{source:e,sourceType:`url`,mimeType:i??w[(0,h.extname)(a)]??C,sizeBytes:r.length,data:r}}catch(e){throw e instanceof u.McpError?e:new u.McpError(u.ErrorCode.InternalError,`Failed to download image from URL: ${e instanceof Error?e.message:String(e)}`)}}resolveDataUri(e){let t=e.indexOf(`,`);if(t===-1||t===e.length-1)throw new u.McpError(u.ErrorCode.InvalidParams,"Invalid data URI format. Expected `data:[<mime>];base64,<payload>`.");let n=e.slice(5,t).toLowerCase(),r=e.slice(t+1),i=n.includes(`base64`),a=n.split(`;`)[0]||C;try{let t=i?Buffer.from(r,`base64`):Buffer.from(decodeURIComponent(r));return{source:e,sourceType:`data-uri`,mimeType:a||C,sizeBytes:t.length,data:t}}catch(e){throw new u.McpError(u.ErrorCode.InvalidParams,`Failed to decode data URI payload: ${e instanceof Error?e.message:String(e)}`)}}};const E=d.z.object({source:d.z.string().min(1).describe(`Image source as a local path, HTTP(S) URL, or data URI.`),includeBase64:d.z.boolean().optional().default(!1).describe(`Whether to include base64-encoded output.`)});var D=class e{static TOOL_NAME=`read-image`;service=new T;getInputSchema(){return E}getDefinition(){return{name:e.TOOL_NAME,description:`Read an image from a local path, URL, or data URI and return metadata.`,inputSchema:d.z.toJSONSchema(E,{reused:`inline`})}}async execute(e){try{let t=E.parse(e),n=await this.service.readImage(t.source,{includeBase64:t.includeBase64});return{content:[{type:`text`,text:JSON.stringify(n,null,2)}]}}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:`Unknown error`}`}],isError:!0}}}};const O=d.z.object({UPLOAD_SERVICE:d.z.enum([`s3`,`cloudflare`,`gcloud`]).optional().default(`s3`),S3_BUCKET:d.z.string().optional(),AWS_ACCESS_KEY_ID:d.z.string().optional(),AWS_SECRET_ACCESS_KEY:d.z.string().optional(),S3_REGION:d.z.string().optional().default(`us-east-1`),S3_ENDPOINT:d.z.string().url(`S3_ENDPOINT must be a valid URL`).optional(),CLOUDFLARE_R2_BUCKET:d.z.string().optional(),CLOUDFLARE_R2_ACCESS_KEY_ID:d.z.string().optional(),CLOUDFLARE_R2_SECRET_ACCESS_KEY:d.z.string().optional(),CLOUDFLARE_R2_REGION:d.z.string().optional().default(`auto`),CLOUDFLARE_R2_ENDPOINT:d.z.string().url(`CLOUDFLARE_R2_ENDPOINT must be a valid URL`).optional(),GCLOUD_BUCKET:d.z.string().optional(),GCLOUD_PROJECT_ID:d.z.string().optional(),GCLOUD_CREDENTIALS_PATH:d.z.string().optional(),UNSPLASH_ACCESS_KEY:d.z.string().optional()}).refine(e=>e.AWS_ACCESS_KEY_ID||e.AWS_SECRET_ACCESS_KEY?e.AWS_ACCESS_KEY_ID&&e.AWS_SECRET_ACCESS_KEY:!0,{message:`Both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY must be provided together`,path:[`AWS_ACCESS_KEY_ID`]}),k=class e{static instance;config;constructor(){try{this.config=O.parse(process.env)}catch(e){if(e instanceof d.z.ZodError){let t=e.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`; `);throw new u.McpError(u.ErrorCode.InternalError,`Environment configuration validation failed: ${t}`)}throw e}}static getInstance(){return e.instance||=new e,e.instance}getConfig(){return this.config}getS3Config(){return{bucket:this.config.S3_BUCKET,accessKeyId:this.config.AWS_ACCESS_KEY_ID,secretAccessKey:this.config.AWS_SECRET_ACCESS_KEY,region:this.config.S3_REGION,endpoint:this.config.S3_ENDPOINT}}getCloudflareConfig(){return{bucket:this.config.CLOUDFLARE_R2_BUCKET,accessKeyId:this.config.CLOUDFLARE_R2_ACCESS_KEY_ID,secretAccessKey:this.config.CLOUDFLARE_R2_SECRET_ACCESS_KEY,region:this.config.CLOUDFLARE_R2_REGION,endpoint:this.config.CLOUDFLARE_R2_ENDPOINT}}getGCloudConfig(){return{bucket:this.config.GCLOUD_BUCKET,projectId:this.config.GCLOUD_PROJECT_ID,credentialsPath:this.config.GCLOUD_CREDENTIALS_PATH}}getUploadService(){return this.config.UPLOAD_SERVICE}getUnsplashConfig(){return{accessKey:this.config.UNSPLASH_ACCESS_KEY}}validateServiceConfig(e){switch(e){case`s3`:if(!this.config.S3_BUCKET)throw new u.McpError(u.ErrorCode.InvalidParams,`S3_BUCKET is required for S3 upload service`);break;case`cloudflare`:if(!this.config.CLOUDFLARE_R2_BUCKET)throw new u.McpError(u.ErrorCode.InvalidParams,`CLOUDFLARE_R2_BUCKET is required for Cloudflare upload service`);if(!this.config.CLOUDFLARE_R2_ACCESS_KEY_ID||!this.config.CLOUDFLARE_R2_SECRET_ACCESS_KEY)throw new u.McpError(u.ErrorCode.InvalidParams,`CLOUDFLARE_R2_ACCESS_KEY_ID and CLOUDFLARE_R2_SECRET_ACCESS_KEY are required for Cloudflare upload service`);if(!this.config.CLOUDFLARE_R2_ENDPOINT)throw new u.McpError(u.ErrorCode.InvalidParams,`CLOUDFLARE_R2_ENDPOINT is required for Cloudflare upload service`);break;case`gcloud`:if(!this.config.GCLOUD_BUCKET)throw new u.McpError(u.ErrorCode.InvalidParams,`GCLOUD_BUCKET is required for Google Cloud upload service`);if(!this.config.GCLOUD_PROJECT_ID)throw new u.McpError(u.ErrorCode.InvalidParams,`GCLOUD_PROJECT_ID is required for Google Cloud upload service`);break}}}.getInstance();var A=class{api;constructor(e){let t=k.getUnsplashConfig(),n=e||t.accessKey;if(!n)throw Error(`Unsplash API key is required. Set UNSPLASH_ACCESS_KEY environment variable.`);this.api=(0,_.createApi)({accessKey:n})}async searchImages(e){try{let t=await this.api.search.getPhotos({query:e.query,page:e.page||1,perPage:e.perPage||10,orientation:e.orientation,color:e.color});if(t.errors)throw Error(`Unsplash API error: ${t.errors.join(`, `)}`);if(!t.response)throw Error(`No response from Unsplash API`);return t.response.results.map(e=>({id:e.id,description:e.description,alt_description:e.alt_description,urls:{raw:e.urls.raw,full:e.urls.full,regular:e.urls.regular,small:e.urls.small,thumb:e.urls.thumb},links:{html:e.links.html,download:e.links.download},user:{name:e.user.name,username:e.user.username,portfolio_url:e.user.portfolio_url},width:e.width,height:e.height,color:e.color||`#000000`,likes:e.likes}))}catch(e){throw Error(`Failed to search Unsplash images: ${e instanceof Error?e.message:`Unknown error`}`,{cause:e})}}};const j=d.z.object({query:d.z.string().describe(`Search query (e.g., "sunset", "technology", "nature")`),perPage:d.z.number().min(1).max(30).optional().describe(`Number of results per page (1-30, default: 10)`),page:d.z.number().min(1).optional().describe(`Page number for pagination (default: 1)`),orientation:d.z.enum([`landscape`,`portrait`,`squarish`]).optional().describe(`Filter by photo orientation`),color:d.z.enum([`black_and_white`,`black`,`white`,`yellow`,`orange`,`red`,`purple`,`magenta`,`green`,`teal`,`blue`]).optional().describe(`Filter by photo color`)});var M=class e{static TOOL_NAME=`unsplash_search`;service;accessKey;constructor(e){this.accessKey=e,this.service=null}getService(){return this.service||=new A(this.accessKey),this.service}getInputSchema(){return j}getDefinition(){return{name:e.TOOL_NAME,description:`Search for stock images from Unsplash by keyword and return image URLs with metadata`,inputSchema:d.z.toJSONSchema(j,{reused:`inline`})}}async execute(e){try{let t=j.parse(e),n=await this.getService().searchImages({query:t.query,perPage:t.perPage,page:t.page,orientation:t.orientation,color:t.color});if(n.length===0)return{content:[{type:`text`,text:`No images found for query: "${t.query}"`}]};let r=n.map((e,t)=>`
2
- 📷 **Image ${t+1}**
3
- - **ID**: ${e.id}
4
- - **Description**: ${e.alt_description||e.description||`No description`}
5
- - **Photographer**: ${e.user.name} (@${e.user.username})
6
- - **Dimensions**: ${e.width}x${e.height}px
7
- - **Color**: ${e.color}
8
- - **Likes**: ${e.likes}
9
-
10
- **URLs**:
11
- - Full: ${e.urls.full}
12
- - Regular: ${e.urls.regular}
13
- - Small: ${e.urls.small}
14
- - Thumbnail: ${e.urls.thumb}
15
-
16
- **Links**:
17
- - View on Unsplash: ${e.links.html}
18
- - Download: ${e.links.download}
19
- ${e.user.portfolio_url?`- Photographer Portfolio: ${e.user.portfolio_url}`:``}
20
- `.trim()).join(`\n\n${`-`.repeat(80)}\n\n`);return{content:[{type:`text`,text:`Found ${n.length} image(s) for "${t.query}":\n\n${r}`}]}}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:`Unknown error`}`}],isError:!0}}}};function N(){let e=new l.Server({name:`imagine-mcp`,version:`0.1.0`},{capabilities:{tools:{}}}),t=[new M,new D],n=new Map(t.map(e=>[e.getDefinition().name,e]));return e.setRequestHandler(u.ListToolsRequestSchema,async()=>({tools:t.map(e=>e.getDefinition())})),e.setRequestHandler(u.CallToolRequestSchema,async e=>{let{name:t,arguments:r}=e.params,i=n.get(t);if(!i)return{content:[{type:`text`,text:`Unknown tool: ${t}`}],isError:!0};let a=(0,c.coerceArgs)(r??{},i.getInputSchema());try{return await i.execute(a)}catch(e){if(e instanceof d.z.ZodError)return{content:[{type:`text`,text:(0,c.formatZodError)(e,{schemaName:t,schema:i.getInputSchema()})}],isError:!0};throw e}}),e}var P=class{sessions=new Map;getSession(e){return this.sessions.get(e)}setSession(e,t,n){this.sessions.set(e,{transport:t,server:n})}deleteSession(e){let t=this.sessions.get(e);t&&t.server.close(),this.sessions.delete(e)}hasSession(e){return this.sessions.has(e)}clear(){for(let e of this.sessions.values())e.server.close();this.sessions.clear()}},F=class{serverFactory;app;server=null;sessionManager;config;constructor(e,t){this.serverFactory=typeof e==`function`?e:()=>e,this.app=(0,y.default)(),this.sessionManager=new P;let n=t.port;if(typeof n!=`number`||!Number.isInteger(n)||n<=0||n>65535)throw Error(`HTTP transport requires an explicit port`);this.config={mode:t.mode,port:n,host:t.host??`localhost`},this.setupMiddleware(),this.setupRoutes()}setupMiddleware(){this.app.use(y.default.json())}setupRoutes(){this.app.post(`/mcp`,async(e,t)=>{await this.handlePostRequest(e,t)}),this.app.get(`/mcp`,async(e,t)=>{await this.handleGetRequest(e,t)}),this.app.delete(`/mcp`,async(e,t)=>{await this.handleDeleteRequest(e,t)}),this.app.get(`/health`,(e,t)=>{t.json({status:`ok`,transport:`http`})})}async handlePostRequest(e,t){let n=e.headers[`mcp-session-id`],r;if(n&&this.sessionManager.hasSession(n))r=this.sessionManager.getSession(n).transport;else if(!n&&(0,u.isInitializeRequest)(e.body)){let e=this.serverFactory();r=new v.StreamableHTTPServerTransport({sessionIdGenerator:()=>(0,f.randomUUID)(),enableJsonResponse:!0,onsessioninitialized:t=>{this.sessionManager.setSession(t,r,e)}}),r.onclose=()=>{r.sessionId&&this.sessionManager.deleteSession(r.sessionId)},await e.connect(r)}else{t.status(400).json({jsonrpc:`2.0`,error:{code:-32e3,message:`Bad Request: No valid session ID provided`},id:null});return}await r.handleRequest(e,t,e.body)}async handleGetRequest(e,t){let n=e.headers[`mcp-session-id`];if(!n||!this.sessionManager.hasSession(n)){t.status(400).send(`Invalid or missing session ID`);return}await this.sessionManager.getSession(n).transport.handleRequest(e,t)}async handleDeleteRequest(e,t){let n=e.headers[`mcp-session-id`];if(!n||!this.sessionManager.hasSession(n)){t.status(400).send(`Invalid or missing session ID`);return}await this.sessionManager.getSession(n).transport.handleRequest(e,t),this.sessionManager.deleteSession(n)}async start(){return new Promise((e,t)=>{try{this.server=this.app.listen(this.config.port,this.config.host,()=>{process.stderr.write(`imagine-mcp MCP server started on http://${this.config.host}:${this.config.port}/mcp\n`),process.stderr.write(`Health check: http://${this.config.host}:${this.config.port}/health\n`),e()}),this.server.on(`error`,e=>{t(e)})}catch(e){t(e)}})}async stop(){return new Promise((e,t)=>{this.server?(this.sessionManager.clear(),this.server.close(n=>{n?t(n):(this.server=null,e())})):e()})}getPort(){return this.config.port}getHost(){return this.config.host}},I=class{sessions=new Map;getSession(e){return this.sessions.get(e)?.transport}setSession(e,t,n){this.sessions.set(e,{transport:t,server:n})}deleteSession(e){let t=this.sessions.get(e);t&&t.server.close(),this.sessions.delete(e)}hasSession(e){return this.sessions.has(e)}clear(){for(let e of this.sessions.values())e.server.close();this.sessions.clear()}},L=class{serverFactory;app;server=null;sessionManager;config;constructor(e,t){this.serverFactory=typeof e==`function`?e:()=>e,this.app=(0,y.default)(),this.sessionManager=new I;let n=t.port;if(typeof n!=`number`||!Number.isInteger(n)||n<=0||n>65535)throw Error(`SSE transport requires an explicit port`);this.config={mode:t.mode,port:n,host:t.host??`localhost`},this.setupMiddleware(),this.setupRoutes()}setupMiddleware(){this.app.use(y.default.json())}setupRoutes(){this.app.get(`/sse`,async(e,t)=>{await this.handleSseConnection(e,t)}),this.app.post(`/messages`,async(e,t)=>{await this.handlePostMessage(e,t)}),this.app.get(`/health`,(e,t)=>{t.json({status:`ok`,transport:`sse`})})}async handleSseConnection(e,t){try{let e=this.serverFactory(),n=new b.SSEServerTransport(`/messages`,t);this.sessionManager.setSession(n.sessionId,n,e),t.on(`close`,()=>{this.sessionManager.deleteSession(n.sessionId)}),await e.connect(n),process.stderr.write(`SSE session established: ${n.sessionId}\n`)}catch(e){process.stderr.write(`Error handling SSE connection: ${e instanceof Error?e.message:String(e)}\n`),t.headersSent||t.status(500).send(`Internal Server Error`)}}async handlePostMessage(e,t){let n=e.query.sessionId;if(!n){t.status(400).send(`Missing sessionId query parameter`);return}let r=this.sessionManager.getSession(n);if(!r){t.status(404).send(`No transport found for sessionId`);return}try{await r.handlePostMessage(e,t,e.body)}catch(e){process.stderr.write(`Error handling post message: ${e instanceof Error?e.message:String(e)}\n`),t.headersSent||t.status(500).send(`Internal Server Error`)}}async start(){return new Promise((e,t)=>{try{this.server=this.app.listen(this.config.port,this.config.host,()=>{process.stderr.write(`imagine-mcp MCP server started with SSE transport on http://${this.config.host}:${this.config.port}\n`),process.stderr.write(`SSE endpoint: http://${this.config.host}:${this.config.port}/sse\n`),process.stderr.write(`Messages endpoint: http://${this.config.host}:${this.config.port}/messages\n`),process.stderr.write(`Health check: http://${this.config.host}:${this.config.port}/health\n`),e()}),this.server.on(`error`,e=>{t(e)})}catch(e){t(e)}})}async stop(){return new Promise((e,t)=>{this.server?(this.sessionManager.clear(),this.server.close(n=>{n?t(n):(this.server=null,e())})):e()})}getPort(){return this.config.port}getHost(){return this.config.host}},R=class{server;transport=null;constructor(e){this.server=e}async start(){this.transport=new x.StdioServerTransport,await this.server.connect(this.transport),process.stderr.write(`imagine-mcp MCP server started on stdio
21
- `)}async stop(){this.transport&&=(await this.transport.close(),null)}};Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return R}});