@clipwright/mcp-server 0.10.0 → 0.12.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/CHANGELOG.md +335 -0
- package/README.md +3 -1
- package/SKILL.md +27 -4
- package/package.json +5 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
The four client packages — `@clipwright/core`, `@clipwright/sdk`,
|
|
4
|
+
`@clipwright/cli` and `@clipwright/mcp-server` — are released together and always
|
|
5
|
+
share one version, so each section below covers all four. The format follows
|
|
6
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/). The HTTP API reports its
|
|
7
|
+
contract version in the `X-Clipwright-Contract` response header and in the
|
|
8
|
+
`contract_version` field of a quote. Entries marked **Breaking:** require a change
|
|
9
|
+
on the client side. Entries marked *Server-side* changed the API itself: every
|
|
10
|
+
client version sees them from the day the API was deployed, not from the package
|
|
11
|
+
release they are listed under.
|
|
12
|
+
|
|
13
|
+
## [0.12.0] - 2026-09-13
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **Breaking:** *Server-side:* quote and run refuse a key that is not part of
|
|
18
|
+
the contract with 400 `unknown_field`, before any charge. Such keys were
|
|
19
|
+
dropped silently before, so a misspelled field fell back to its default:
|
|
20
|
+
`aspectRatio: "16:9"` rendered 9:16 without a warning. `fields` names each
|
|
21
|
+
unknown key, and the message suggests the matching field (`aspect_ratio`).
|
|
22
|
+
Fix the key name. The contract version moved to `2026-09-13`.
|
|
23
|
+
(clipwright#166)
|
|
24
|
+
- *Server-side:* the duration estimate for a Cyrillic script uses 2.3 words a
|
|
25
|
+
second instead of 2.6, measured on `eleven_v3`. A Russian script now
|
|
26
|
+
quotes and reserves about 13% more credits, closer to what the run is
|
|
27
|
+
charged. Other scripts keep 2.6. (clipwright#164)
|
|
28
|
+
- A stress mark (U+0301) at the start of a word is no longer counted as its
|
|
29
|
+
first letter, so a capital right after the mark stays a capital. A capital
|
|
30
|
+
vowel later in the same word still marks stress. (clipwright#164)
|
|
31
|
+
- Each package ships this changelog as `CHANGELOG.md`. (clipwright#102)
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
|
|
35
|
+
- Quote returns `tts_model`, the speech model the run will use.
|
|
36
|
+
(clipwright#164)
|
|
37
|
+
- `@clipwright/core` exports `unknownFields`, `unknownFieldError`,
|
|
38
|
+
`unknownFieldBody` and `ACCEPTED_UGC_FIELDS`, and `unknown_field` is part of
|
|
39
|
+
`API_ERROR_CODES`. (clipwright#166)
|
|
40
|
+
|
|
41
|
+
### Fixed
|
|
42
|
+
|
|
43
|
+
- *Server-side:* a body with an empty key name gets 400 `unknown_field`
|
|
44
|
+
instead of 500 `internal_error`. (clipwright#167)
|
|
45
|
+
|
|
46
|
+
## [0.11.0] - 2026-09-13
|
|
47
|
+
|
|
48
|
+
### Removed
|
|
49
|
+
|
|
50
|
+
- **Breaking:** `eleven_multilingual_v2` is no longer a valid `tts_model`. Quote
|
|
51
|
+
and run refuse it with 400 before any charge. Pass `eleven_v3`,
|
|
52
|
+
`eleven_flash_v2_5` or `eleven_turbo_v2_5`, or omit the field. Runs stored with
|
|
53
|
+
the old value still read. (clipwright#145)
|
|
54
|
+
|
|
55
|
+
### Changed
|
|
56
|
+
|
|
57
|
+
- **Breaking:** every voice preset and a raw `voice_id` now speak on `eleven_v3`.
|
|
58
|
+
Before, four of five presets and a raw `voice_id` used `eleven_multilingual_v2`,
|
|
59
|
+
with a 10,000-character script ceiling. The default ceiling is now 5,000
|
|
60
|
+
characters. A script of 5,001–10,000 characters that passed before is refused;
|
|
61
|
+
send it with `tts_model: "eleven_flash_v2_5"` or `"eleven_turbo_v2_5"` (10,000
|
|
62
|
+
each). The refusal names these models when the script fits them. The voices
|
|
63
|
+
sound different, and the samples from `list_voices` were re-recorded.
|
|
64
|
+
(clipwright#145)
|
|
65
|
+
- **Breaking:** on `eleven_v3`, a single capital vowel after the first letter of a
|
|
66
|
+
Cyrillic word marks stress: `потОм` is sent as `пото́м` (lowercase vowel plus
|
|
67
|
+
U+0301). A script that used such a capital for another reason is now spoken
|
|
68
|
+
differently; write that word in lowercase. A capital at the start of a word, a
|
|
69
|
+
word in capitals, and a word with a second capital stay as written. Stress marks
|
|
70
|
+
count toward the character limit. (clipwright#145)
|
|
71
|
+
- The contract version moved from `2026-08` to `2026-09`. (clipwright#145)
|
|
72
|
+
|
|
73
|
+
### Added
|
|
74
|
+
|
|
75
|
+
- `tts_model` accepts `eleven_flash_v2_5` and `eleven_turbo_v2_5`, 10,000
|
|
76
|
+
characters each. (clipwright#145)
|
|
77
|
+
- *Server-side:* quote and run return a warning when a script with stress marks or
|
|
78
|
+
in Cyrillic goes to a 2.5 model. The default path stays silent. (clipwright#145)
|
|
79
|
+
- `@clipwright/core` exports the stress helpers (`STRESS_MARK`,
|
|
80
|
+
`stressMarksFromCapitals`, `speechTextFor`) and the run preflight schema
|
|
81
|
+
(`runPreflight`, `parseRunPreflight`). (clipwright#145, clipwright#146)
|
|
82
|
+
|
|
83
|
+
### Fixed
|
|
84
|
+
|
|
85
|
+
- *Server-side:* for a body with `image`, the 202 response of a run and the quote
|
|
86
|
+
now return the same `warnings[]`. Warnings that depend on a network probe no
|
|
87
|
+
longer disappear when a run fails. (clipwright#146)
|
|
88
|
+
|
|
89
|
+
## [0.10.0] - 2026-09-11
|
|
90
|
+
|
|
91
|
+
### Added
|
|
92
|
+
|
|
93
|
+
- MCP tool `get_account`, SDK `getAccount()` and CLI `clipwright account`. All
|
|
94
|
+
three read `GET /v1/account` (balance, debt, holds, grants) and spend nothing.
|
|
95
|
+
(clipwright#135)
|
|
96
|
+
- *Server-side:* quote adds a warning when a run with the same input would be
|
|
97
|
+
refused with `account_not_admitted`, `debt_outstanding` or
|
|
98
|
+
`insufficient_credits`. The warning carries the same numbers as the refusal.
|
|
99
|
+
(clipwright#134)
|
|
100
|
+
- `@clipwright/core` exports `API_ENDPOINTS`, `QUICKSTART_ENDPOINTS`,
|
|
101
|
+
`endpointLabel` and `NODE_MIN_MAJOR` (the Node.js major the clients require).
|
|
102
|
+
(clipwright#135, clipwright#129)
|
|
103
|
+
|
|
104
|
+
### Fixed
|
|
105
|
+
|
|
106
|
+
- *Server-side:* the `error` of a failed run in `GET /v1/runs/{id}` no longer
|
|
107
|
+
contains stack frames or internal file paths. (clipwright#133)
|
|
108
|
+
- *Server-side:* when our wait for the avatar vendor times out, the run is charged
|
|
109
|
+
nothing, and its warning says what happened. (clipwright#150)
|
|
110
|
+
|
|
111
|
+
## [0.9.0] - 2026-09-09
|
|
112
|
+
|
|
113
|
+
### Added
|
|
114
|
+
|
|
115
|
+
- Each voice in `GET /v1/voices`, `list_voices` and `listVoices()` carries
|
|
116
|
+
`preview_url` and `preview_expires_at`: a signed link to a sample recorded with
|
|
117
|
+
that voice and its model. The link is valid for one hour. A voice without a
|
|
118
|
+
sample has neither field. A 0.8.0 client drops both fields. (clipwright#147)
|
|
119
|
+
- CLI `clipwright voices` prints the sample link on its own line. (clipwright#147)
|
|
120
|
+
|
|
121
|
+
## [0.8.0] - 2026-09-09
|
|
122
|
+
|
|
123
|
+
### Added
|
|
124
|
+
|
|
125
|
+
- Actor library: `GET /v1/actors`, MCP tool `list_actors`, SDK `listActors()` and
|
|
126
|
+
CLI `clipwright actors`. Each actor has a stable `actor_id`, a name, a gender,
|
|
127
|
+
an approximate age, a version and verified image variants. (clipwright#120)
|
|
128
|
+
- `actor_id` input on quote and run, and CLI `--actor-id` on `make` and `quote`.
|
|
129
|
+
Do not combine it with `image` or `person`. (clipwright#120)
|
|
130
|
+
- Quote and run responses carry `actor`: the selected `actor_id`, `version` and
|
|
131
|
+
`gender`; `{gender}` for the default actor; `null` when you pass your own
|
|
132
|
+
`image`. (clipwright#64, clipwright#120)
|
|
133
|
+
|
|
134
|
+
## [0.7.0] - 2026-09-09
|
|
135
|
+
|
|
136
|
+
### Removed
|
|
137
|
+
|
|
138
|
+
- **Breaking:** `daily_remaining_credits` is gone from `GET /v1/account` and from
|
|
139
|
+
the `account` schema in `@clipwright/core`. The per-account daily spend cap it
|
|
140
|
+
reported was removed. A client that read the field now gets `undefined`; read
|
|
141
|
+
`balance_credits`, and `debt_credits` for a block. The contract version was not
|
|
142
|
+
moved for this change: it stayed `2026-08` until 0.11.0, so the header gave no
|
|
143
|
+
signal. (clipwright#139)
|
|
144
|
+
- **Breaking:** `@clipwright/core` no longer exports `MAX_SCRIPT_WORDS` or
|
|
145
|
+
`SCRIPT_SECONDS_BASIS`. Code that imports them fails; use `TTS_MODEL_CHAR_CAP`
|
|
146
|
+
or `MAX_SCRIPT_CHARS`. (clipwright#128)
|
|
147
|
+
- *Server-side:* the refusal `daily_cap_exceeded` is no longer produced. Runs
|
|
148
|
+
refused before keep it in their history. (clipwright#139)
|
|
149
|
+
- *Server-side:* the refusal `global_cap_exceeded` is no longer produced. The
|
|
150
|
+
service-wide daily spend cap became an internal alert. (clipwright#141)
|
|
151
|
+
|
|
152
|
+
### Changed
|
|
153
|
+
|
|
154
|
+
- The 180-word script ceiling is replaced by a character limit per speech model:
|
|
155
|
+
`eleven_v3` 5,000, `eleven_multilingual_v2` 10,000. Length is counted as
|
|
156
|
+
JavaScript `.length`, spaces and audio tags included; an emoji may count as two.
|
|
157
|
+
Longer scripts than before are accepted. The refusal text changed from
|
|
158
|
+
`script is ~N words; ceiling is 180 words` to
|
|
159
|
+
`script has N characters; <model> allows at most N characters`; update code
|
|
160
|
+
that matches on it. (clipwright#128)
|
|
161
|
+
- **Breaking:** *Server-side:* quote and run refuse a script whose text contains
|
|
162
|
+
U+FFFD with 400 `script_encoding_lost`, before any charge. Such a script was
|
|
163
|
+
accepted before and billed for about a second of speech. The bytes were lost
|
|
164
|
+
before the request left the client: send the script as valid UTF-8.
|
|
165
|
+
(clipwright#131)
|
|
166
|
+
- *Server-side:* a run whose speech is impossibly short for its script fails with
|
|
167
|
+
`speech_too_short_for_script` and is charged nothing, instead of succeeding.
|
|
168
|
+
Retrying rarely helps. (clipwright#131)
|
|
169
|
+
- *Server-side:* a new sign-up gets an admitted account with zero credits, so it
|
|
170
|
+
is no longer refused with `account_not_admitted` until the owner admits it.
|
|
171
|
+
(clipwright#112)
|
|
172
|
+
|
|
173
|
+
## [0.6.0] - 2026-09-06
|
|
174
|
+
|
|
175
|
+
### Added
|
|
176
|
+
|
|
177
|
+
- `@clipwright/cli` installs a second binary, `clipwright-cli`, next to
|
|
178
|
+
`clipwright`. An unrelated npm package also ships a `clipwright` binary; the
|
|
179
|
+
second name avoids that collision. `core`, `sdk` and `mcp-server` have no
|
|
180
|
+
changes in this release and moved to keep one version. (clipwright#105)
|
|
181
|
+
|
|
182
|
+
## [0.5.0] - 2026-09-06
|
|
183
|
+
|
|
184
|
+
### Added
|
|
185
|
+
|
|
186
|
+
- `POST /v1/uploads` takes a local PNG or JPEG of up to 10 MB and returns
|
|
187
|
+
`upload_id`, `url`, `media_type`, `bytes`, `width`, `height` and `expires_at`.
|
|
188
|
+
Pass the https `url` as `image`. The url is valid for 24 hours and the object is
|
|
189
|
+
kept for 7 days. An account may upload 20 images a day. New refusal codes:
|
|
190
|
+
`invalid_image`, `unsupported_media_type`, `upload_cap_exceeded`.
|
|
191
|
+
(clipwright#99)
|
|
192
|
+
- MCP tool `upload_image`, SDK `uploadImage()`, CLI `clipwright upload <path>`, and
|
|
193
|
+
`--image`, `--image-file`, `--aspect-ratio`, `--resolution` on CLI `make` and
|
|
194
|
+
`quote`. (clipwright#99)
|
|
195
|
+
- `tts_model` input (`eleven_v3` or `eleven_multilingual_v2`) and CLI
|
|
196
|
+
`--tts-model`. Without it the preset's model is used. Each voice in the catalog
|
|
197
|
+
names its `model`. A script over the model's character limit (v3 5,000, v2
|
|
198
|
+
10,000) is refused before any charge, in addition to the 180-word ceiling.
|
|
199
|
+
(clipwright#101)
|
|
200
|
+
- MCP `tools/list` describes `image`, `aspect_ratio`, `resolution`, `voice` and
|
|
201
|
+
`voice_id`; the descriptions were empty before. (clipwright#99)
|
|
202
|
+
|
|
203
|
+
### Changed
|
|
204
|
+
|
|
205
|
+
- *Server-side:* the `owner_ru_clone` preset speaks on `eleven_v3`. All presets
|
|
206
|
+
used `eleven_multilingual_v2` before. (clipwright#101)
|
|
207
|
+
|
|
208
|
+
## [0.4.0] - 2026-08-28
|
|
209
|
+
|
|
210
|
+
### Changed
|
|
211
|
+
|
|
212
|
+
- **Breaking:** the default API address in the SDK, CLI and MCP server moved to
|
|
213
|
+
`https://api.clipwright.io`. The old address
|
|
214
|
+
`https://api-production-7e69.up.railway.app` still answers, so older clients
|
|
215
|
+
keep working. If your network allowlists hosts, add `api.clipwright.io`, or pin
|
|
216
|
+
the old address with `CLIPWRIGHT_API_URL` or the SDK `baseUrl` option. (US-613)
|
|
217
|
+
|
|
218
|
+
## [0.3.0] - 2026-08-28
|
|
219
|
+
|
|
220
|
+
### Removed
|
|
221
|
+
|
|
222
|
+
- **Breaking:** `@clipwright/core` no longer exports `MAX_SCRIPT_SECONDS`. Code
|
|
223
|
+
that imports it fails; `SCRIPT_SECONDS_BASIS` holds the value (and was removed
|
|
224
|
+
in turn in 0.7.0).
|
|
225
|
+
|
|
226
|
+
### Changed
|
|
227
|
+
|
|
228
|
+
- **Breaking:** the CLI and the MCP server refuse a `CLIPWRIGHT_API_URL` that is
|
|
229
|
+
not `https`. Loopback addresses may stay `http`. Point the variable at an https
|
|
230
|
+
address. (clipwright#85)
|
|
231
|
+
- **Breaking:** every URL field of the input is limited to 2,048 characters
|
|
232
|
+
(`MAX_URL_LENGTH`). A longer URL is refused with 400. Pass a URL of at most
|
|
233
|
+
2,048 characters, for example by hosting the file at a shorter address.
|
|
234
|
+
(clipwright#85)
|
|
235
|
+
- **Breaking:** SDK requests now have deadlines. `requestTimeoutMs` (per client,
|
|
236
|
+
default 30 s) bounds every request, and `maxWaitMs` (per `makeUgc` call, default
|
|
237
|
+
10 min) bounds the whole call, including the request in flight. A call that used
|
|
238
|
+
to hang now rejects. A start request cut off mid-flight throws
|
|
239
|
+
`ClipwrightResponseError` with `mayHaveTakenEffect: true`: check the run before
|
|
240
|
+
retrying with a new idempotency key. Raise `requestTimeoutMs` behind a slow
|
|
241
|
+
proxy.
|
|
242
|
+
- **Breaking:** *Server-side:* a run from an account not admitted to the beta is
|
|
243
|
+
refused with 403 `account_not_admitted` before any charge. Topping up does not
|
|
244
|
+
lift it. The clients parse this refusal from 0.3.0 on. (US-620)
|
|
245
|
+
- The voice catalog is in English, and the SDK validates the `GET /v1/voices`
|
|
246
|
+
response. Each voice has `name`, `language`, `gender` and `description`.
|
|
247
|
+
(clipwright#85)
|
|
248
|
+
- The MCP server checks the shape of `run_id` in `get_run`. (clipwright#85)
|
|
249
|
+
- *Server-side:* the video link in a finished run is signed for 7 days instead of
|
|
250
|
+
1. (clipwright#22)
|
|
251
|
+
- *Server-side:* a failed run is charged only if the vendor accepted the work that
|
|
252
|
+
produces the clip. A run that paid only for speech is charged nothing.
|
|
253
|
+
(clipwright#46)
|
|
254
|
+
- *Server-side:* credits bought while an account has debt pay the debt first; only
|
|
255
|
+
the rest reaches the balance. (US-611)
|
|
256
|
+
|
|
257
|
+
### Fixed
|
|
258
|
+
|
|
259
|
+
- *Server-side:* 401 and validation refusals use the declared error body.
|
|
260
|
+
Validation errors return `invalid_request` and list each problem as
|
|
261
|
+
`field: reason`, up to 12. Before, clients reported these bodies as "not a
|
|
262
|
+
Clipwright error object". (US-616)
|
|
263
|
+
- *Server-side:* the 202 response of a run carries its `warnings[]`; it always
|
|
264
|
+
returned an empty list before. (clipwright#64)
|
|
265
|
+
|
|
266
|
+
## [0.2.0] - 2026-07-29
|
|
267
|
+
|
|
268
|
+
### Added
|
|
269
|
+
|
|
270
|
+
- `@clipwright/cli` is published for the first time, under MIT. Commands:
|
|
271
|
+
`quote`, `make`, `runs <id>`, `voices`. `make` takes `--script`, `--person`,
|
|
272
|
+
`--captions`, `--voice`, `--voice-id` and `--retry`. (US-622)
|
|
273
|
+
- *Server-side:* `GET /v1/account` returns `account_id`, `balance_credits`,
|
|
274
|
+
`debt_credits`, `holds_credits`, `daily_remaining_credits` and `grants`.
|
|
275
|
+
(US-602)
|
|
276
|
+
- `@clipwright/core` exports the refusal schemas and the retry policy:
|
|
277
|
+
`parseApiFailure`, `isRetryableFailure`, `retryDelayMs`, `agentFailureReport`,
|
|
278
|
+
`apiError`, the 402 and 429 bodies, the rate-limit header names, `account` and
|
|
279
|
+
`creditGrant`. (US-622)
|
|
280
|
+
- *Server-side:* a service-wide daily spend cap; a run past it is refused with
|
|
281
|
+
`global_cap_exceeded`. (US-603)
|
|
282
|
+
|
|
283
|
+
### Changed
|
|
284
|
+
|
|
285
|
+
- **Breaking:** *Server-side:* a run reserves credits before rendering. Without
|
|
286
|
+
enough balance the API answers 402 `insufficient_credits`; with unpaid debt, 402
|
|
287
|
+
`debt_outstanding`, whatever the balance. Buy credits to lift either. (US-602)
|
|
288
|
+
- **Breaking:** *Server-side:* rate limits per account: 60 requests a minute for
|
|
289
|
+
starting runs, 300 for quote, voices, run status and account. Over the limit
|
|
290
|
+
the API answers 429 `rate_limited` with `Retry-After` and `X-RateLimit-*`
|
|
291
|
+
headers; wait and repeat the same call. At most 3 renders run at once per
|
|
292
|
+
account; a fourth queues and still returns 202. (US-605)
|
|
293
|
+
- **Breaking:** the SDK throws `ClipwrightApiError` or `ClipwrightResponseError`
|
|
294
|
+
(both extend `Error`) instead of a plain `Error`, and reads the status before
|
|
295
|
+
the body. Code that parsed the message text should read the error's status and
|
|
296
|
+
code instead. `makeUgc` now waits out 429 and 5xx while polling; money refusals
|
|
297
|
+
and other 4xx still throw at once. `attempt` must be a positive safe integer and
|
|
298
|
+
is checked before any request. (US-622)
|
|
299
|
+
- **Breaking:** MCP tools return a refusal as a JSON report inside the text block,
|
|
300
|
+
with `isError: true`, instead of one sentence. Agents should branch on its
|
|
301
|
+
`retryable` field, not on prose. (US-622)
|
|
302
|
+
- The MCP server starts when `~/.clipwright` is read-only; only `make_ugc`
|
|
303
|
+
refuses, naming the variable that fixes it. (US-622)
|
|
304
|
+
- `SKILL.md` inside `@clipwright/mcp-server` is in English. (US-622)
|
|
305
|
+
- *Server-side:* idempotency keys are scoped to the account, so two accounts can
|
|
306
|
+
use the same key. (US-604)
|
|
307
|
+
|
|
308
|
+
## [0.1.0] - 2026-07-26
|
|
309
|
+
|
|
310
|
+
### Added
|
|
311
|
+
|
|
312
|
+
- First publication of `@clipwright/core`, `@clipwright/sdk` and
|
|
313
|
+
`@clipwright/mcp-server` under MIT. `@clipwright/cli` was not published.
|
|
314
|
+
- API: quote (`POST /v1/skills/make_ugc/quote`), run
|
|
315
|
+
(`POST /v1/skills/make_ugc/run`, `Idempotency-Key` required), run status
|
|
316
|
+
(`GET /v1/runs/{id}`), voice catalog (`GET /v1/voices`). Requests carry a
|
|
317
|
+
`cw_*` bearer token. (US-205, US-516, US-550)
|
|
318
|
+
- MCP tools `quote_ugc`, `make_ugc`, `get_run`, `list_voices`. `make_ugc` returns
|
|
319
|
+
a `run_id` at once, and the agent polls `get_run`. (US-206, US-512, US-516)
|
|
320
|
+
- SDK `ClipwrightClient` with `quoteUgc`, `startUgc`, `makeUgc`, `getRun` and
|
|
321
|
+
`listVoices`. The idempotency key comes from the input and
|
|
322
|
+
`CLIPWRIGHT_CLIENT_ID`; `attempt` starts a deliberate new run. (US-201, US-202)
|
|
323
|
+
- Input: `script` (up to 180 words), `voice`, `voice_id`, `image`,
|
|
324
|
+
`aspect_ratio` (default 9:16, 16:9 supported), `resolution`, `captions`,
|
|
325
|
+
`disclosure_overlay`. Parameters that are not honoured come back in
|
|
326
|
+
`warnings[]`; `webhook_url` is refused with 400. (US-533, US-535, US-539)
|
|
327
|
+
- Quote returns `credits_estimate`, `duration_estimate_sec`, `warnings`,
|
|
328
|
+
`contract_version`, `source` and `resolved_aspect_ratio`. A source whose aspect
|
|
329
|
+
ratio differs from the request by more than 15% is refused before any charge;
|
|
330
|
+
up to 15% it is snapped with a warning. (US-525)
|
|
331
|
+
- Credits: 30 per second of video, reserved at start and charged on the measured
|
|
332
|
+
duration. *Server-side:* a per-account daily spend cap refuses runs with
|
|
333
|
+
`daily_cap_exceeded`. (US-538, US-537)
|
|
334
|
+
- Contract version `2026-08` in `X-Clipwright-Contract` and `contract_version`.
|
|
335
|
+
(US-533)
|
package/README.md
CHANGED
|
@@ -27,6 +27,7 @@ Any MCP host works — the server speaks JSON-RPC over stdio.
|
|
|
27
27
|
## Tools
|
|
28
28
|
|
|
29
29
|
- `list_voices` — voice catalog. Free, spends no credits.
|
|
30
|
+
- `list_actors` — ready-made faces with stable ids and verified formats. Free.
|
|
30
31
|
- `quote_ugc` — estimated duration and price, plus a warning when `make_ugc`
|
|
31
32
|
with the same input would be refused for money or access. Free.
|
|
32
33
|
- `get_account` — balance, debt and holds of the account. Free.
|
|
@@ -44,4 +45,5 @@ rejected up front instead of being accepted and ignored.
|
|
|
44
45
|
Bumping the `attempt` field starts a **new paid render**. It is the way to retry
|
|
45
46
|
a failed run on purpose, not a free refresh.
|
|
46
47
|
|
|
47
|
-
`SKILL.md` ships inside the package with the full operating instructions
|
|
48
|
+
`SKILL.md` ships inside the package with the full operating instructions, and
|
|
49
|
+
`CHANGELOG.md` next to it says what changed in each release and what was removed.
|
package/SKILL.md
CHANGED
|
@@ -9,6 +9,10 @@ The package `@clipwright/mcp-server` (`bin: clipwright-mcp`) is published to npm
|
|
|
9
9
|
under the MIT license, so you do NOT need the repository to install it — `npx` is
|
|
10
10
|
enough. Building from source is kept below as the development path.
|
|
11
11
|
|
|
12
|
+
What changed in each version — above all what was removed or changed
|
|
13
|
+
incompatibly — is in `CHANGELOG.md`, shipped next to this file. Read its
|
|
14
|
+
**Breaking:** entries before you move to a newer version.
|
|
15
|
+
|
|
12
16
|
Four client-side packages — `@clipwright/core`, `@clipwright/sdk`,
|
|
13
17
|
`@clipwright/mcp-server` and `@clipwright/cli` — are MIT; the service itself
|
|
14
18
|
(REST API, render pipeline, dashboard) is closed. That split is deliberate, not
|
|
@@ -268,6 +272,7 @@ is spent:
|
|
|
268
272
|
| `source` | dimensions of the selected actor variant, a probed `image`, or the default actor (432×768) |
|
|
269
273
|
| `actor` | selected `actor_id`, `version` and `gender`; default `{gender}` when no face is selected; `null` for caller-supplied `image` |
|
|
270
274
|
| `resolved_aspect_ratio` | the aspect ratio that will ACTUALLY be rendered for this input |
|
|
275
|
+
| `tts_model` | the speech model this run will use; the script's character ceiling depends on it |
|
|
271
276
|
| `warnings[]` | which of the parameters you passed will not be honoured |
|
|
272
277
|
| `contract_version` | which contract version this price was quoted under |
|
|
273
278
|
|
|
@@ -276,6 +281,12 @@ construction** — both surfaces call the same function. If quote returns 400, t
|
|
|
276
281
|
run returns the same 400; if quote showed `resolved_aspect_ratio: "9:16"` for a
|
|
277
282
|
requested `1:1`, then 9:16 is what gets rendered.
|
|
278
283
|
|
|
284
|
+
**Unknown fields are refused, not ignored.** A key the contract does not have —
|
|
285
|
+
`aspectRatio`, `aspect`, `ttsModel` — gets 400 `unknown_field` before any charge.
|
|
286
|
+
`fields` names each key, and the message suggests the matching field
|
|
287
|
+
(`aspect_ratio`). Until clipwright#166 such keys were dropped silently, so a
|
|
288
|
+
misspelled `aspect_ratio` rendered the default 9:16.
|
|
289
|
+
|
|
279
290
|
**Rejected fields — do not try to pass them.** They are not declared in the tool
|
|
280
291
|
schema, and the server answers 400 `rejected_field` before a run is even created:
|
|
281
292
|
|
|
@@ -307,14 +318,26 @@ them here would mean offering what the server punishes you for (section 3).
|
|
|
307
318
|
|
|
308
319
|
`script` (required while `segments` is rejected; length is limited by the resolved
|
|
309
320
|
TTS model, as reported by `tools/list`: `eleven_v3` allows 5000 characters,
|
|
310
|
-
`
|
|
311
|
-
as two characters. There is no word-count limit or fixed
|
|
321
|
+
`eleven_flash_v2_5` and `eleven_turbo_v2_5` allow 10000. Spaces, audio tags and stress
|
|
322
|
+
marks count; emoji may count as two characters. There is no word-count limit or fixed
|
|
323
|
+
duration implied by it), `tts_model` (every preset speaks `eleven_v3`, the most
|
|
324
|
+
expressive model; `eleven_flash_v2_5` and `eleven_turbo_v2_5` cost less and suit
|
|
325
|
+
languages other than Russian), optionally `person` OR
|
|
312
326
|
`image` (a public `https` URL), plus `name`, `captions` (defaults to `false` —
|
|
313
327
|
**captions are opt-in, ASK THE USER FIRST**), `caption_style`
|
|
314
328
|
(`hormozi`/`tiktok`/`minimal`), `look` (`natural`/`commercial`/`raw_iphone`),
|
|
315
329
|
`aspect_ratio` (`9:16`/`1:1`, with NO default — silence and an explicit choice
|
|
316
330
|
differ), `resolution` (`720p`/`1080p`/`4k`), `voice`/`voice_id`.
|
|
317
331
|
|
|
332
|
+
**Russian stress marks.** Tell a user who writes in Russian that they can fix stress:
|
|
333
|
+
write the stressed vowel as a capital inside a lowercase word — `потОм`, `зАмок` — and
|
|
334
|
+
Clipwright sends `eleven_v3` the stress mark U+0301 (`пото́м`). A capital that starts a
|
|
335
|
+
word stays a capital, a word with a second capital or an inner capital consonant
|
|
336
|
+
(`ВУЗы`, all caps) stays as written, and a U+0301 typed directly is kept. A single
|
|
337
|
+
inner capital vowel always reads as stress, so `ЯндексЕда` needs a space. Keep Russian scripts on `eleven_v3`: the 2.5 models misread the mark, so a script
|
|
338
|
+
carrying it draws a warning there, and so does any Cyrillic script. Retrying never
|
|
339
|
+
fixes stress; only the text does.
|
|
340
|
+
|
|
318
341
|
The exact list is always available from the tool schema itself: `tools/list` is
|
|
319
342
|
generated from the same shape, and fields that are not honoured carry
|
|
320
343
|
`NOT HONORED YET` right in their own `description`.
|
|
@@ -538,7 +561,7 @@ So:
|
|
|
538
561
|
change the text or the voice instead;
|
|
539
562
|
- **bump `attempt` only for a refusal that looks temporary** (vendor timeout, 5xx,
|
|
540
563
|
a dropped connection);
|
|
541
|
-
- **no daily cap stands between you and your credits (0.
|
|
564
|
+
- **no daily cap stands between you and your credits (0.7.0).** Not on your
|
|
542
565
|
account, and not on the service either: `global_cap_exceeded` is no longer
|
|
543
566
|
produced. What still stops a run before any paid call is your own balance, an
|
|
544
567
|
unpaid debt, and our killswitch.
|
|
@@ -728,7 +751,7 @@ Before you start, make sure of two different things.
|
|
|
728
751
|
|
|
729
752
|
Tell two classes of failure apart, because they are fixed differently:
|
|
730
753
|
|
|
731
|
-
- **`rejected_field`, `aspect_conflict`** — a contract doing its job, not a
|
|
754
|
+
- **`rejected_field`, `unknown_field`, `aspect_conflict`** — a contract doing its job, not a
|
|
732
755
|
defect. Read the error text: it names both the reason and the replacement;
|
|
733
756
|
- **everything else** (timeout, 5xx, empty response, tool not found) — a candidate
|
|
734
757
|
for a real defect. Here, run the same two curl commands from section 6: if curl
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clipwright/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "MCP server for Clipwright: generate UGC videos from your coding agent",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
},
|
|
18
18
|
"files": [
|
|
19
19
|
"dist",
|
|
20
|
-
"SKILL.md"
|
|
20
|
+
"SKILL.md",
|
|
21
|
+
"CHANGELOG.md"
|
|
21
22
|
],
|
|
22
23
|
"engines": {
|
|
23
24
|
"node": ">=20"
|
|
@@ -28,8 +29,8 @@
|
|
|
28
29
|
"dependencies": {
|
|
29
30
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
30
31
|
"zod": "^4.4.3",
|
|
31
|
-
"@clipwright/core": "0.
|
|
32
|
-
"@clipwright/sdk": "0.
|
|
32
|
+
"@clipwright/core": "0.12.0",
|
|
33
|
+
"@clipwright/sdk": "0.12.0"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
35
36
|
"@types/node": "^26.1.1"
|