@avclabs.ai/media-mcp 0.2.0 → 0.3.0
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/README.md +398 -184
- package/README_CN.md +633 -0
- package/config.json +1 -0
- package/dist/image-enhancement.d.ts +3 -0
- package/dist/image-enhancement.d.ts.map +1 -0
- package/dist/image-enhancement.js +185 -0
- package/dist/image-enhancement.js.map +1 -0
- package/dist/sam3.d.ts +7 -0
- package/dist/sam3.d.ts.map +1 -1
- package/dist/sam3.js +148 -104
- package/dist/sam3.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +80 -56
- package/dist/server.js.map +1 -1
- package/dist/service-config.d.ts +62 -0
- package/dist/service-config.d.ts.map +1 -0
- package/dist/service-config.js +58 -0
- package/dist/service-config.js.map +1 -0
- package/dist/tooling.d.ts +42 -0
- package/dist/tooling.d.ts.map +1 -0
- package/dist/tooling.js +153 -0
- package/dist/tooling.js.map +1 -0
- package/dist/tos.d.ts +35 -0
- package/dist/tos.d.ts.map +1 -0
- package/dist/tos.js +281 -0
- package/dist/tos.js.map +1 -0
- package/dist/upload.d.ts +79 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +190 -0
- package/dist/upload.js.map +1 -0
- package/dist/video-enhancement.d.ts.map +1 -1
- package/dist/video-enhancement.js +95 -175
- package/dist/video-enhancement.js.map +1 -1
- package/package.json +11 -6
- package/README_EN.md +0 -419
package/dist/server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* MCP Server -
|
|
3
|
+
* MCP Server - Video enhancement, image enhancement/colorization/denoising, and SAM3 image segmentation
|
|
4
4
|
*/
|
|
5
5
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
6
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
@@ -8,67 +8,89 @@ import * as fs from 'fs';
|
|
|
8
8
|
import * as path from 'path';
|
|
9
9
|
import { fileURLToPath } from 'url';
|
|
10
10
|
import { setupVideoEnhancementTools } from './video-enhancement.js';
|
|
11
|
+
import { setupImageEnhancementTools } from './image-enhancement.js';
|
|
11
12
|
import { setupSam3Tools } from './sam3.js';
|
|
13
|
+
import { resolveMediaHostConfig } from './service-config.js';
|
|
12
14
|
const __filename = fileURLToPath(import.meta.url);
|
|
13
15
|
const __dirname = path.dirname(__filename);
|
|
14
|
-
function
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
16
|
+
function parseConfigFile(configPath) {
|
|
17
|
+
let raw;
|
|
18
|
+
try {
|
|
19
|
+
raw = fs.readFileSync(configPath, 'utf-8');
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
console.error(`Error: cannot read config file ${configPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
let config;
|
|
26
|
+
try {
|
|
27
|
+
config = JSON.parse(raw);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.error(`Error: config file ${configPath} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
// Absent keys stay undefined; defaults are applied by resolveMediaHostConfig.
|
|
34
|
+
return {
|
|
35
|
+
baseUrl: typeof config.baseUrl === 'string' ? config.baseUrl : undefined,
|
|
36
|
+
imageBaseUrl: typeof config.imageBaseUrl === 'string' ? config.imageBaseUrl : undefined,
|
|
37
|
+
sam3BaseUrl: typeof config.sam3BaseUrl === 'string' ? config.sam3BaseUrl : undefined,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function loadConfig(explicitConfigPath) {
|
|
41
|
+
if (explicitConfigPath) {
|
|
42
|
+
const resolved = path.resolve(explicitConfigPath);
|
|
43
|
+
console.error(`Using config file: ${resolved}`);
|
|
44
|
+
return parseConfigFile(resolved);
|
|
45
|
+
}
|
|
46
|
+
// Only the config bundled with the package is considered; a config.json in
|
|
47
|
+
// the caller's working directory must never silently redirect API traffic.
|
|
48
|
+
const bundledPath = path.resolve(__dirname, '..', 'config.json');
|
|
49
|
+
if (fs.existsSync(bundledPath)) {
|
|
50
|
+
return parseConfigFile(bundledPath);
|
|
51
|
+
}
|
|
52
|
+
return {};
|
|
53
|
+
}
|
|
54
|
+
// Collect CLI values without consulting the environment; precedence between
|
|
55
|
+
// layers is resolved by resolveMediaHostConfig.
|
|
56
|
+
function parseCliOverrides(args) {
|
|
57
|
+
const overrides = {};
|
|
58
|
+
for (let i = 0; i < args.length; i++) {
|
|
59
|
+
const takeValue = (key) => {
|
|
60
|
+
overrides[key] = args[i + 1];
|
|
61
|
+
i++;
|
|
62
|
+
};
|
|
63
|
+
if (args[i] === '--base-url' && i + 1 < args.length)
|
|
64
|
+
takeValue('baseUrl');
|
|
65
|
+
else if (args[i] === '--image-base-url' && i + 1 < args.length)
|
|
66
|
+
takeValue('imageBaseUrl');
|
|
67
|
+
else if (args[i] === '--api-key' && i + 1 < args.length)
|
|
68
|
+
takeValue('apiKey');
|
|
69
|
+
else if (args[i] === '--sam3-base-url' && i + 1 < args.length)
|
|
70
|
+
takeValue('sam3BaseUrl');
|
|
71
|
+
else if (args[i] === '--sam3-poll-interval' && i + 1 < args.length)
|
|
72
|
+
takeValue('sam3PollIntervalMs');
|
|
73
|
+
else if (args[i] === '--sam3-poll-max-attempts' && i + 1 < args.length)
|
|
74
|
+
takeValue('sam3PollMaxAttempts');
|
|
32
75
|
}
|
|
33
|
-
return
|
|
76
|
+
return overrides;
|
|
34
77
|
}
|
|
35
|
-
//
|
|
78
|
+
// Main entry
|
|
36
79
|
async function main() {
|
|
37
80
|
const args = process.argv.slice(2);
|
|
38
|
-
|
|
39
|
-
let baseUrl = process.env.HTTP_API_BASE_URL || config.baseUrl;
|
|
40
|
-
let apiKey = process.env.API_KEY || '';
|
|
41
|
-
let sam3BaseUrl = process.env.SAM3_API_BASE_URL || config.sam3BaseUrl;
|
|
42
|
-
let sam3ApiKey = apiKey;
|
|
43
|
-
let sam3PollInterval = parseInt(process.env.SAM3_POLL_INTERVAL || '2000', 10);
|
|
44
|
-
let sam3PollMaxAttempts = parseInt(process.env.SAM3_POLL_MAX_ATTEMPTS || '25', 10);
|
|
45
|
-
// 解析命令行参数
|
|
81
|
+
let explicitConfigPath;
|
|
46
82
|
for (let i = 0; i < args.length; i++) {
|
|
47
|
-
if (args[i] === '--
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
else if (args[i] === '--api-key' && i + 1 < args.length) {
|
|
52
|
-
apiKey = args[i + 1];
|
|
53
|
-
i++;
|
|
54
|
-
}
|
|
55
|
-
else if (args[i] === '--sam3-base-url' && i + 1 < args.length) {
|
|
56
|
-
sam3BaseUrl = args[i + 1];
|
|
57
|
-
i++;
|
|
83
|
+
if (args[i] === '--config' && i + 1 < args.length) {
|
|
84
|
+
explicitConfigPath = args[i + 1];
|
|
85
|
+
break;
|
|
58
86
|
}
|
|
59
|
-
else if (args[i] === '--sam3-poll-interval' && i + 1 < args.length) {
|
|
60
|
-
sam3PollInterval = parseInt(args[i + 1], 10);
|
|
61
|
-
i++;
|
|
62
|
-
}
|
|
63
|
-
else if (args[i] === '--sam3-poll-max-attempts' && i + 1 < args.length) {
|
|
64
|
-
sam3PollMaxAttempts = parseInt(args[i + 1], 10);
|
|
65
|
-
i++;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
if (!apiKey) {
|
|
69
|
-
console.error('错误: 需要提供 --api-key 或设置 API_KEY 环境变量');
|
|
70
|
-
process.exit(1);
|
|
71
87
|
}
|
|
88
|
+
const fileConfig = loadConfig(explicitConfigPath);
|
|
89
|
+
// SAM3's sync wait is bounded by two independent limits derived from its
|
|
90
|
+
// config: at most SAM3_POLL_MAX_ATTEMPTS status queries and a time budget of
|
|
91
|
+
// interval x attempts (default 25 x 2000 ms = 50 s). Whichever runs out
|
|
92
|
+
// first truncates the wait; the task keeps running remotely either way.
|
|
93
|
+
const hostConfig = resolveMediaHostConfig({ cli: parseCliOverrides(args), env: process.env, file: fileConfig });
|
|
72
94
|
const server = new McpServer({
|
|
73
95
|
name: 'media-mcp',
|
|
74
96
|
version: '0.3.0',
|
|
@@ -77,10 +99,12 @@ async function main() {
|
|
|
77
99
|
tools: {},
|
|
78
100
|
},
|
|
79
101
|
});
|
|
80
|
-
//
|
|
81
|
-
setupVideoEnhancementTools(server,
|
|
82
|
-
//
|
|
83
|
-
|
|
102
|
+
// Register video enhancement tools
|
|
103
|
+
setupVideoEnhancementTools(server, hostConfig.enhancementApiBaseUrl, hostConfig.apiKey);
|
|
104
|
+
// Register image enhancement tools
|
|
105
|
+
setupImageEnhancementTools(server, hostConfig.imageApiBaseUrl, hostConfig.apiKey);
|
|
106
|
+
// Register SAM3 tools
|
|
107
|
+
setupSam3Tools(server, hostConfig.sam3ApiBaseUrl, hostConfig.apiKey, hostConfig.sam3PollIntervalMs, hostConfig.sam3PollMaxAttempts);
|
|
84
108
|
const transport = new StdioServerTransport();
|
|
85
109
|
await server.connect(transport);
|
|
86
110
|
console.error('MCP Server running on stdio');
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export declare const SAM3_POLL_INTERVAL_MS_BOUNDS: {
|
|
2
|
+
readonly min: 500;
|
|
3
|
+
readonly max: 60000;
|
|
4
|
+
};
|
|
5
|
+
export declare const SAM3_POLL_MAX_ATTEMPTS_BOUNDS: {
|
|
6
|
+
readonly min: 1;
|
|
7
|
+
readonly max: 1000;
|
|
8
|
+
};
|
|
9
|
+
export declare class ConfigError extends Error {
|
|
10
|
+
}
|
|
11
|
+
export interface MediaHostFileConfig {
|
|
12
|
+
baseUrl?: string;
|
|
13
|
+
imageBaseUrl?: string;
|
|
14
|
+
sam3BaseUrl?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface MediaHostCliOverrides {
|
|
17
|
+
baseUrl?: string;
|
|
18
|
+
imageBaseUrl?: string;
|
|
19
|
+
sam3BaseUrl?: string;
|
|
20
|
+
apiKey?: string;
|
|
21
|
+
/** Raw argument text; parsed and bounds-checked here. */
|
|
22
|
+
sam3PollIntervalMs?: string;
|
|
23
|
+
sam3PollMaxAttempts?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface MediaHostEnv {
|
|
26
|
+
API_KEY?: string;
|
|
27
|
+
HTTP_API_BASE_URL?: string;
|
|
28
|
+
IMAGE_API_BASE_URL?: string;
|
|
29
|
+
SAM3_API_BASE_URL?: string;
|
|
30
|
+
/** Canonical name. */
|
|
31
|
+
SAM3_POLL_INTERVAL_MS?: string;
|
|
32
|
+
/** Deprecated alias of SAM3_POLL_INTERVAL_MS. */
|
|
33
|
+
SAM3_POLL_INTERVAL?: string;
|
|
34
|
+
SAM3_POLL_MAX_ATTEMPTS?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface MediaHostConfig {
|
|
37
|
+
enhancementApiBaseUrl: string;
|
|
38
|
+
imageApiBaseUrl: string;
|
|
39
|
+
sam3ApiBaseUrl: string;
|
|
40
|
+
apiKey: string;
|
|
41
|
+
sam3PollIntervalMs: number;
|
|
42
|
+
sam3PollMaxAttempts: number;
|
|
43
|
+
}
|
|
44
|
+
export declare function parseSam3WaitInt(raw: string | undefined, name: string, bounds: {
|
|
45
|
+
min: number;
|
|
46
|
+
max: number;
|
|
47
|
+
}, fallback: number): number;
|
|
48
|
+
/**
|
|
49
|
+
* Resolves the final Media host configuration.
|
|
50
|
+
*
|
|
51
|
+
* Precedence per key: CLI override > environment > file config > built-in
|
|
52
|
+
* default. The image API base URL is derived only after the merge: an unset
|
|
53
|
+
* image base falls back to the resolved enhancement base, no matter which
|
|
54
|
+
* layer provided it. All validation happens here, before any tool is created
|
|
55
|
+
* or request is made; error messages never echo secret values.
|
|
56
|
+
*/
|
|
57
|
+
export declare function resolveMediaHostConfig(options: {
|
|
58
|
+
cli?: MediaHostCliOverrides;
|
|
59
|
+
env?: MediaHostEnv;
|
|
60
|
+
file?: MediaHostFileConfig;
|
|
61
|
+
}): MediaHostConfig;
|
|
62
|
+
//# sourceMappingURL=service-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-config.d.ts","sourceRoot":"","sources":["../src/service-config.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,4BAA4B;;;CAAoC,CAAC;AAC9E,eAAO,MAAM,6BAA6B;;;CAAiC,CAAC;AAO5E,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAEzC,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAWD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACpC,QAAQ,EAAE,MAAM,GACf,MAAM,CAOR;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,GAAG,CAAC,EAAE,qBAAqB,CAAC;IAC5B,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,IAAI,CAAC,EAAE,mBAAmB,CAAC;CAC5B,GAAG,eAAe,CAkClB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Media host configuration: one deep module owning precedence, validation,
|
|
2
|
+
// and derivation for everything the enhancement and SAM3 hosts need. Adapters
|
|
3
|
+
// consume the resolved MediaHostConfig; callers never merge layers themselves
|
|
4
|
+
// and never need to know variable initialization order.
|
|
5
|
+
export const SAM3_POLL_INTERVAL_MS_BOUNDS = { min: 500, max: 60000 };
|
|
6
|
+
export const SAM3_POLL_MAX_ATTEMPTS_BOUNDS = { min: 1, max: 1000 };
|
|
7
|
+
const DEFAULT_ENHANCEMENT_API_BASE_URL = 'https://mcp.avc.ai/enhance';
|
|
8
|
+
const DEFAULT_SAM3_API_BASE_URL = 'https://mcp.avc.ai/sam';
|
|
9
|
+
const DEFAULT_SAM3_POLL_INTERVAL_MS = 2000;
|
|
10
|
+
const DEFAULT_SAM3_POLL_MAX_ATTEMPTS = 25;
|
|
11
|
+
export class ConfigError extends Error {
|
|
12
|
+
}
|
|
13
|
+
// Blank values are "not provided" at every layer, so a resolved address is
|
|
14
|
+
// never empty and a blank override cannot mask a valid lower layer.
|
|
15
|
+
function highestPrecedence(...values) {
|
|
16
|
+
for (const value of values) {
|
|
17
|
+
if (value !== undefined && value.trim() !== '')
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
export function parseSam3WaitInt(raw, name, bounds, fallback) {
|
|
23
|
+
if (raw === undefined)
|
|
24
|
+
return fallback;
|
|
25
|
+
const parsed = Number.parseInt(raw, 10);
|
|
26
|
+
if (!Number.isFinite(parsed) || parsed < bounds.min || parsed > bounds.max) {
|
|
27
|
+
throw new ConfigError(`Invalid ${name} "${raw}": expected an integer between ${bounds.min} and ${bounds.max}`);
|
|
28
|
+
}
|
|
29
|
+
return parsed;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Resolves the final Media host configuration.
|
|
33
|
+
*
|
|
34
|
+
* Precedence per key: CLI override > environment > file config > built-in
|
|
35
|
+
* default. The image API base URL is derived only after the merge: an unset
|
|
36
|
+
* image base falls back to the resolved enhancement base, no matter which
|
|
37
|
+
* layer provided it. All validation happens here, before any tool is created
|
|
38
|
+
* or request is made; error messages never echo secret values.
|
|
39
|
+
*/
|
|
40
|
+
export function resolveMediaHostConfig(options) {
|
|
41
|
+
const cli = options.cli ?? {};
|
|
42
|
+
const env = options.env ?? {};
|
|
43
|
+
const file = options.file ?? {};
|
|
44
|
+
const enhancementApiBaseUrl = highestPrecedence(cli.baseUrl, env.HTTP_API_BASE_URL, file.baseUrl) ?? DEFAULT_ENHANCEMENT_API_BASE_URL;
|
|
45
|
+
const sam3ApiBaseUrl = highestPrecedence(cli.sam3BaseUrl, env.SAM3_API_BASE_URL, file.sam3BaseUrl) ?? DEFAULT_SAM3_API_BASE_URL;
|
|
46
|
+
const imageApiBaseUrl = highestPrecedence(cli.imageBaseUrl, env.IMAGE_API_BASE_URL, file.imageBaseUrl) ?? enhancementApiBaseUrl;
|
|
47
|
+
const apiKey = highestPrecedence(cli.apiKey, env.API_KEY);
|
|
48
|
+
if (!apiKey) {
|
|
49
|
+
throw new ConfigError('API key is required: pass --api-key or set the API_KEY environment variable');
|
|
50
|
+
}
|
|
51
|
+
// SAM3_POLL_INTERVAL_MS is the canonical name; SAM3_POLL_INTERVAL is kept as
|
|
52
|
+
// a deprecated alias. Both are milliseconds (unlike the per-tool
|
|
53
|
+
// poll_interval argument, which is seconds).
|
|
54
|
+
const sam3PollIntervalMs = parseSam3WaitInt(highestPrecedence(cli.sam3PollIntervalMs, env.SAM3_POLL_INTERVAL_MS, env.SAM3_POLL_INTERVAL), 'SAM3_POLL_INTERVAL_MS', SAM3_POLL_INTERVAL_MS_BOUNDS, DEFAULT_SAM3_POLL_INTERVAL_MS);
|
|
55
|
+
const sam3PollMaxAttempts = parseSam3WaitInt(highestPrecedence(cli.sam3PollMaxAttempts, env.SAM3_POLL_MAX_ATTEMPTS), 'SAM3_POLL_MAX_ATTEMPTS', SAM3_POLL_MAX_ATTEMPTS_BOUNDS, DEFAULT_SAM3_POLL_MAX_ATTEMPTS);
|
|
56
|
+
return { enhancementApiBaseUrl, imageApiBaseUrl, sam3ApiBaseUrl, apiKey, sam3PollIntervalMs, sam3PollMaxAttempts };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=service-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-config.js","sourceRoot":"","sources":["../src/service-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export declare function registerTool(server: McpServer, name: string, description: string, schema: z.ZodRawShape, handler: (args: any) => Promise<unknown>): void;
|
|
4
|
+
export declare const POLL_REQUEST_TIMEOUT_MS = 10000;
|
|
5
|
+
export declare const MAX_CONSECUTIVE_POLL_FAILURES = 3;
|
|
6
|
+
export declare const MAX_UNKNOWN_STATUS_SIGHTINGS = 3;
|
|
7
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
8
|
+
export declare function clampNumber(value: number, min: number, max: number, fallback: number): number;
|
|
9
|
+
export declare function remainingSleepMs(intervalMs: number, deadline: number, now?: number): number;
|
|
10
|
+
export declare function requestBudgetMs(deadline: number, now?: number): number;
|
|
11
|
+
export type StatusKind = 'ok' | 'failed' | 'processing' | 'unknown';
|
|
12
|
+
export declare function classifyStatus(status: unknown): StatusKind;
|
|
13
|
+
export interface PollFetchResult {
|
|
14
|
+
status: unknown;
|
|
15
|
+
payload: Record<string, any>;
|
|
16
|
+
}
|
|
17
|
+
export interface PollParams {
|
|
18
|
+
taskId: string;
|
|
19
|
+
timeoutSeconds: number;
|
|
20
|
+
pollIntervalSeconds: number;
|
|
21
|
+
fetchStatus: (signal: AbortSignal) => Promise<PollFetchResult>;
|
|
22
|
+
continueHint: string;
|
|
23
|
+
/**
|
|
24
|
+
* Independent query-count limit: the first query counts, and the wait is
|
|
25
|
+
* truncated as soon as this many queries have been made while the task is
|
|
26
|
+
* still processing (no trailing sleep). Time and count limits run in
|
|
27
|
+
* parallel; whichever is exhausted first ends the wait.
|
|
28
|
+
*/
|
|
29
|
+
maxAttempts?: number;
|
|
30
|
+
/** Injectable clock and delay for deterministic tests; defaults to real time. */
|
|
31
|
+
now?: () => number;
|
|
32
|
+
delay?: (ms: number) => Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Deadline- and attempt-aware polling: never sleeps past the deadline, aborts
|
|
36
|
+
* each status request at the remaining wait budget, tolerates transient
|
|
37
|
+
* network failures, treats unknown statuses as errors after a few sightings,
|
|
38
|
+
* and always keeps task_id in the response so the task is never lost.
|
|
39
|
+
* A cancellation fired at the budget edge is not counted as a query failure.
|
|
40
|
+
*/
|
|
41
|
+
export declare function pollUntilTerminal(params: PollParams): Promise<Record<string, any>>;
|
|
42
|
+
//# sourceMappingURL=tooling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooling.d.ts","sourceRoot":"","sources":["../src/tooling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,CAAC,WAAW,EACrB,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,GACvC,IAAI,CAeN;AAMD,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAC7C,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG7F;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAEvG;AAID,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAElF;AAMD,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;AAEpE,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,CAM1D;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAQD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CA2FxF"}
|
package/dist/tooling.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Tool registration wrapper: business failures surface as MCP isError results
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
export function registerTool(server, name, description, schema, handler) {
|
|
5
|
+
server.tool(name, description, schema, async (args) => {
|
|
6
|
+
try {
|
|
7
|
+
const result = await handler(args);
|
|
8
|
+
const text = typeof result === 'string' ? result : JSON.stringify(result, null, 2);
|
|
9
|
+
const failed = typeof result === 'object' && result !== null && result.success === false;
|
|
10
|
+
return { content: [{ type: 'text', text }], ...(failed ? { isError: true } : {}) };
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
14
|
+
return {
|
|
15
|
+
content: [{ type: 'text', text: JSON.stringify({ success: false, error: message }, null, 2) }],
|
|
16
|
+
isError: true,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Polling primitives
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
export const POLL_REQUEST_TIMEOUT_MS = 10000;
|
|
25
|
+
export const MAX_CONSECUTIVE_POLL_FAILURES = 3;
|
|
26
|
+
export const MAX_UNKNOWN_STATUS_SIGHTINGS = 3;
|
|
27
|
+
export function sleep(ms) {
|
|
28
|
+
return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
|
|
29
|
+
}
|
|
30
|
+
export function clampNumber(value, min, max, fallback) {
|
|
31
|
+
if (!Number.isFinite(value))
|
|
32
|
+
return fallback;
|
|
33
|
+
return Math.min(max, Math.max(min, value));
|
|
34
|
+
}
|
|
35
|
+
export function remainingSleepMs(intervalMs, deadline, now = Date.now()) {
|
|
36
|
+
return Math.max(0, Math.min(intervalMs, deadline - now));
|
|
37
|
+
}
|
|
38
|
+
// A single status request never outlives the remaining wait budget (and never
|
|
39
|
+
// runs with timeout 0, which axios treats as "no timeout").
|
|
40
|
+
export function requestBudgetMs(deadline, now = Date.now()) {
|
|
41
|
+
return Math.max(250, Math.min(POLL_REQUEST_TIMEOUT_MS, deadline - now));
|
|
42
|
+
}
|
|
43
|
+
const TERMINAL_OK_STATUSES = new Set(['completed', 'succeeded', 'success']);
|
|
44
|
+
const TERMINAL_FAIL_STATUSES = new Set(['failed', 'canceled', 'cancelled', 'expired', 'rejected']);
|
|
45
|
+
const TRANSIENT_STATUSES = new Set(['processing', 'pending', 'running', 'queued']);
|
|
46
|
+
export function classifyStatus(status) {
|
|
47
|
+
const normalized = typeof status === 'string' ? status.toLowerCase() : '';
|
|
48
|
+
if (TERMINAL_OK_STATUSES.has(normalized))
|
|
49
|
+
return 'ok';
|
|
50
|
+
if (TERMINAL_FAIL_STATUSES.has(normalized))
|
|
51
|
+
return 'failed';
|
|
52
|
+
if (TRANSIENT_STATUSES.has(normalized))
|
|
53
|
+
return 'processing';
|
|
54
|
+
return 'unknown';
|
|
55
|
+
}
|
|
56
|
+
function formatElapsedSeconds(ms) {
|
|
57
|
+
const seconds = ms / 1000;
|
|
58
|
+
if (seconds >= 10)
|
|
59
|
+
return `${Math.round(seconds)} seconds`;
|
|
60
|
+
return `${(Math.round(seconds * 10) / 10).toFixed(1)} seconds`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Deadline- and attempt-aware polling: never sleeps past the deadline, aborts
|
|
64
|
+
* each status request at the remaining wait budget, tolerates transient
|
|
65
|
+
* network failures, treats unknown statuses as errors after a few sightings,
|
|
66
|
+
* and always keeps task_id in the response so the task is never lost.
|
|
67
|
+
* A cancellation fired at the budget edge is not counted as a query failure.
|
|
68
|
+
*/
|
|
69
|
+
export async function pollUntilTerminal(params) {
|
|
70
|
+
const now = params.now ?? Date.now;
|
|
71
|
+
const delay = params.delay ?? sleep;
|
|
72
|
+
// Budget bounds are the caller's contract (tool schemas validate before task
|
|
73
|
+
// submission); a non-finite or sub-second budget falls back to the historical
|
|
74
|
+
// 45 s default rather than being silently rewritten to some other cap.
|
|
75
|
+
const timeoutSeconds = Number.isFinite(params.timeoutSeconds) && params.timeoutSeconds >= 1 ? params.timeoutSeconds : 45;
|
|
76
|
+
const intervalMs = Number.isFinite(params.pollIntervalSeconds) && params.pollIntervalSeconds >= 0.5
|
|
77
|
+
? params.pollIntervalSeconds * 1000
|
|
78
|
+
: 5000;
|
|
79
|
+
const maxAttempts = params.maxAttempts === undefined ? Number.POSITIVE_INFINITY : Math.floor(params.maxAttempts);
|
|
80
|
+
const startedAt = now();
|
|
81
|
+
const deadline = startedAt + timeoutSeconds * 1000;
|
|
82
|
+
let consecutiveFailures = 0;
|
|
83
|
+
let unknownSightings = 0;
|
|
84
|
+
let attempts = 0;
|
|
85
|
+
while (attempts < maxAttempts && now() < deadline) {
|
|
86
|
+
attempts++;
|
|
87
|
+
const requestBudget = requestBudgetMs(deadline, now());
|
|
88
|
+
const controller = new AbortController();
|
|
89
|
+
const abortTimer = setTimeout(() => controller.abort(), requestBudget);
|
|
90
|
+
const budgetExceeded = new Promise((_, reject) => {
|
|
91
|
+
controller.signal.addEventListener('abort', () => reject(new Error(`Status request aborted at the wait budget edge (capped at ${requestBudget} ms)`)), { once: true });
|
|
92
|
+
});
|
|
93
|
+
let fetched;
|
|
94
|
+
try {
|
|
95
|
+
fetched = await Promise.race([params.fetchStatus(controller.signal), budgetExceeded]);
|
|
96
|
+
consecutiveFailures = 0;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (now() >= deadline) {
|
|
100
|
+
// The request was cancelled by the wait budget, not by a query error.
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
consecutiveFailures++;
|
|
104
|
+
if (consecutiveFailures >= MAX_CONSECUTIVE_POLL_FAILURES) {
|
|
105
|
+
return {
|
|
106
|
+
success: false,
|
|
107
|
+
task_id: params.taskId,
|
|
108
|
+
status: 'unknown',
|
|
109
|
+
error: `Status polling failed ${consecutiveFailures} times in a row: ${error instanceof Error ? error.message : String(error)}`,
|
|
110
|
+
note: `The task has been created and may still be running. Use ${params.continueHint} with this task_id to follow up.`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
await delay(remainingSleepMs(intervalMs, deadline, now()));
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
clearTimeout(abortTimer);
|
|
118
|
+
}
|
|
119
|
+
const kind = classifyStatus(fetched.status);
|
|
120
|
+
if (kind === 'ok') {
|
|
121
|
+
return { success: true, task_id: params.taskId, status: fetched.status, ...fetched.payload };
|
|
122
|
+
}
|
|
123
|
+
if (kind === 'failed') {
|
|
124
|
+
return { success: false, task_id: params.taskId, status: fetched.status, ...fetched.payload };
|
|
125
|
+
}
|
|
126
|
+
if (kind === 'unknown') {
|
|
127
|
+
unknownSightings++;
|
|
128
|
+
if (unknownSightings >= MAX_UNKNOWN_STATUS_SIGHTINGS) {
|
|
129
|
+
return {
|
|
130
|
+
success: false,
|
|
131
|
+
task_id: params.taskId,
|
|
132
|
+
status: fetched.status ?? 'unknown',
|
|
133
|
+
error: `Unrecognized task status: ${JSON.stringify(fetched.status)}`,
|
|
134
|
+
note: `The backend reported an unknown status. Use ${params.continueHint} with this task_id to follow up manually.`,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Still processing: stop before exceeding either limit; no trailing sleep.
|
|
139
|
+
if (attempts >= maxAttempts || now() >= deadline) {
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
await delay(remainingSleepMs(intervalMs, deadline, now()));
|
|
143
|
+
}
|
|
144
|
+
const queryText = attempts === 1 ? '1 status query' : `${attempts} status queries`;
|
|
145
|
+
return {
|
|
146
|
+
success: true,
|
|
147
|
+
status: 'processing',
|
|
148
|
+
task_id: params.taskId,
|
|
149
|
+
message: `Task is still processing (waited ${formatElapsedSeconds(now() - startedAt)}, ${queryText}). Please use ${params.continueHint} to continue polling.`,
|
|
150
|
+
note: 'The synchronous wait for this long-running task has been truncated. Switch to task status polling.',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=tooling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooling.js","sourceRoot":"","sources":["../src/tooling.ts"],"names":[],"mappings":"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"}
|
package/dist/tos.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AxiosResponse } from 'axios';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
export declare const MAX_FILE_SIZE_BYTES: number;
|
|
4
|
+
export declare const TOS_UPLOAD_TIMEOUT_MS = 120000;
|
|
5
|
+
export declare const DOWNLOAD_TIMEOUT_MS = 15000;
|
|
6
|
+
export type MediaKind = 'image' | 'video';
|
|
7
|
+
export declare function checkLocalFile(filePath: string, kind: MediaKind): {
|
|
8
|
+
filePath: string;
|
|
9
|
+
fileName: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function decodeBase64Image(input: string): {
|
|
12
|
+
buffer: Buffer;
|
|
13
|
+
fileName: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function isPrivateIp(ip: string): boolean;
|
|
16
|
+
export declare function assertPublicHttpUrl(rawUrl: string): Promise<URL>;
|
|
17
|
+
export declare function downloadToBuffer(rawUrl: string): Promise<Buffer>;
|
|
18
|
+
export type UnwrapResult = {
|
|
19
|
+
ok: true;
|
|
20
|
+
data: any;
|
|
21
|
+
} | {
|
|
22
|
+
ok: false;
|
|
23
|
+
error: string;
|
|
24
|
+
};
|
|
25
|
+
export declare function unwrapEnvelope(response: Pick<AxiosResponse, 'data' | 'status'>, successCodes?: Set<number>): UnwrapResult;
|
|
26
|
+
export declare function formatRequestError(error: any, rawUrl?: string): string;
|
|
27
|
+
export interface TosUploadTarget {
|
|
28
|
+
url: string;
|
|
29
|
+
fileId: string;
|
|
30
|
+
objectKey: string;
|
|
31
|
+
fields: Record<string, string>;
|
|
32
|
+
}
|
|
33
|
+
export declare function parseTosSignature(signatureData: any): TosUploadTarget;
|
|
34
|
+
export declare function uploadToTos(target: TosUploadTarget, data: fs.ReadStream | Buffer, fileName: string): Promise<void>;
|
|
35
|
+
//# sourceMappingURL=tos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tos.d.ts","sourceRoot":"","sources":["../src/tos.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAKzB,eAAO,MAAM,mBAAmB,QAAoB,CAAC;AACrD,eAAO,MAAM,qBAAqB,SAAS,CAAC;AAC5C,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAMzC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AA+B1C,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAqBxG;AAeD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAarF;AAMD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAsB/C;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAsBtE;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBtE;AAMD,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAIlF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,QAAQ,CAAC,EAAE,YAAY,GAAE,GAAG,CAAC,MAAM,CAAyB,GAAG,YAAY,CAehJ;AAgBD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAatE;AAMD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AA2BD,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,GAAG,GAAG,eAAe,CA6CrE;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBxH"}
|