@evolinkai/mcp 0.0.0-stage → 1.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.
Files changed (103) hide show
  1. package/LICENSE +178 -0
  2. package/README.md +67 -2
  3. package/dist/core/src/config.d.ts +19 -0
  4. package/dist/core/src/config.d.ts.map +1 -0
  5. package/dist/core/src/config.js +88 -0
  6. package/dist/core/src/config.js.map +1 -0
  7. package/dist/core/src/data/model-params.d.ts +49 -0
  8. package/dist/core/src/data/model-params.d.ts.map +1 -0
  9. package/dist/core/src/data/model-params.generated.d.ts +2 -0
  10. package/dist/core/src/data/model-params.generated.d.ts.map +1 -0
  11. package/dist/core/src/data/model-params.generated.js +3 -0
  12. package/dist/core/src/data/model-params.generated.js.map +1 -0
  13. package/dist/core/src/data/model-params.js +22 -0
  14. package/dist/core/src/data/model-params.js.map +1 -0
  15. package/dist/core/src/request-context.d.ts +60 -0
  16. package/dist/core/src/request-context.d.ts.map +1 -0
  17. package/dist/core/src/request-context.js +39 -0
  18. package/dist/core/src/request-context.js.map +1 -0
  19. package/dist/core/src/server.d.ts +18 -0
  20. package/dist/core/src/server.d.ts.map +1 -0
  21. package/dist/core/src/server.js +84 -0
  22. package/dist/core/src/server.js.map +1 -0
  23. package/dist/core/src/services/api-client.d.ts +129 -0
  24. package/dist/core/src/services/api-client.d.ts.map +1 -0
  25. package/dist/core/src/services/api-client.js +163 -0
  26. package/dist/core/src/services/api-client.js.map +1 -0
  27. package/dist/core/src/services/error-handler.d.ts +51 -0
  28. package/dist/core/src/services/error-handler.d.ts.map +1 -0
  29. package/dist/core/src/services/error-handler.js +390 -0
  30. package/dist/core/src/services/error-handler.js.map +1 -0
  31. package/dist/core/src/services/file-client.d.ts +24 -0
  32. package/dist/core/src/services/file-client.d.ts.map +1 -0
  33. package/dist/core/src/services/file-client.js +100 -0
  34. package/dist/core/src/services/file-client.js.map +1 -0
  35. package/dist/core/src/services/http-policy.d.ts +40 -0
  36. package/dist/core/src/services/http-policy.d.ts.map +1 -0
  37. package/dist/core/src/services/http-policy.js +120 -0
  38. package/dist/core/src/services/http-policy.js.map +1 -0
  39. package/dist/core/src/services/model-catalog.d.ts +24 -0
  40. package/dist/core/src/services/model-catalog.d.ts.map +1 -0
  41. package/dist/core/src/services/model-catalog.js +45 -0
  42. package/dist/core/src/services/model-catalog.js.map +1 -0
  43. package/dist/core/src/services/param-validator.d.ts +21 -0
  44. package/dist/core/src/services/param-validator.d.ts.map +1 -0
  45. package/dist/core/src/services/param-validator.js +164 -0
  46. package/dist/core/src/services/param-validator.js.map +1 -0
  47. package/dist/core/src/services/pricing-client.d.ts +77 -0
  48. package/dist/core/src/services/pricing-client.d.ts.map +1 -0
  49. package/dist/core/src/services/pricing-client.js +332 -0
  50. package/dist/core/src/services/pricing-client.js.map +1 -0
  51. package/dist/core/src/services/upload-policy.d.ts +17 -0
  52. package/dist/core/src/services/upload-policy.d.ts.map +1 -0
  53. package/dist/core/src/services/upload-policy.js +160 -0
  54. package/dist/core/src/services/upload-policy.js.map +1 -0
  55. package/dist/core/src/tools/check-balance.d.ts +4 -0
  56. package/dist/core/src/tools/check-balance.d.ts.map +1 -0
  57. package/dist/core/src/tools/check-balance.js +78 -0
  58. package/dist/core/src/tools/check-balance.js.map +1 -0
  59. package/dist/core/src/tools/estimate-cost.d.ts +4 -0
  60. package/dist/core/src/tools/estimate-cost.d.ts.map +1 -0
  61. package/dist/core/src/tools/estimate-cost.js +127 -0
  62. package/dist/core/src/tools/estimate-cost.js.map +1 -0
  63. package/dist/core/src/tools/generate.d.ts +4 -0
  64. package/dist/core/src/tools/generate.d.ts.map +1 -0
  65. package/dist/core/src/tools/generate.js +178 -0
  66. package/dist/core/src/tools/generate.js.map +1 -0
  67. package/dist/core/src/tools/get-model.d.ts +5 -0
  68. package/dist/core/src/tools/get-model.d.ts.map +1 -0
  69. package/dist/core/src/tools/get-model.js +109 -0
  70. package/dist/core/src/tools/get-model.js.map +1 -0
  71. package/dist/core/src/tools/get-task.d.ts +7 -0
  72. package/dist/core/src/tools/get-task.d.ts.map +1 -0
  73. package/dist/core/src/tools/get-task.js +55 -0
  74. package/dist/core/src/tools/get-task.js.map +1 -0
  75. package/dist/core/src/tools/list-tasks.d.ts +6 -0
  76. package/dist/core/src/tools/list-tasks.d.ts.map +1 -0
  77. package/dist/core/src/tools/list-tasks.js +142 -0
  78. package/dist/core/src/tools/list-tasks.js.map +1 -0
  79. package/dist/core/src/tools/search-models.d.ts +5 -0
  80. package/dist/core/src/tools/search-models.d.ts.map +1 -0
  81. package/dist/core/src/tools/search-models.js +96 -0
  82. package/dist/core/src/tools/search-models.js.map +1 -0
  83. package/dist/core/src/tools/shared.d.ts +50 -0
  84. package/dist/core/src/tools/shared.d.ts.map +1 -0
  85. package/dist/core/src/tools/shared.js +129 -0
  86. package/dist/core/src/tools/shared.js.map +1 -0
  87. package/dist/core/src/tools/task-format.d.ts +32 -0
  88. package/dist/core/src/tools/task-format.d.ts.map +1 -0
  89. package/dist/core/src/tools/task-format.js +138 -0
  90. package/dist/core/src/tools/task-format.js.map +1 -0
  91. package/dist/core/src/tools/upload-file.d.ts +7 -0
  92. package/dist/core/src/tools/upload-file.d.ts.map +1 -0
  93. package/dist/core/src/tools/upload-file.js +104 -0
  94. package/dist/core/src/tools/upload-file.js.map +1 -0
  95. package/dist/core/src/version.d.ts +3 -0
  96. package/dist/core/src/version.d.ts.map +1 -0
  97. package/dist/core/src/version.js +3 -0
  98. package/dist/core/src/version.js.map +1 -0
  99. package/dist/evolink-media/src/index.d.ts +3 -0
  100. package/dist/evolink-media/src/index.d.ts.map +1 -0
  101. package/dist/evolink-media/src/index.js +16 -0
  102. package/dist/evolink-media/src/index.js.map +1 -0
  103. package/package.json +46 -4
@@ -0,0 +1,138 @@
1
+ import { queryTask } from '../services/api-client.js';
2
+ import { getTaskErrorInfo } from '../services/error-handler.js';
3
+ import { money, sleep, usdOf } from './shared.js';
4
+ /** Result links from the gateway stay downloadable for this long. */
5
+ export const RESULT_LINK_HOURS = 24;
6
+ export const TERMINAL_STATUSES = new Set(['completed', 'failed', 'cancelled']);
7
+ function kindOfUrl(url, taskType) {
8
+ const path = url.split('?')[0].toLowerCase();
9
+ if (/\.(png|jpe?g|webp|gif|bmp)$/.test(path))
10
+ return 'image';
11
+ if (/\.(mp4|mov|webm|m4v)$/.test(path))
12
+ return 'video';
13
+ if (/\.(mp3|wav|m4a|flac|ogg|aac)$/.test(path))
14
+ return 'audio';
15
+ if (taskType.includes('image'))
16
+ return 'image';
17
+ if (taskType.includes('video'))
18
+ return 'video';
19
+ if (taskType.includes('audio') || taskType.includes('music'))
20
+ return 'audio';
21
+ return 'file';
22
+ }
23
+ export function resultLinks(task) {
24
+ const seen = new Set();
25
+ const links = [];
26
+ const add = (url, kind) => {
27
+ if (typeof url !== 'string' || !/^https?:\/\//.test(url) || seen.has(url))
28
+ return;
29
+ seen.add(url);
30
+ links.push({ url, kind: kind ?? kindOfUrl(url, task.type ?? '') });
31
+ };
32
+ for (const url of task.results ?? [])
33
+ add(url);
34
+ if (Array.isArray(task.result_data)) {
35
+ for (const item of task.result_data) {
36
+ add(item.video_url, 'video');
37
+ add(item.image_url, 'image');
38
+ add(item.audio_url, 'audio');
39
+ }
40
+ }
41
+ return links;
42
+ }
43
+ /** One task as text lines and the same facts as structured content. */
44
+ export function describeTask(task) {
45
+ const status = task.status ?? 'pending';
46
+ const links = resultLinks(task);
47
+ const lines = [
48
+ `Task ${task.id}: ${status}${status === 'completed' || status === 'failed' ? '' : ` (${task.progress ?? 0}%)`}`,
49
+ `Model: ${task.model}`,
50
+ ];
51
+ const structured = {
52
+ task_id: task.id,
53
+ status,
54
+ progress: task.progress ?? 0,
55
+ model: task.model,
56
+ type: task.type,
57
+ };
58
+ if (links.length > 0) {
59
+ lines.push(`Results (download links expire after ${RESULT_LINK_HOURS} hours; save them now):`);
60
+ for (const link of links)
61
+ lines.push(`- ${link.kind}: ${link.url}`);
62
+ structured.results = links;
63
+ structured.links_expire_after_hours = RESULT_LINK_HOURS;
64
+ }
65
+ const used = task.usage?.credits_used ?? task.usage?.cost?.credits;
66
+ if (status === 'completed' && typeof used === 'number') {
67
+ lines.push(`Charged: ${money(used)}`);
68
+ structured.charged_credits = used;
69
+ structured.charged_usd = task.usage?.cost?.usd ?? usdOf(used);
70
+ }
71
+ const reserved = task.usage?.credits_reserved;
72
+ if (status !== 'completed' && status !== 'failed' && typeof reserved === 'number' && reserved > 0) {
73
+ lines.push(`Reserved: ${money(reserved)} (the final charge is settled when the task finishes)`);
74
+ structured.reserved_credits = reserved;
75
+ structured.reserved_usd = usdOf(reserved);
76
+ }
77
+ if (typeof task.duration === 'number' && task.duration > 0 && TERMINAL_STATUSES.has(status)) {
78
+ lines.push(`Took: ${task.duration} s`);
79
+ structured.took_seconds = task.duration;
80
+ }
81
+ if (status === 'failed' || status === 'cancelled') {
82
+ const code = task.error?.code ?? (status === 'cancelled' ? 'request_cancelled' : 'unknown_error');
83
+ const info = getTaskErrorInfo(code);
84
+ const suggestion = task.error?.suggestion ? `${info.suggestion} ${task.error.suggestion}` : info.suggestion;
85
+ lines.push(`Error: ${code}${task.error?.message ? ` — ${task.error.message}` : ''}`);
86
+ lines.push('Charge: failed tasks are refunded.');
87
+ lines.push(`Next step: ${info.retryable ? 'You can retry with a new generate call.' : 'Change the input before retrying.'} ${suggestion}`);
88
+ structured.error = { code, message: task.error?.message, retryable: info.retryable, suggestion };
89
+ structured.refunded = true;
90
+ }
91
+ else if (status === 'completed') {
92
+ lines.push('Next step: give the result links to the user.');
93
+ }
94
+ else {
95
+ const eta = task.task_info?.estimated_time;
96
+ if (eta) {
97
+ lines.push(`Estimated time left: ~${eta} s`);
98
+ structured.estimated_seconds = eta;
99
+ }
100
+ lines.push(`Next step: call get_task with task_id "${task.id}" again (it can wait up to 45 s). Do not call generate again to check progress: that starts and charges a new task.`);
101
+ }
102
+ if (task.request_id) {
103
+ lines.push(`Request ID: ${task.request_id}`);
104
+ structured.request_id = task.request_id;
105
+ }
106
+ return { lines, structured };
107
+ }
108
+ let pollIntervalOverrideMs;
109
+ /** Tests only: shorten the pause between task reads. */
110
+ export function setPollIntervalForTests(ms) {
111
+ pollIntervalOverrideMs = ms;
112
+ }
113
+ /** Pause between task reads: each read of an unfinished task makes the gateway ask the provider. */
114
+ export function pollIntervalMs(type) {
115
+ if (pollIntervalOverrideMs !== undefined)
116
+ return pollIntervalOverrideMs;
117
+ if (type?.includes('video'))
118
+ return 8_000;
119
+ if (type?.includes('audio') || type?.includes('music'))
120
+ return 6_000;
121
+ return 3_000;
122
+ }
123
+ /** Reads a task until it finishes or the deadline passes, pacing reads by task type. */
124
+ export async function waitForTask(config, taskId, options) {
125
+ let task = options.initial ?? await queryTask(config, taskId, options.tool);
126
+ while (!TERMINAL_STATUSES.has(task.status) && !options.signal?.aborted) {
127
+ const interval = pollIntervalMs(task.type);
128
+ if (Date.now() + interval > options.deadline)
129
+ break;
130
+ await options.onPoll?.(task);
131
+ await sleep(interval, options.signal);
132
+ if (options.signal?.aborted)
133
+ break;
134
+ task = await queryTask(config, taskId, options.tool);
135
+ }
136
+ return task;
137
+ }
138
+ //# sourceMappingURL=task-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-format.js","sourceRoot":"","sources":["../../../../../core/src/tools/task-format.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAA0C,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAElD,qEAAqE;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AAO/E,SAAS,SAAS,CAAC,GAAW,EAAE,QAAgB;IAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,IAAI,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7D,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IACvD,IAAI,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/D,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/C,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/C,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAkB;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,GAAY,EAAE,IAA6B,EAAE,EAAE;QAC1D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO;QAClF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE;QAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAA+B,EAAE,CAAC;YACxD,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAAC,IAAkB;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;IACxC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG;QACZ,QAAQ,IAAI,CAAC,EAAE,KAAK,MAAM,GAAG,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE;QAC/G,UAAU,IAAI,CAAC,KAAK,EAAE;KACvB,CAAC;IACF,MAAM,UAAU,GAA4B;QAC1C,OAAO,EAAE,IAAI,CAAC,EAAE;QAChB,MAAM;QACN,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC;QAC5B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC;IAEF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,wCAAwC,iBAAiB,yBAAyB,CAAC,CAAC;QAC/F,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACpE,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAC3B,UAAU,CAAC,wBAAwB,GAAG,iBAAiB,CAAC;IAC1D,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,YAAY,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;IACnE,IAAI,MAAM,KAAK,WAAW,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC;QAClC,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC;IAC9C,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAClG,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,QAAQ,CAAC,uDAAuD,CAAC,CAAC;QAChG,UAAU,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QACvC,UAAU,CAAC,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5F,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACvC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC1C,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAClG,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAC5G,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrF,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,mCAAmC,IAAI,UAAU,EAAE,CAAC,CAAC;QAC3I,UAAU,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;QACjG,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC7B,CAAC;SAAM,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC;QAC3C,IAAI,GAAG,EAAE,CAAC;YACR,KAAK,CAAC,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;YAC7C,UAAU,CAAC,iBAAiB,GAAG,GAAG,CAAC;QACrC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,0CAA0C,IAAI,CAAC,EAAE,qHAAqH,CAAC,CAAC;IACrL,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7C,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC/B,CAAC;AAED,IAAI,sBAA0C,CAAC;AAE/C,wDAAwD;AACxD,MAAM,UAAU,uBAAuB,CAAC,EAAsB;IAC5D,sBAAsB,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,cAAc,CAAC,IAAwB;IACrD,IAAI,sBAAsB,KAAK,SAAS;QAAE,OAAO,sBAAsB,CAAC;IACxE,IAAI,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACrE,OAAO,KAAK,CAAC;AACf,CAAC;AAYD,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAoB,EAAE,MAAc,EAAE,OAAoB;IAC1F,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACvE,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,OAAO,CAAC,QAAQ;YAAE,MAAM;QACpD,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM;QACnC,IAAI,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export interface UploadFileOptions {
3
+ /** Allow file_path uploads. The hosted service sets false: it must never read its own disk. */
4
+ localFiles?: boolean;
5
+ }
6
+ export declare function registerUploadFile(server: McpServer, options?: UploadFileOptions): void;
7
+ //# sourceMappingURL=upload-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-file.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/upload-file.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqCzE,MAAM,WAAW,iBAAiB;IAChC,+FAA+F;IAC/F,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAQD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,GAAE,iBAAsB,GAAG,IAAI,CAgF3F"}
@@ -0,0 +1,104 @@
1
+ import { basename } from 'node:path';
2
+ import { z } from 'zod';
3
+ import { fileStreamUpload, fileBase64Upload, fileUrlUpload } from '../services/file-client.js';
4
+ import { inspectBase64Upload, inspectLocalUpload, validateRemoteUploadURL, validateUploadDestination, } from '../services/upload-policy.js';
5
+ import { WRITES, errorResult, failure, ok } from './shared.js';
6
+ const localFileSchema = {
7
+ file_path: z.string().optional()
8
+ .describe('Absolute path under EVOLINK_UPLOAD_ALLOWED_DIRS. Provide exactly one of file_path, base64_data, or file_url.'),
9
+ };
10
+ const contentSchema = {
11
+ base64_data: z.string().optional()
12
+ .describe('Base64 media data for small files. Data URLs carry their MIME type; raw base64 also needs mime_type.'),
13
+ mime_type: z.string().optional()
14
+ .describe('MIME type for raw base64_data; must match the file content.'),
15
+ file_url: z.string().optional()
16
+ .describe('Public HTTPS link to the media. Loopback, private-network and credential-bearing links are refused.'),
17
+ upload_path: z.string().optional()
18
+ .describe('Optional relative folder in EvoLink storage (no ..).'),
19
+ file_name: z.string().optional()
20
+ .describe('Optional plain file name (no folders).'),
21
+ };
22
+ const SHARED_DESCRIPTION = [
23
+ 'Store an image, audio or video file on EvoLink and get a link to pass to generate_* (for example in image_urls). Free; uses the file quota, and files are deleted after 72 hours.',
24
+ 'Formats: images JPEG, PNG, GIF, WebP; audio MP3, WAV, M4A, AAC, FLAC, OGG/Opus; video MP4, MOV, WebM.',
25
+ 'Max 100 MB; prefer file_url for large files.',
26
+ ];
27
+ export function registerUploadFile(server, options = {}) {
28
+ const localFiles = options.localFiles ?? true;
29
+ const sourceNames = localFiles ? 'file_path, base64_data, or file_url' : 'base64_data or file_url';
30
+ const handler = async (params) => {
31
+ const { base64_data, file_url, mime_type, upload_path, file_name } = params;
32
+ const file_path = localFiles ? params.file_path : undefined;
33
+ const sources = [file_path, base64_data, file_url].filter(Boolean);
34
+ if (sources.length !== 1) {
35
+ return failure(`Provide exactly one of ${sourceNames}.`, { error: { category: 'invalid_request' } });
36
+ }
37
+ // Local checks first: a refused source never reaches the network.
38
+ let upload;
39
+ try {
40
+ validateUploadDestination(upload_path, file_name);
41
+ if (file_path) {
42
+ const inspected = await inspectLocalUpload(file_path);
43
+ upload = () => fileStreamUpload(inspected.realPath, inspected.size, inspected.mimeType, basename(inspected.realPath), upload_path, file_name);
44
+ }
45
+ else if (base64_data) {
46
+ const { dataUrl } = inspectBase64Upload(base64_data, mime_type);
47
+ upload = () => fileBase64Upload(dataUrl, upload_path, file_name);
48
+ }
49
+ else {
50
+ const url = validateRemoteUploadURL(file_url);
51
+ upload = () => fileUrlUpload(url, upload_path, file_name);
52
+ }
53
+ }
54
+ catch (error) {
55
+ const message = error instanceof Error ? error.message : 'the file was refused';
56
+ return failure(`Upload refused: ${message}`, { error: { category: 'invalid_request', message } });
57
+ }
58
+ try {
59
+ const result = await upload();
60
+ const data = result.data;
61
+ if (!data)
62
+ throw new Error('File API returned no upload record');
63
+ const lines = [
64
+ 'File uploaded.',
65
+ `File URL: ${data.file_url}`,
66
+ `Name: ${data.original_name} · ${(data.file_size / 1024).toFixed(1)} KB · ${data.mime_type}`,
67
+ `Expires: ${data.expires_at}`,
68
+ ];
69
+ if (result.request_id)
70
+ lines.push(`Request ID: ${result.request_id}`);
71
+ lines.push('Next step: pass the File URL to a generate tool as input.');
72
+ return ok(lines.join('\n'), {
73
+ file_url: data.file_url,
74
+ download_url: data.download_url,
75
+ file_id: data.file_id,
76
+ file_name: data.original_name,
77
+ size_bytes: data.file_size,
78
+ mime_type: data.mime_type,
79
+ expires_at: data.expires_at,
80
+ ...(result.request_id ? { request_id: result.request_id } : {}),
81
+ });
82
+ }
83
+ catch (error) {
84
+ return errorResult(error);
85
+ }
86
+ };
87
+ if (localFiles) {
88
+ server.registerTool('upload_file', {
89
+ title: 'Upload a file',
90
+ description: [...SHARED_DESCRIPTION, 'Local paths work only inside EVOLINK_UPLOAD_ALLOWED_DIRS.'].join(' '),
91
+ inputSchema: { ...localFileSchema, ...contentSchema },
92
+ annotations: { title: 'Upload a file', ...WRITES },
93
+ }, handler);
94
+ }
95
+ else {
96
+ server.registerTool('upload_file', {
97
+ title: 'Upload a file',
98
+ description: [...SHARED_DESCRIPTION, 'Accepts base64_data or a public file_url.'].join(' '),
99
+ inputSchema: contentSchema,
100
+ annotations: { title: 'Upload a file', ...WRITES },
101
+ }, handler);
102
+ }
103
+ }
104
+ //# sourceMappingURL=upload-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-file.js","sourceRoot":"","sources":["../../../../../core/src/tools/upload-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Version reported in serverInfo and in the X-Evo-Client-Version header. */
2
+ export declare const MCP_VERSION = "1.3.0";
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../../core/src/version.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,eAAO,MAAM,WAAW,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Version reported in serverInfo and in the X-Evo-Client-Version header. */
2
+ export const MCP_VERSION = '1.3.0';
3
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../../core/src/version.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { createServer, createConfig, getApiKey } from '../../core/src/server.js';
4
+ async function main() {
5
+ getApiKey(); // validate API key early
6
+ const config = createConfig('official');
7
+ const server = createServer(config);
8
+ const transport = new StdioServerTransport();
9
+ await server.connect(transport);
10
+ console.error('EvoLink Media MCP Server (official) started');
11
+ }
12
+ main().catch((err) => {
13
+ console.error('Fatal error:', err);
14
+ process.exit(1);
15
+ });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAEjF,KAAK,UAAU,IAAI;IACjB,SAAS,EAAE,CAAC,CAAC,yBAAyB;IAEtC,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;AAC/D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,48 @@
1
1
  {
2
2
  "name": "@evolinkai/mcp",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.3.0",
4
+ "mcpName": "ai.evolink/mcp",
5
+ "description": "Generate AI videos, images & music with one API key. 150+ models (Seedance, Kling, Veo, Sora, GPT Image, Suno...).",
6
+ "type": "module",
7
+ "main": "dist/evolink-media/src/index.js",
8
+ "bin": {
9
+ "evolink-mcp": "dist/evolink-media/src/index.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "prepack": "node -e \"require('fs').copyFileSync('../../LICENSE','LICENSE')\"",
17
+ "postpack": "node -e \"require('fs').rmSync('LICENSE',{force:true})\""
18
+ },
19
+ "keywords": [
20
+ "mcp",
21
+ "claude",
22
+ "ai",
23
+ "video",
24
+ "image",
25
+ "music",
26
+ "generation",
27
+ "sora",
28
+ "suno",
29
+ "kling",
30
+ "veo",
31
+ "seedance"
32
+ ],
33
+ "author": "EvoLink AI <support@evolink.ai>",
34
+ "license": "Apache-2.0",
35
+ "homepage": "https://evolink.ai/mcp",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/Evolink-AI/evolink-mcp.git"
39
+ },
40
+ "dependencies": {
41
+ "@modelcontextprotocol/sdk": "^1.32.0",
42
+ "zod": "^3.24.2"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^22.13.4",
46
+ "typescript": "^5.7.3"
47
+ }
48
+ }