@clipwright/mcp-server 0.1.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/LICENSE +1 -1
- package/SKILL.md +481 -339
- package/dist/format.js +44 -0
- package/dist/format.js.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/server.js +19 -38
- package/dist/server.js.map +1 -1
- package/package.json +4 -4
package/dist/format.js
CHANGED
|
@@ -1,4 +1,48 @@
|
|
|
1
1
|
import { FAILED_STATE, isTerminal } from "@clipwright/core";
|
|
2
|
+
import { ClipwrightApiError } from "@clipwright/sdk";
|
|
3
|
+
/**
|
|
4
|
+
* ОТКАЗ API, РАЗВЁРНУТЫЙ ДЛЯ АГЕНТА (US-622).
|
|
5
|
+
*
|
|
6
|
+
* ЗАЧЕМ ОБЁРТКА, ЕСЛИ ИСКЛЮЧЕНИЕ И ТАК ДОЕЗЖАЕТ. Доезжает — одной строкой:
|
|
7
|
+
* MCP SDK превращает брошенную ошибку в `isError` с текстом сообщения. Для
|
|
8
|
+
* «поле не то» этого хватало, для денег — нет. 402 значит «остановись и скажи
|
|
9
|
+
* человеку числа», 429 значит «подожди столько-то и повтори ТОТ ЖЕ вызов», и
|
|
10
|
+
* различить их в свободном тексте агент может только угадыванием. Здесь он
|
|
11
|
+
* получает `retryable`, `next_action` и сами числа полями.
|
|
12
|
+
*
|
|
13
|
+
* ПОЧЕМУ ТОЛЬКО `ClipwrightApiError`, А НЕ ЛЮБАЯ ОШИБКА. Остальные — местные:
|
|
14
|
+
* нерезолвящийся `CLIPWRIGHT_CLIENT_ID`, сеть, битый baseUrl. У них нет ни
|
|
15
|
+
* статуса, ни кода отказа, и завернуть их в ту же форму значило бы приписать им
|
|
16
|
+
* ответ сервера, которого не было. Они летят дальше как есть, и MCP SDK отдаёт
|
|
17
|
+
* их текст — там он и уместен.
|
|
18
|
+
*
|
|
19
|
+
* `isError: true` остаётся: отказ есть отказ. Меняется не факт, а то, СКОЛЬКО
|
|
20
|
+
* агент о нём узнаёт.
|
|
21
|
+
*/
|
|
22
|
+
export function formatFailure(error) {
|
|
23
|
+
if (!(error instanceof ClipwrightApiError))
|
|
24
|
+
throw error;
|
|
25
|
+
return {
|
|
26
|
+
content: [{ type: "text", text: JSON.stringify(error.report()) }],
|
|
27
|
+
isError: true,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Тело тула, у которого отказ API развёрнут для агента.
|
|
32
|
+
*
|
|
33
|
+
* Обёртка одна на все четыре тула намеренно: забытый `try` в одном из них дал
|
|
34
|
+
* бы агенту плоский текст ровно там, где отказ денежный, — и обнаружилось бы
|
|
35
|
+
* это у клиента. Через общую обёртку забыть нельзя: она либо стоит, либо тул не
|
|
36
|
+
* собирается.
|
|
37
|
+
*/
|
|
38
|
+
export async function withFailureReport(body) {
|
|
39
|
+
try {
|
|
40
|
+
return await body();
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
return formatFailure(error);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
2
46
|
/**
|
|
3
47
|
* Чистое форматирование ответа `get_run` (вынесено из хендлера, чтобы
|
|
4
48
|
* тестировать терминальную форму без подъёма stdio-транспорта и env).
|
package/dist/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAgB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAgB,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAYrD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,CAAC,KAAK,YAAY,kBAAkB,CAAC;QAAE,MAAM,KAAK,CAAC;IACxD,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QACjE,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAoC;IAEpC,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,mEAAmE;QACnE,0EAA0E;QAC1E,iBAAiB;QACjB,IAAI,GAAG,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;YAC/B,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,MAAM,EAAE,QAAQ;4BAChB,MAAM,EAAE,GAAG,CAAC,MAAM;4BAClB,KAAK,EAAE,GAAG,CAAC,KAAK;4BAChB,+DAA+D;4BAC/D,kDAAkD;4BAClD,QAAQ,EAAE,GAAG,CAAC,QAAQ;4BACtB,KAAK,EAAE,GAAG,CAAC,KAAK;yBACjB,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,MAAM,EAAE,WAAW;wBACnB,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,SAAS,EAAE,GAAG,CAAC,YAAY,EAAE,SAAS,IAAI,IAAI;wBAC9C,gBAAgB,EAAE,GAAG,CAAC,YAAY,EAAE,gBAAgB,IAAI,IAAI;wBAC5D,QAAQ,EAAE,GAAG,CAAC,QAAQ;qBACvB,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC;IACD,+EAA+E;IAC/E,gDAAgD;IAChD,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,MAAM,EAAE,aAAa;oBACrB,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,SAAS,EAAE,IAAI;oBACf,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,WAAW,EACT,+CAA+C;wBAC/C,GAAG,CAAC,MAAM;wBACV,mFAAmF;wBACnF,wDAAwD;iBAC3D,CAAC;aACH;SACF;KACF,CAAC;AACJ,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
3
|
import { ClipwrightClient } from "@clipwright/sdk";
|
|
4
|
+
import { apiBaseUrlFromEnv } from "@clipwright/core";
|
|
4
5
|
import { createServer } from "./server.js";
|
|
5
6
|
const apiKey = process.env.CLIPWRIGHT_API_KEY;
|
|
6
7
|
if (!apiKey) {
|
|
7
8
|
console.error("CLIPWRIGHT_API_KEY env var is required");
|
|
8
9
|
process.exit(1);
|
|
9
10
|
}
|
|
10
|
-
|
|
11
|
+
let baseUrl;
|
|
12
|
+
try {
|
|
13
|
+
baseUrl = apiBaseUrlFromEnv(process.env.CLIPWRIGHT_API_URL);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const client = new ClipwrightClient({ apiKey, baseUrl });
|
|
11
20
|
const server = createServer(client);
|
|
12
21
|
const transport = new StdioServerTransport();
|
|
13
22
|
await server.connect(transport);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,IAAI,OAA2B,CAAC;AAChC,IAAI,CAAC;IACH,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAC9D,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AAEzD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAEpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAChC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
1
2
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
-
import { z } from "zod";
|
|
3
3
|
// Схемы приходят из barrel `@clipwright/core` (единый источник правды, правило №2),
|
|
4
4
|
// а НЕ из `/idempotency` — там живёт только ключ идемпотентности, не shape.
|
|
5
5
|
// `offeredUgcInputShape`, а НЕ полный `makeUgcInputShape`: поля с диспозицией
|
|
6
6
|
// `rejected` не должны предлагаться вызывателю, которого мы за их использование
|
|
7
7
|
// накажем четырёхсотым (блокер B4). Множество выводится из реестра диспозиций,
|
|
8
8
|
// поэтому смена решения по полю переносит его между поверхностями одной строкой.
|
|
9
|
-
import { offeredUgcInputShape, agentRetryShape } from "@clipwright/core";
|
|
10
|
-
import { formatGetRun } from "./format.js";
|
|
9
|
+
import { offeredUgcInputShape, agentRetryShape, runId, MAKE_UGC_DESCRIPTION, MAKE_UGC_AGENT_PROTOCOL, } from "@clipwright/core";
|
|
10
|
+
import { formatGetRun, withFailureReport } from "./format.js";
|
|
11
|
+
// Версия — из манифеста: литерал расходился с ним молча, а импорт JSON не проходит `rootDir`.
|
|
12
|
+
const packageVersion = () => createRequire(import.meta.url)("../package.json").version;
|
|
11
13
|
/**
|
|
12
14
|
* Строит MCP-сервер с зарегистрированными тулами, БЕЗ подключения транспорта.
|
|
13
15
|
*
|
|
@@ -18,59 +20,38 @@ import { formatGetRun } from "./format.js";
|
|
|
18
20
|
* тонкий bootstrap).
|
|
19
21
|
*/
|
|
20
22
|
export function createServer(client) {
|
|
21
|
-
const server = new McpServer({ name: "clipwright", version:
|
|
23
|
+
const server = new McpServer({ name: "clipwright", version: packageVersion() });
|
|
22
24
|
// Полная схема публикуется в tools/list (у конкурента она пустая — антипаттерн).
|
|
23
25
|
server.registerTool("make_ugc", {
|
|
24
|
-
description:
|
|
25
|
-
"the actor in words with person. Fields the renderer does not honor yet carry a NOT HONORED YET " +
|
|
26
|
-
"note in their own description — read it instead of guessing. " +
|
|
27
|
-
"Captions are OPT-IN: ASK the user first. Call quote_ugc before generating and show the cost. " +
|
|
28
|
-
"This does NOT wait for the video: it starts the run and returns a run_id IMMEDIATELY. You MUST " +
|
|
29
|
-
"then poll get_run with that run_id until the state is 'succeeded' (video_url) or 'failed'. " +
|
|
30
|
-
"Pass attempt=2,3,… to deliberately start a NEW run for the same input (retry after a failure).",
|
|
26
|
+
description: `${MAKE_UGC_DESCRIPTION} ${MAKE_UGC_AGENT_PROTOCOL}`,
|
|
31
27
|
// [Правило №2] Плоская схема = предлагаемый вход рендера + агентный ретрай,
|
|
32
28
|
// собранная из shape core. Проза описания держится в согласии со схемой
|
|
33
29
|
// намеренно: LLM-вызыватель читает описание РАНЬШЕ схемы, поэтому обещание
|
|
34
30
|
// в тексте («1080p 9:16», «character») было бы тем же дефектом
|
|
35
31
|
// «предлагаем и наказываем», просто слоем выше.
|
|
36
32
|
inputSchema: { ...offeredUgcInputShape, ...agentRetryShape },
|
|
37
|
-
}, async (args) => {
|
|
33
|
+
}, async (args) => withFailureReport(async () => {
|
|
38
34
|
// [ARB-1] РАСЩЕПЛЯЕМ плоский вход: `attempt` живёт в opts SDK. Если передать
|
|
39
35
|
// его внутрь `input`, `makeUgcInput.parse` в `idempotencyKeyFor` молча срежет
|
|
40
36
|
// лишний ключ → суффикс всегда `:1` → повтор вернёт тот же run → M1 мёртв.
|
|
41
37
|
const { attempt, ...input } = args;
|
|
42
38
|
// [A5] Возврат СРАЗУ после старта (state≈"queued"), без bounded-wait и без цикла.
|
|
43
39
|
const run = await client.startUgc(input, { attempt });
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
text: JSON.stringify({
|
|
49
|
-
status: "IN_PROGRESS",
|
|
50
|
-
run_id: run.run_id,
|
|
51
|
-
state: run.state,
|
|
52
|
-
video_url: null,
|
|
53
|
-
next_action: "Video is NOT ready. Call get_run with run_id=" +
|
|
54
|
-
run.run_id +
|
|
55
|
-
" in ~5 seconds. Repeat until state is 'succeeded' or 'failed'. Do NOT tell the " +
|
|
56
|
-
"user the video is done until you have a video_url.",
|
|
57
|
-
}),
|
|
58
|
-
},
|
|
59
|
-
],
|
|
60
|
-
isError: false,
|
|
61
|
-
};
|
|
62
|
-
});
|
|
40
|
+
// ТЕМ ЖЕ ФОРМАТТЕРОМ, ЧТО И `get_run`: своя копия формы IN_PROGRESS теряла
|
|
41
|
+
// `run.warnings`, и агент узнавал о снапе уже после платного старта.
|
|
42
|
+
return formatGetRun(run);
|
|
43
|
+
}));
|
|
63
44
|
server.registerTool("get_run", {
|
|
64
45
|
description: "Check the status of a video generation started by make_ugc. Pass the run_id. While the run " +
|
|
65
46
|
"is still working it returns status IN_PROGRESS with a next_action telling you to poll again; " +
|
|
66
47
|
"repeat every ~5 seconds until it reaches a terminal state — SUCCEEDED (with video_url) or FAILED.",
|
|
67
|
-
inputSchema: { run_id:
|
|
68
|
-
}, async ({ run_id }) => {
|
|
48
|
+
inputSchema: { run_id: runId },
|
|
49
|
+
}, async ({ run_id }) => withFailureReport(async () => {
|
|
69
50
|
// Терминальная форма + деградация вынесены в чистый `formatGetRun` (тест
|
|
70
51
|
// без stdio-транспорта). Терминал несёт И `status`, И `state` (US-501).
|
|
71
52
|
const run = await client.getRun(run_id);
|
|
72
53
|
return formatGetRun(run);
|
|
73
|
-
});
|
|
54
|
+
}));
|
|
74
55
|
server.registerTool("quote_ugc", {
|
|
75
56
|
description: "Estimate the credit cost of a make_ugc call WITHOUT spending credits. " +
|
|
76
57
|
"Always call this first and show the user the price before make_ugc.",
|
|
@@ -78,10 +59,10 @@ export function createServer(client) {
|
|
|
78
59
|
// обязательное поле (остальные .optional()/.default()), поэтому переиспользуем
|
|
79
60
|
// shape целиком вместо рукописного {script} — цена учитывает captions/look и не расходится со схемой.
|
|
80
61
|
inputSchema: offeredUgcInputShape,
|
|
81
|
-
}, async (args) => {
|
|
62
|
+
}, async (args) => withFailureReport(async () => {
|
|
82
63
|
const quote = await client.quoteUgc(args);
|
|
83
64
|
return { content: [{ type: "text", text: JSON.stringify(quote) }] };
|
|
84
|
-
});
|
|
65
|
+
}));
|
|
85
66
|
server.registerTool("list_voices", {
|
|
86
67
|
description: "List the curated voice catalog available for make_ugc's `voice` field. Presets are the " +
|
|
87
68
|
"RECOMMENDED path: pick one by name (e.g. voice=\"george\"). `voice_id` is an escape hatch for " +
|
|
@@ -91,12 +72,12 @@ export function createServer(client) {
|
|
|
91
72
|
"full voice list: the paid vendor's full catalog is intentionally not proxied here, so its API " +
|
|
92
73
|
"key does not need to leave the worker process.",
|
|
93
74
|
inputSchema: {},
|
|
94
|
-
}, async () => {
|
|
75
|
+
}, async () => withFailureReport(async () => {
|
|
95
76
|
// Каталог статический (US-513 core), тула лишь ретранслирует /v1/voices —
|
|
96
77
|
// без сети к вендору, без ключа вендора на этой поверхности (§5).
|
|
97
78
|
const voices = await client.listVoices();
|
|
98
79
|
return { content: [{ type: "text", text: JSON.stringify({ voices }) }] };
|
|
99
|
-
});
|
|
80
|
+
}));
|
|
100
81
|
return server;
|
|
101
82
|
}
|
|
102
83
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,oFAAoF;AACpF,4EAA4E;AAC5E,8EAA8E;AAC9E,gFAAgF;AAChF,+EAA+E;AAC/E,iFAAiF;AACjF,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,KAAK,EACL,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE9D,8FAA8F;AAC9F,MAAM,cAAc,GAAG,GAAW,EAAE,CACjC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAyB,CAAC,OAAO,CAAC;AAErF;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,MAAwB;IACnD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IAEhF,iFAAiF;IACjF,MAAM,CAAC,YAAY,CACjB,UAAU,EACV;QACE,WAAW,EAAE,GAAG,oBAAoB,IAAI,uBAAuB,EAAE;QACjE,4EAA4E;QAC5E,wEAAwE;QACxE,2EAA2E;QAC3E,+DAA+D;QAC/D,gDAAgD;QAChD,WAAW,EAAE,EAAE,GAAG,oBAAoB,EAAE,GAAG,eAAe,EAAE;KAC7D,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,iBAAiB,CAAC,KAAK,IAAI,EAAE;QAC3B,6EAA6E;QAC7E,8EAA8E;QAC9E,2EAA2E;QAC3E,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;QACnC,kFAAkF;QAClF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACtD,2EAA2E;QAC3E,qEAAqE;QACrE,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,SAAS,EACT;QACE,WAAW,EACT,6FAA6F;YAC7F,+FAA+F;YAC/F,mGAAmG;QACrG,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;KAC/B,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CACnB,iBAAiB,CAAC,KAAK,IAAI,EAAE;QAC3B,yEAAyE;QACzE,wEAAwE;QACxE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,WAAW,EACT,wEAAwE;YACxE,qEAAqE;QACvE,4EAA4E;QAC5E,+EAA+E;QAC/E,sGAAsG;QACtG,WAAW,EAAE,oBAAoB;KAClC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CACb,iBAAiB,CAAC,KAAK,IAAI,EAAE;QAC3B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;IACtE,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,WAAW,EACT,yFAAyF;YACzF,gGAAgG;YAChG,kGAAkG;YAClG,kGAAkG;YAClG,gGAAgG;YAChG,gGAAgG;YAChG,gDAAgD;QAClD,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,IAAI,EAAE,CACT,iBAAiB,CAAC,KAAK,IAAI,EAAE;QAC3B,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QACzC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC3E,CAAC,CAAC,CACL,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clipwright/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "MCP server for Clipwright: generate UGC videos from your coding agent",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"video"
|
|
10
10
|
],
|
|
11
11
|
"license": "MIT",
|
|
12
|
-
"author": "Dimantika
|
|
12
|
+
"author": "Dimantika Sp. z o.o.",
|
|
13
13
|
"homepage": "https://clipwright.io",
|
|
14
14
|
"type": "module",
|
|
15
15
|
"publishConfig": {
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
30
30
|
"zod": "^4.4.3",
|
|
31
|
-
"@clipwright/core": "0.
|
|
32
|
-
"@clipwright/sdk": "0.
|
|
31
|
+
"@clipwright/core": "0.3.0",
|
|
32
|
+
"@clipwright/sdk": "0.3.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/node": "^26.1.1"
|