mcp-image 0.8.0 → 0.8.2
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/bin/install-skills.js +7 -6
- package/dist/api/geminiClient.d.ts +4 -4
- package/dist/api/geminiClient.d.ts.map +1 -1
- package/dist/api/geminiClient.js +27 -28
- package/dist/api/geminiClient.js.map +1 -1
- package/dist/api/geminiTextClient.d.ts +3 -3
- package/dist/api/geminiTextClient.d.ts.map +1 -1
- package/dist/api/geminiTextClient.js +16 -19
- package/dist/api/geminiTextClient.js.map +1 -1
- package/dist/business/fileManager.d.ts +2 -2
- package/dist/business/fileManager.d.ts.map +1 -1
- package/dist/business/fileManager.js +15 -50
- package/dist/business/fileManager.js.map +1 -1
- package/dist/business/inputValidator.d.ts +3 -3
- package/dist/business/inputValidator.d.ts.map +1 -1
- package/dist/business/inputValidator.js +34 -40
- package/dist/business/inputValidator.js.map +1 -1
- package/dist/business/responseBuilder.d.ts +3 -3
- package/dist/business/responseBuilder.d.ts.map +1 -1
- package/dist/business/responseBuilder.js +9 -45
- package/dist/business/responseBuilder.js.map +1 -1
- package/dist/business/structuredPromptGenerator.d.ts +2 -2
- package/dist/business/structuredPromptGenerator.d.ts.map +1 -1
- package/dist/business/structuredPromptGenerator.js +14 -19
- package/dist/business/structuredPromptGenerator.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -9
- package/dist/index.js.map +1 -1
- package/dist/server/errorHandler.d.ts +2 -2
- package/dist/server/errorHandler.d.ts.map +1 -1
- package/dist/server/errorHandler.js +10 -13
- package/dist/server/errorHandler.js.map +1 -1
- package/dist/server/mcpServer.d.ts +2 -2
- package/dist/server/mcpServer.d.ts.map +1 -1
- package/dist/server/mcpServer.js +45 -72
- package/dist/server/mcpServer.js.map +1 -1
- package/dist/server-main.js +6 -8
- package/dist/server-main.js.map +1 -1
- package/dist/types/mcp.js +2 -5
- package/dist/types/mcp.js.map +1 -1
- package/dist/types/result.js +2 -6
- package/dist/types/result.js.map +1 -1
- package/dist/utils/config.d.ts +3 -3
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +12 -16
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/errors.js +9 -19
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/logger.js +2 -39
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/security.d.ts +10 -2
- package/dist/utils/security.d.ts.map +1 -1
- package/dist/utils/security.js +39 -50
- package/dist/utils/security.js.map +1 -1
- package/package.json +12 -16
- package/skills/image-generation/SKILL.md +20 -14
package/dist/utils/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAkB/C;;GAEG;AACH,MAAM,OAAgB,SAAU,SAAQ,KAAK;IAM3C,YAAY,OAAe,EAAE,OAAiC;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,iBAAiB;QACf,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;SAC/C,CAAA;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAGjD,YACE,OAAe,EACC,UAAkB;QAElC,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,eAAU,GAAV,UAAU,CAAQ;QAJ3B,SAAI,GAAG,wBAAwB,CAAA;IAOxC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAAjD;;QACW,SAAI,GAAG,sBAAsB,CAAA;IAmCxC,CAAC;IAjCC,IAAI,UAAU;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;QAE1C,IACE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EACjC,CAAC;YACD,OAAO,0DAA0D,CAAA;QACnE,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7F,OAAO,2DAA2D,CAAA;QACpE,CAAC;QACD,IACE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;YAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAC7B,CAAC;YACD,OAAO,sDAAsD,CAAA;QAC/D,CAAC;QACD,IACE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EACnC,CAAC;YACD,OAAO,oEAAoE,CAAA;QAC7E,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAClE,OAAO,6CAA6C,CAAA;QACtD,CAAC;QAED,OAAO,wDAAwD,CAAA;IACjE,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,SAAS;IAI3C,YACE,OAAe,EACf,mBAAsD,EACtD,mBAAsD;QAEtD,IAAI,OAA4C,CAAA;QAChD,IAAI,UAA8B,CAAA;QAElC,+DAA+D;QAC/D,IAAI,OAAO,mBAAmB,KAAK,QAAQ,EAAE,CAAC;YAC5C,oDAAoD;YACpD,UAAU,GAAG,OAAO,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAA;QACxF,CAAC;aAAM,CAAC;YACN,kDAAkD;YAClD,OAAO,GAAG,mBAAmB,CAAA;YAC7B,UAAU,GAAG,OAAO,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAA;QACxF,CAAC;QAED,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QArBhB,SAAI,GAAG,kBAAkB,CAAA;QAuBhC,IAAI,OAAO,mBAAmB,KAAK,QAAQ,EAAE,CAAC;YAC5C,IAAI,CAAC,gBAAgB,GAAG,mBAAmB,CAAA;QAC7C,CAAC;QAED,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;IACnF,CAAC;IAED,IAAI,UAAU;QACZ,6DAA6D;QAC7D,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAA;QAC9B,CAAC;QAED,oCAAoC;QACpC,IACE,IAAI,CAAC,OAAO;YACZ,YAAY,IAAI,IAAI,CAAC,OAAO;YAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,QAAQ,EAC9C,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QACnC,CAAC;QAED,8CAA8C;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;QAE1C,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3E,OAAO,gFAAgF,CAAA;QACzF,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3F,OAAO,kDAAkD,CAAA;QAC3D,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9F,OAAO,iEAAiE,aAAa,CAAC,KAAK,OAAO,aAAa,CAAC,GAAG,GAAG,CAAA;QACxH,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACtF,OAAO,0EAA0E,CAAA;QACnF,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1F,OAAO,oEAAoE,CAAA;QAC7E,CAAC;QAED,OAAO,+CAA+C,CAAA;IACxD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,SAAS;IAIzC,YACE,OAAe,EACf,mBAAsD,EACtD,cAAgD;QAEhD,IAAI,OAA4C,CAAA;QAChD,IAAI,KAAwB,CAAA;QAE5B,+DAA+D;QAC/D,IAAI,OAAO,mBAAmB,KAAK,QAAQ,EAAE,CAAC;YAC5C,+CAA+C;YAC/C,KAAK,GAAG,cAAc,YAAY,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAA;QACtE,CAAC;aAAM,CAAC;YACN,6CAA6C;YAC7C,OAAO,GAAG,mBAAmB,CAAA;YAC7B,KAAK,GAAG,cAAc,YAAY,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAA;QACtE,CAAC;QAED,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QArBhB,SAAI,GAAG,eAAe,CAAA;QAuB7B,IAAI,OAAO,mBAAmB,KAAK,QAAQ,EAAE,CAAC;YAC5C,IAAI,CAAC,gBAAgB,GAAG,mBAAmB,CAAA;QAC7C,CAAC;QAED,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;IACzE,CAAC;IAED,IAAI,UAAU;QACZ,6DAA6D;QAC7D,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAA;QAC9B,CAAC;QAED,8CAA8C;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;QAE7C,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACjE,OAAO,kEAAkE,CAAA;QAC3E,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9F,OAAO,4CAA4C,CAAA;QACrD,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAC/E,OAAO,4DAA4D,CAAA;QACrE,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC3E,OAAO,kDAAkD,CAAA;QAC3D,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5D,OAAO,iDAAiD,CAAA;QAC1D,CAAC;QAED,OAAO,kDAAkD,CAAA;IAC3D,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,SAAS;IAGxC,YACE,OAAe,EACC,UAAkB;QAElC,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,eAAU,GAAV,UAAU,CAAQ;QAJ3B,SAAI,GAAG,cAAc,CAAA;IAO9B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,SAAS;IAA5C;;QACW,SAAI,GAAG,gBAAgB,CAAA;IA2BlC,CAAC;IAzBC,IAAI,UAAU;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;QAE1C,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,OAAO,iDAAiD,CAAA;QAC1D,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxF,OAAO,sDAAsD,CAAA;QAC/D,CAAC;QACD,IACE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC1B,CAAC;YACD,OAAO,yDAAyD,CAAA;QAClE,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvF,OAAO,sDAAsD,CAAA;QAC/D,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACpE,OAAO,+EAA+E,CAAA;QACxF,CAAC;QAED,OAAO,iDAAiD,CAAA;IAC1D,CAAC;CACF"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -1,48 +1,12 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Logger utility for structured logging with sensitive data filtering
|
|
4
3
|
* Provides consistent logging format across the application
|
|
5
4
|
*/
|
|
6
|
-
|
|
7
|
-
if (k2 === undefined) k2 = k;
|
|
8
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
-
}
|
|
12
|
-
Object.defineProperty(o, k2, desc);
|
|
13
|
-
}) : (function(o, m, k, k2) {
|
|
14
|
-
if (k2 === undefined) k2 = k;
|
|
15
|
-
o[k2] = m[k];
|
|
16
|
-
}));
|
|
17
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
-
}) : function(o, v) {
|
|
20
|
-
o["default"] = v;
|
|
21
|
-
});
|
|
22
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
-
var ownKeys = function(o) {
|
|
24
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
-
var ar = [];
|
|
26
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
-
return ar;
|
|
28
|
-
};
|
|
29
|
-
return ownKeys(o);
|
|
30
|
-
};
|
|
31
|
-
return function (mod) {
|
|
32
|
-
if (mod && mod.__esModule) return mod;
|
|
33
|
-
var result = {};
|
|
34
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
-
__setModuleDefault(result, mod);
|
|
36
|
-
return result;
|
|
37
|
-
};
|
|
38
|
-
})();
|
|
39
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
exports.Logger = void 0;
|
|
41
|
-
const crypto = __importStar(require("node:crypto"));
|
|
5
|
+
import * as crypto from 'node:crypto';
|
|
42
6
|
/**
|
|
43
7
|
* Logger class for structured logging with sensitive data protection
|
|
44
8
|
*/
|
|
45
|
-
class Logger {
|
|
9
|
+
export class Logger {
|
|
46
10
|
constructor() {
|
|
47
11
|
this.sensitivePatterns = [
|
|
48
12
|
/GEMINI_API_KEY=([^\s]+)/gi,
|
|
@@ -219,5 +183,4 @@ class Logger {
|
|
|
219
183
|
return this.currentSessionId;
|
|
220
184
|
}
|
|
221
185
|
}
|
|
222
|
-
exports.Logger = Logger;
|
|
223
186
|
//# sourceMappingURL=logger.js.map
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/security.d.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Security Manager for file path validation and sanitization
|
|
3
3
|
* Provides protection against path traversal, null byte injection, and other security threats
|
|
4
4
|
*/
|
|
5
|
-
import { type Result } from '../types/result';
|
|
6
|
-
import { SecurityError } from './errors';
|
|
5
|
+
import { type Result } from '../types/result.js';
|
|
6
|
+
import { SecurityError } from './errors.js';
|
|
7
7
|
/**
|
|
8
8
|
* Security manager for handling file path validation and sanitization
|
|
9
9
|
*/
|
|
@@ -15,6 +15,14 @@ export declare class SecurityManager {
|
|
|
15
15
|
* @returns Result containing sanitized path or security error
|
|
16
16
|
*/
|
|
17
17
|
sanitizeFilePath(inputPath: string): Result<string, SecurityError>;
|
|
18
|
+
/**
|
|
19
|
+
* Sanitize input file path without directory restriction.
|
|
20
|
+
* Prevents path traversal, null byte injection, and symlink-based attacks
|
|
21
|
+
* while allowing reads from any legitimate absolute path.
|
|
22
|
+
* @param inputPath File path to sanitize
|
|
23
|
+
* @returns Result containing sanitized absolute path or security error
|
|
24
|
+
*/
|
|
25
|
+
sanitizeInputFilePath(inputPath: string): Result<string, SecurityError>;
|
|
18
26
|
/**
|
|
19
27
|
* Validate image file extension
|
|
20
28
|
* @param filePath File path to validate
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAMhC;IAED;;;;OAIG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAwBlE;;;;;;OAMG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAoBvE;;;;OAIG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;IAYhE;;;;OAIG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;IAUnE;;;;;OAKG;IACH,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAQnE;;;;OAIG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAK1C;;;;OAIG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAuB3C"}
|
package/dist/utils/security.js
CHANGED
|
@@ -1,50 +1,16 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Security Manager for file path validation and sanitization
|
|
4
3
|
* Provides protection against path traversal, null byte injection, and other security threats
|
|
5
4
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
Object.defineProperty(o, k2, desc);
|
|
13
|
-
}) : (function(o, m, k, k2) {
|
|
14
|
-
if (k2 === undefined) k2 = k;
|
|
15
|
-
o[k2] = m[k];
|
|
16
|
-
}));
|
|
17
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
-
}) : function(o, v) {
|
|
20
|
-
o["default"] = v;
|
|
21
|
-
});
|
|
22
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
-
var ownKeys = function(o) {
|
|
24
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
-
var ar = [];
|
|
26
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
-
return ar;
|
|
28
|
-
};
|
|
29
|
-
return ownKeys(o);
|
|
30
|
-
};
|
|
31
|
-
return function (mod) {
|
|
32
|
-
if (mod && mod.__esModule) return mod;
|
|
33
|
-
var result = {};
|
|
34
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
-
__setModuleDefault(result, mod);
|
|
36
|
-
return result;
|
|
37
|
-
};
|
|
38
|
-
})();
|
|
39
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
exports.SecurityManager = void 0;
|
|
41
|
-
const path = __importStar(require("node:path"));
|
|
42
|
-
const result_1 = require("../types/result");
|
|
43
|
-
const errors_1 = require("./errors");
|
|
5
|
+
import { randomBytes } from 'node:crypto';
|
|
6
|
+
import * as fs from 'node:fs';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import { Err, Ok } from '../types/result.js';
|
|
9
|
+
import { SecurityError } from './errors.js';
|
|
44
10
|
/**
|
|
45
11
|
* Security manager for handling file path validation and sanitization
|
|
46
12
|
*/
|
|
47
|
-
class SecurityManager {
|
|
13
|
+
export class SecurityManager {
|
|
48
14
|
constructor() {
|
|
49
15
|
this.allowedBasePaths = [
|
|
50
16
|
process.cwd(),
|
|
@@ -62,19 +28,43 @@ class SecurityManager {
|
|
|
62
28
|
sanitizeFilePath(inputPath) {
|
|
63
29
|
// Null byte attack prevention
|
|
64
30
|
if (inputPath.includes('\0')) {
|
|
65
|
-
return
|
|
31
|
+
return Err(new SecurityError('Null byte detected in file path'));
|
|
66
32
|
}
|
|
67
33
|
// Path traversal attack prevention
|
|
68
34
|
if (inputPath.includes('..')) {
|
|
69
|
-
return
|
|
35
|
+
return Err(new SecurityError('Path traversal attempt detected'));
|
|
70
36
|
}
|
|
71
37
|
// Resolve and validate absolute path
|
|
72
38
|
const resolvedPath = path.resolve(inputPath);
|
|
73
39
|
const isAllowed = this.allowedBasePaths.some((basePath) => resolvedPath.startsWith(path.resolve(basePath)));
|
|
74
40
|
if (!isAllowed) {
|
|
75
|
-
return
|
|
41
|
+
return Err(new SecurityError('File path outside allowed directories'));
|
|
42
|
+
}
|
|
43
|
+
return Ok(resolvedPath);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Sanitize input file path without directory restriction.
|
|
47
|
+
* Prevents path traversal, null byte injection, and symlink-based attacks
|
|
48
|
+
* while allowing reads from any legitimate absolute path.
|
|
49
|
+
* @param inputPath File path to sanitize
|
|
50
|
+
* @returns Result containing sanitized absolute path or security error
|
|
51
|
+
*/
|
|
52
|
+
sanitizeInputFilePath(inputPath) {
|
|
53
|
+
if (inputPath.includes('\0')) {
|
|
54
|
+
return Err(new SecurityError('Null byte detected in file path'));
|
|
55
|
+
}
|
|
56
|
+
if (inputPath.includes('..')) {
|
|
57
|
+
return Err(new SecurityError('Path traversal attempt detected'));
|
|
58
|
+
}
|
|
59
|
+
const resolvedPath = path.resolve(inputPath);
|
|
60
|
+
// Resolve symlinks to prevent symlink-based traversal
|
|
61
|
+
try {
|
|
62
|
+
const realPath = fs.realpathSync(resolvedPath);
|
|
63
|
+
return Ok(realPath);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return Err(new SecurityError('File path cannot be resolved'));
|
|
76
67
|
}
|
|
77
|
-
return (0, result_1.Ok)(resolvedPath);
|
|
78
68
|
}
|
|
79
69
|
/**
|
|
80
70
|
* Validate image file extension
|
|
@@ -86,9 +76,9 @@ class SecurityManager {
|
|
|
86
76
|
const allowedExtensions = ['.png', '.jpg', '.jpeg', '.webp'];
|
|
87
77
|
const extension = path.extname(filePath).toLowerCase();
|
|
88
78
|
if (!allowedExtensions.includes(extension)) {
|
|
89
|
-
return
|
|
79
|
+
return Err(new SecurityError(`Unsupported file extension: ${extension}`));
|
|
90
80
|
}
|
|
91
|
-
return
|
|
81
|
+
return Ok(undefined);
|
|
92
82
|
}
|
|
93
83
|
/**
|
|
94
84
|
* Validate directory path for security
|
|
@@ -101,7 +91,7 @@ class SecurityManager {
|
|
|
101
91
|
if (!pathValidation.success) {
|
|
102
92
|
return pathValidation;
|
|
103
93
|
}
|
|
104
|
-
return
|
|
94
|
+
return Ok(undefined);
|
|
105
95
|
}
|
|
106
96
|
/**
|
|
107
97
|
* Generate secure temporary file path
|
|
@@ -111,7 +101,7 @@ class SecurityManager {
|
|
|
111
101
|
*/
|
|
112
102
|
generateSecureTempPath(baseName, extension) {
|
|
113
103
|
const timestamp = Date.now();
|
|
114
|
-
const randomSuffix =
|
|
104
|
+
const randomSuffix = randomBytes(6).toString('hex');
|
|
115
105
|
const secureFilename = `${baseName}-${timestamp}-${randomSuffix}${extension}`;
|
|
116
106
|
return path.join('/tmp', secureFilename);
|
|
117
107
|
}
|
|
@@ -131,7 +121,7 @@ class SecurityManager {
|
|
|
131
121
|
*/
|
|
132
122
|
sanitizeFilename(filename) {
|
|
133
123
|
// Remove null bytes and path separators
|
|
134
|
-
let sanitized = filename.replace(/[\0
|
|
124
|
+
let sanitized = filename.replace(/[\0/\\]/g, '');
|
|
135
125
|
// Remove control characters (ASCII 0-31 and 127) by filtering each character
|
|
136
126
|
sanitized = sanitized
|
|
137
127
|
.split('')
|
|
@@ -149,5 +139,4 @@ class SecurityManager {
|
|
|
149
139
|
return sanitized;
|
|
150
140
|
}
|
|
151
141
|
}
|
|
152
|
-
exports.SecurityManager = SecurityManager;
|
|
153
142
|
//# sourceMappingURL=security.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-image",
|
|
3
3
|
"mcpName": "io.github.shinpr/mcp-image",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.2",
|
|
5
5
|
"description": "MCP server for AI image generation",
|
|
6
|
+
"type": "module",
|
|
6
7
|
"main": "dist/index.js",
|
|
7
8
|
"bin": {
|
|
8
9
|
"mcp-image": "./dist/index.js"
|
|
@@ -55,9 +56,8 @@
|
|
|
55
56
|
"lint:fix": "biome lint --write src",
|
|
56
57
|
"check": "biome check src",
|
|
57
58
|
"check:fix": "biome check --write src",
|
|
58
|
-
"check:unused": "ts-prune --project tsconfig.json --ignore 'src/index.ts|__tests__|test|vitest'",
|
|
59
59
|
"check:deps": "madge --circular --extensions ts src",
|
|
60
|
-
"check:all": "npm run check && npm run lint && npm run format:check && npm run check:
|
|
60
|
+
"check:all": "npm run check && npm run lint && npm run format:check && npm run check:deps && npm run build && npm run test",
|
|
61
61
|
"cleanup:processes": "bash ./scripts/cleanup-test-processes.sh",
|
|
62
62
|
"test:safe": "npm test && npm run cleanup:processes"
|
|
63
63
|
},
|
|
@@ -66,21 +66,17 @@
|
|
|
66
66
|
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
|
-
"@biomejs/biome": "^
|
|
70
|
-
"@
|
|
71
|
-
"@
|
|
72
|
-
"@vitest/
|
|
73
|
-
"@vitest/ui": "^3.2.4",
|
|
74
|
-
"c8": "^10.1.3",
|
|
69
|
+
"@biomejs/biome": "^2.4.6",
|
|
70
|
+
"@types/node": "^25.3.5",
|
|
71
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
72
|
+
"@vitest/ui": "^4.0.18",
|
|
75
73
|
"husky": "^9.1.7",
|
|
76
|
-
"lint-staged": "^16.
|
|
74
|
+
"lint-staged": "^16.3.2",
|
|
77
75
|
"madge": "^8.0.0",
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"typescript": "^5.0.0",
|
|
83
|
-
"vitest": "^3.2.4"
|
|
76
|
+
"tsc-alias": "^1.8.16",
|
|
77
|
+
"tsx": "^4.21.0",
|
|
78
|
+
"typescript": "^5.9.3",
|
|
79
|
+
"vitest": "^4.0.18"
|
|
84
80
|
},
|
|
85
81
|
"engines": {
|
|
86
82
|
"node": ">=20"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: image-generation
|
|
3
|
-
description:
|
|
3
|
+
description: Optimizes image generation prompts using Subject-Context-Style structure. Use this skill when generating images, creating illustrations, photos, visual assets, editing images, or crafting prompts for any image generation model.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Image Generation Prompt Best Practices
|
|
@@ -11,40 +11,37 @@ Enhance every image generation prompt around three core elements:
|
|
|
11
11
|
|
|
12
12
|
### 1. SUBJECT (What)
|
|
13
13
|
|
|
14
|
-
The main focus of the image.
|
|
15
|
-
|
|
16
14
|
- Physical characteristics: textures, materials, colors, scale
|
|
17
15
|
- Actions, poses, expressions if applicable
|
|
18
16
|
- Distinctive features that define the subject
|
|
19
17
|
|
|
20
18
|
### 2. CONTEXT (Where/When)
|
|
21
19
|
|
|
22
|
-
The environment and conditions.
|
|
23
|
-
|
|
24
20
|
- Setting, background, spatial relationships (foreground, midground, background)
|
|
25
21
|
- Time of day, weather, atmospheric conditions
|
|
26
22
|
- Mood and emotional tone of the scene
|
|
27
23
|
|
|
28
24
|
### 3. STYLE (How)
|
|
29
25
|
|
|
30
|
-
The visual treatment.
|
|
31
|
-
|
|
32
26
|
- Artistic or photographic approach: reference specific artists, movements, or styles
|
|
33
|
-
- Lighting design: direction, quality, color temperature, shadows
|
|
34
27
|
- Camera/lens choices: specify focal length, aperture, and shooting angle when photographic
|
|
35
28
|
|
|
36
29
|
## Core Principles
|
|
37
30
|
|
|
38
|
-
- **Preserve intent** —
|
|
31
|
+
- **Preserve intent** — Add visual details (lighting, texture, composition) only in areas the user left unspecified; keep all user-specified elements unchanged
|
|
39
32
|
- **Positive descriptions only** — Describe what should be present; rephrase any exclusion as an inclusion
|
|
40
33
|
- **Specific over vague** — "golden hour sunlight at 15° angle" beats "nice lighting"
|
|
41
34
|
- **Natural flow** — Weave elements into a single flowing description, not a bullet list
|
|
42
35
|
|
|
36
|
+
## Output Format
|
|
37
|
+
|
|
38
|
+
Return the enhanced prompt as a single flowing paragraph. When the user provides multiple requests, return each as a separate enhanced prompt under a labeled heading.
|
|
39
|
+
|
|
43
40
|
## Enhancement Patterns
|
|
44
41
|
|
|
45
42
|
### Hyper-Specific Details
|
|
46
43
|
|
|
47
|
-
Add concrete visual details
|
|
44
|
+
Add concrete visual details for any Subject/Context/Style element not specified by the user:
|
|
48
45
|
|
|
49
46
|
- Lighting → direction, quality, color temperature, shadow behavior
|
|
50
47
|
- Textures → surface materials, weathering, reflectivity
|
|
@@ -64,8 +61,7 @@ When a photographic look is appropriate:
|
|
|
64
61
|
|
|
65
62
|
Convey mood through environmental details:
|
|
66
63
|
|
|
67
|
-
- Emotional tone: "serene", "ominous", "jubilant"
|
|
68
|
-
- Light quality: "dappled shadows", "harsh midday sun", "soft diffused overcast"
|
|
64
|
+
- Emotional tone with visual indicators: "serene (soft diffused light, muted palette)", "ominous (low contrast, heavy shadows, desaturated)", "jubilant (high saturation, warm tones, dynamic motion)"
|
|
69
65
|
- Weather/air: "morning mist", "dust particles in a sunbeam"
|
|
70
66
|
|
|
71
67
|
### Text in Images
|
|
@@ -86,12 +82,12 @@ When the same character must be recognizable across multiple images:
|
|
|
86
82
|
- Use anchoring words: "distinctive", "signature", "always wears", "always has"
|
|
87
83
|
- Be specific: "round tortoiseshell glasses" not just "glasses"
|
|
88
84
|
|
|
89
|
-
### Compositional Integration
|
|
85
|
+
### Compositional Integration
|
|
90
86
|
|
|
91
87
|
When combining multiple visual elements in one scene:
|
|
92
88
|
|
|
93
89
|
- Define spatial relationships with proportions: "foreground (40% of frame)", "midground", "background"
|
|
94
|
-
-
|
|
90
|
+
- Define how elements interact spatially and visually: overlap, reflection, shared lighting, color echo between foreground and background
|
|
95
91
|
- Specify relative scale and interaction between elements
|
|
96
92
|
|
|
97
93
|
### Real-World Accuracy
|
|
@@ -123,6 +119,16 @@ When modifying an existing image:
|
|
|
123
119
|
- Be specific about what to change vs what to keep unchanged
|
|
124
120
|
- Describe modifications relative to the existing image, not from scratch
|
|
125
121
|
|
|
122
|
+
## Ambiguous Cases
|
|
123
|
+
|
|
124
|
+
- When user intent is unclear between photographic and illustrative style, ask before enhancing
|
|
125
|
+
- When enhancement would significantly change the user's concept, present the original interpretation alongside the enhanced version
|
|
126
|
+
- When cultural or historical accuracy cannot be verified, flag the uncertainty rather than guessing
|
|
127
|
+
|
|
128
|
+
## Scope
|
|
129
|
+
|
|
130
|
+
This skill covers static image prompt enhancement only. It does not cover video generation, 3D rendering, or image analysis/description.
|
|
131
|
+
|
|
126
132
|
## Example
|
|
127
133
|
|
|
128
134
|
**Input:** "A happy dog in a park"
|