@clipwright/mcp-server 0.11.0 → 0.13.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 ADDED
@@ -0,0 +1,374 @@
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.13.0] - 2026-09-13
14
+
15
+ ### Changed
16
+
17
+ - `listVoices()`, MCP `list_voices` and `clipwright voices` accept a voice name
18
+ outside the five presets, a `gender` other than `female` or `male`, a voice
19
+ without `language`, and the new optional fields `kind`, `locale`, `accent`,
20
+ `age`, `use_case`, `supported_models` and `verified_models`, plus a top-level
21
+ `models` list. Unknown keys are dropped, as before. Until now the first such
22
+ voice made all three fail. (clipwright#164)
23
+ - A voice name the client does not know goes to the API, which decides.
24
+ `clipwright make --voice` checks only the form of the name: letters, digits,
25
+ `_` and `-`, up to 64 characters. The SDK and MCP `make_ugc` no longer refuse
26
+ such a name before sending it. In `tools/list`, `voice` is a string with a
27
+ pattern instead of an enum of preset names. The API itself is unchanged: a
28
+ name that is not a preset still gets 400 `invalid_request` with the same
29
+ message, before any charge. (clipwright#164)
30
+ - In `VoiceCatalogEntry`, `name` and `gender` are typed `string`, and
31
+ `language` is optional. In `MakeUgcInputArgs`, `voice` is typed `string`.
32
+ (clipwright#164)
33
+ - *Server-side:* quote and run accept a voice from the catalog by its name, as
34
+ well as a preset. A catalog voice speaks `eleven_v3` unless `tts_model` names
35
+ another model, and its script limit follows that model: 5,001 characters
36
+ without `tts_model` get 400 before any charge, as with a preset. A name that
37
+ is neither a preset nor a catalog voice gets 400 `invalid_request` that says
38
+ the voice is unknown; a voice retired from the catalog gets 400 that says it
39
+ was retired. Both point to `list_voices`. The language of a voice limits
40
+ nothing: any catalog voice speaks any language. A run already stored with a
41
+ voice that was later retired still reads, with its warnings.
42
+ (clipwright#164)
43
+
44
+ ### Added
45
+
46
+ - `@clipwright/core` exports `VOICE_NAME_PATTERN`, `isVoicePresetName`,
47
+ `serverUgcInputWith` and `voiceModelEntry`. The subpath
48
+ `@clipwright/core/voice-admission` exports `serverUgcInput`, which checks a
49
+ voice name against the catalog, and `catalogVoiceRefusal`. The catalog stays
50
+ out of the main entry point. (clipwright#164)
51
+
52
+ ## [0.12.0] - 2026-09-13
53
+
54
+ ### Changed
55
+
56
+ - **Breaking:** *Server-side:* quote and run refuse a key that is not part of
57
+ the contract with 400 `unknown_field`, before any charge. Such keys were
58
+ dropped silently before, so a misspelled field fell back to its default:
59
+ `aspectRatio: "16:9"` rendered 9:16 without a warning. `fields` names each
60
+ unknown key, and the message suggests the matching field (`aspect_ratio`).
61
+ Fix the key name. The contract version moved to `2026-09-13`.
62
+ (clipwright#166)
63
+ - *Server-side:* the duration estimate for a Cyrillic script uses 2.3 words a
64
+ second instead of 2.6, measured on `eleven_v3`. A Russian script now
65
+ quotes and reserves about 13% more credits, closer to what the run is
66
+ charged. Other scripts keep 2.6. (clipwright#164)
67
+ - A stress mark (U+0301) at the start of a word is no longer counted as its
68
+ first letter, so a capital right after the mark stays a capital. A capital
69
+ vowel later in the same word still marks stress. (clipwright#164)
70
+ - Each package ships this changelog as `CHANGELOG.md`. (clipwright#102)
71
+
72
+ ### Added
73
+
74
+ - Quote returns `tts_model`, the speech model the run will use.
75
+ (clipwright#164)
76
+ - `@clipwright/core` exports `unknownFields`, `unknownFieldError`,
77
+ `unknownFieldBody` and `ACCEPTED_UGC_FIELDS`, and `unknown_field` is part of
78
+ `API_ERROR_CODES`. (clipwright#166)
79
+
80
+ ### Fixed
81
+
82
+ - *Server-side:* a body with an empty key name gets 400 `unknown_field`
83
+ instead of 500 `internal_error`. (clipwright#167)
84
+
85
+ ## [0.11.0] - 2026-09-13
86
+
87
+ ### Removed
88
+
89
+ - **Breaking:** `eleven_multilingual_v2` is no longer a valid `tts_model`. Quote
90
+ and run refuse it with 400 before any charge. Pass `eleven_v3`,
91
+ `eleven_flash_v2_5` or `eleven_turbo_v2_5`, or omit the field. Runs stored with
92
+ the old value still read. (clipwright#145)
93
+
94
+ ### Changed
95
+
96
+ - **Breaking:** every voice preset and a raw `voice_id` now speak on `eleven_v3`.
97
+ Before, four of five presets and a raw `voice_id` used `eleven_multilingual_v2`,
98
+ with a 10,000-character script ceiling. The default ceiling is now 5,000
99
+ characters. A script of 5,001–10,000 characters that passed before is refused;
100
+ send it with `tts_model: "eleven_flash_v2_5"` or `"eleven_turbo_v2_5"` (10,000
101
+ each). The refusal names these models when the script fits them. The voices
102
+ sound different, and the samples from `list_voices` were re-recorded.
103
+ (clipwright#145)
104
+ - **Breaking:** on `eleven_v3`, a single capital vowel after the first letter of a
105
+ Cyrillic word marks stress: `потОм` is sent as `пото́м` (lowercase vowel plus
106
+ U+0301). A script that used such a capital for another reason is now spoken
107
+ differently; write that word in lowercase. A capital at the start of a word, a
108
+ word in capitals, and a word with a second capital stay as written. Stress marks
109
+ count toward the character limit. (clipwright#145)
110
+ - The contract version moved from `2026-08` to `2026-09`. (clipwright#145)
111
+
112
+ ### Added
113
+
114
+ - `tts_model` accepts `eleven_flash_v2_5` and `eleven_turbo_v2_5`, 10,000
115
+ characters each. (clipwright#145)
116
+ - *Server-side:* quote and run return a warning when a script with stress marks or
117
+ in Cyrillic goes to a 2.5 model. The default path stays silent. (clipwright#145)
118
+ - `@clipwright/core` exports the stress helpers (`STRESS_MARK`,
119
+ `stressMarksFromCapitals`, `speechTextFor`) and the run preflight schema
120
+ (`runPreflight`, `parseRunPreflight`). (clipwright#145, clipwright#146)
121
+
122
+ ### Fixed
123
+
124
+ - *Server-side:* for a body with `image`, the 202 response of a run and the quote
125
+ now return the same `warnings[]`. Warnings that depend on a network probe no
126
+ longer disappear when a run fails. (clipwright#146)
127
+
128
+ ## [0.10.0] - 2026-09-11
129
+
130
+ ### Added
131
+
132
+ - MCP tool `get_account`, SDK `getAccount()` and CLI `clipwright account`. All
133
+ three read `GET /v1/account` (balance, debt, holds, grants) and spend nothing.
134
+ (clipwright#135)
135
+ - *Server-side:* quote adds a warning when a run with the same input would be
136
+ refused with `account_not_admitted`, `debt_outstanding` or
137
+ `insufficient_credits`. The warning carries the same numbers as the refusal.
138
+ (clipwright#134)
139
+ - `@clipwright/core` exports `API_ENDPOINTS`, `QUICKSTART_ENDPOINTS`,
140
+ `endpointLabel` and `NODE_MIN_MAJOR` (the Node.js major the clients require).
141
+ (clipwright#135, clipwright#129)
142
+
143
+ ### Fixed
144
+
145
+ - *Server-side:* the `error` of a failed run in `GET /v1/runs/{id}` no longer
146
+ contains stack frames or internal file paths. (clipwright#133)
147
+ - *Server-side:* when our wait for the avatar vendor times out, the run is charged
148
+ nothing, and its warning says what happened. (clipwright#150)
149
+
150
+ ## [0.9.0] - 2026-09-09
151
+
152
+ ### Added
153
+
154
+ - Each voice in `GET /v1/voices`, `list_voices` and `listVoices()` carries
155
+ `preview_url` and `preview_expires_at`: a signed link to a sample recorded with
156
+ that voice and its model. The link is valid for one hour. A voice without a
157
+ sample has neither field. A 0.8.0 client drops both fields. (clipwright#147)
158
+ - CLI `clipwright voices` prints the sample link on its own line. (clipwright#147)
159
+
160
+ ## [0.8.0] - 2026-09-09
161
+
162
+ ### Added
163
+
164
+ - Actor library: `GET /v1/actors`, MCP tool `list_actors`, SDK `listActors()` and
165
+ CLI `clipwright actors`. Each actor has a stable `actor_id`, a name, a gender,
166
+ an approximate age, a version and verified image variants. (clipwright#120)
167
+ - `actor_id` input on quote and run, and CLI `--actor-id` on `make` and `quote`.
168
+ Do not combine it with `image` or `person`. (clipwright#120)
169
+ - Quote and run responses carry `actor`: the selected `actor_id`, `version` and
170
+ `gender`; `{gender}` for the default actor; `null` when you pass your own
171
+ `image`. (clipwright#64, clipwright#120)
172
+
173
+ ## [0.7.0] - 2026-09-09
174
+
175
+ ### Removed
176
+
177
+ - **Breaking:** `daily_remaining_credits` is gone from `GET /v1/account` and from
178
+ the `account` schema in `@clipwright/core`. The per-account daily spend cap it
179
+ reported was removed. A client that read the field now gets `undefined`; read
180
+ `balance_credits`, and `debt_credits` for a block. The contract version was not
181
+ moved for this change: it stayed `2026-08` until 0.11.0, so the header gave no
182
+ signal. (clipwright#139)
183
+ - **Breaking:** `@clipwright/core` no longer exports `MAX_SCRIPT_WORDS` or
184
+ `SCRIPT_SECONDS_BASIS`. Code that imports them fails; use `TTS_MODEL_CHAR_CAP`
185
+ or `MAX_SCRIPT_CHARS`. (clipwright#128)
186
+ - *Server-side:* the refusal `daily_cap_exceeded` is no longer produced. Runs
187
+ refused before keep it in their history. (clipwright#139)
188
+ - *Server-side:* the refusal `global_cap_exceeded` is no longer produced. The
189
+ service-wide daily spend cap became an internal alert. (clipwright#141)
190
+
191
+ ### Changed
192
+
193
+ - The 180-word script ceiling is replaced by a character limit per speech model:
194
+ `eleven_v3` 5,000, `eleven_multilingual_v2` 10,000. Length is counted as
195
+ JavaScript `.length`, spaces and audio tags included; an emoji may count as two.
196
+ Longer scripts than before are accepted. The refusal text changed from
197
+ `script is ~N words; ceiling is 180 words` to
198
+ `script has N characters; <model> allows at most N characters`; update code
199
+ that matches on it. (clipwright#128)
200
+ - **Breaking:** *Server-side:* quote and run refuse a script whose text contains
201
+ U+FFFD with 400 `script_encoding_lost`, before any charge. Such a script was
202
+ accepted before and billed for about a second of speech. The bytes were lost
203
+ before the request left the client: send the script as valid UTF-8.
204
+ (clipwright#131)
205
+ - *Server-side:* a run whose speech is impossibly short for its script fails with
206
+ `speech_too_short_for_script` and is charged nothing, instead of succeeding.
207
+ Retrying rarely helps. (clipwright#131)
208
+ - *Server-side:* a new sign-up gets an admitted account with zero credits, so it
209
+ is no longer refused with `account_not_admitted` until the owner admits it.
210
+ (clipwright#112)
211
+
212
+ ## [0.6.0] - 2026-09-06
213
+
214
+ ### Added
215
+
216
+ - `@clipwright/cli` installs a second binary, `clipwright-cli`, next to
217
+ `clipwright`. An unrelated npm package also ships a `clipwright` binary; the
218
+ second name avoids that collision. `core`, `sdk` and `mcp-server` have no
219
+ changes in this release and moved to keep one version. (clipwright#105)
220
+
221
+ ## [0.5.0] - 2026-09-06
222
+
223
+ ### Added
224
+
225
+ - `POST /v1/uploads` takes a local PNG or JPEG of up to 10 MB and returns
226
+ `upload_id`, `url`, `media_type`, `bytes`, `width`, `height` and `expires_at`.
227
+ Pass the https `url` as `image`. The url is valid for 24 hours and the object is
228
+ kept for 7 days. An account may upload 20 images a day. New refusal codes:
229
+ `invalid_image`, `unsupported_media_type`, `upload_cap_exceeded`.
230
+ (clipwright#99)
231
+ - MCP tool `upload_image`, SDK `uploadImage()`, CLI `clipwright upload <path>`, and
232
+ `--image`, `--image-file`, `--aspect-ratio`, `--resolution` on CLI `make` and
233
+ `quote`. (clipwright#99)
234
+ - `tts_model` input (`eleven_v3` or `eleven_multilingual_v2`) and CLI
235
+ `--tts-model`. Without it the preset's model is used. Each voice in the catalog
236
+ names its `model`. A script over the model's character limit (v3 5,000, v2
237
+ 10,000) is refused before any charge, in addition to the 180-word ceiling.
238
+ (clipwright#101)
239
+ - MCP `tools/list` describes `image`, `aspect_ratio`, `resolution`, `voice` and
240
+ `voice_id`; the descriptions were empty before. (clipwright#99)
241
+
242
+ ### Changed
243
+
244
+ - *Server-side:* the `owner_ru_clone` preset speaks on `eleven_v3`. All presets
245
+ used `eleven_multilingual_v2` before. (clipwright#101)
246
+
247
+ ## [0.4.0] - 2026-08-28
248
+
249
+ ### Changed
250
+
251
+ - **Breaking:** the default API address in the SDK, CLI and MCP server moved to
252
+ `https://api.clipwright.io`. The old address
253
+ `https://api-production-7e69.up.railway.app` still answers, so older clients
254
+ keep working. If your network allowlists hosts, add `api.clipwright.io`, or pin
255
+ the old address with `CLIPWRIGHT_API_URL` or the SDK `baseUrl` option. (US-613)
256
+
257
+ ## [0.3.0] - 2026-08-28
258
+
259
+ ### Removed
260
+
261
+ - **Breaking:** `@clipwright/core` no longer exports `MAX_SCRIPT_SECONDS`. Code
262
+ that imports it fails; `SCRIPT_SECONDS_BASIS` holds the value (and was removed
263
+ in turn in 0.7.0).
264
+
265
+ ### Changed
266
+
267
+ - **Breaking:** the CLI and the MCP server refuse a `CLIPWRIGHT_API_URL` that is
268
+ not `https`. Loopback addresses may stay `http`. Point the variable at an https
269
+ address. (clipwright#85)
270
+ - **Breaking:** every URL field of the input is limited to 2,048 characters
271
+ (`MAX_URL_LENGTH`). A longer URL is refused with 400. Pass a URL of at most
272
+ 2,048 characters, for example by hosting the file at a shorter address.
273
+ (clipwright#85)
274
+ - **Breaking:** SDK requests now have deadlines. `requestTimeoutMs` (per client,
275
+ default 30 s) bounds every request, and `maxWaitMs` (per `makeUgc` call, default
276
+ 10 min) bounds the whole call, including the request in flight. A call that used
277
+ to hang now rejects. A start request cut off mid-flight throws
278
+ `ClipwrightResponseError` with `mayHaveTakenEffect: true`: check the run before
279
+ retrying with a new idempotency key. Raise `requestTimeoutMs` behind a slow
280
+ proxy.
281
+ - **Breaking:** *Server-side:* a run from an account not admitted to the beta is
282
+ refused with 403 `account_not_admitted` before any charge. Topping up does not
283
+ lift it. The clients parse this refusal from 0.3.0 on. (US-620)
284
+ - The voice catalog is in English, and the SDK validates the `GET /v1/voices`
285
+ response. Each voice has `name`, `language`, `gender` and `description`.
286
+ (clipwright#85)
287
+ - The MCP server checks the shape of `run_id` in `get_run`. (clipwright#85)
288
+ - *Server-side:* the video link in a finished run is signed for 7 days instead of
289
+ 1. (clipwright#22)
290
+ - *Server-side:* a failed run is charged only if the vendor accepted the work that
291
+ produces the clip. A run that paid only for speech is charged nothing.
292
+ (clipwright#46)
293
+ - *Server-side:* credits bought while an account has debt pay the debt first; only
294
+ the rest reaches the balance. (US-611)
295
+
296
+ ### Fixed
297
+
298
+ - *Server-side:* 401 and validation refusals use the declared error body.
299
+ Validation errors return `invalid_request` and list each problem as
300
+ `field: reason`, up to 12. Before, clients reported these bodies as "not a
301
+ Clipwright error object". (US-616)
302
+ - *Server-side:* the 202 response of a run carries its `warnings[]`; it always
303
+ returned an empty list before. (clipwright#64)
304
+
305
+ ## [0.2.0] - 2026-07-29
306
+
307
+ ### Added
308
+
309
+ - `@clipwright/cli` is published for the first time, under MIT. Commands:
310
+ `quote`, `make`, `runs <id>`, `voices`. `make` takes `--script`, `--person`,
311
+ `--captions`, `--voice`, `--voice-id` and `--retry`. (US-622)
312
+ - *Server-side:* `GET /v1/account` returns `account_id`, `balance_credits`,
313
+ `debt_credits`, `holds_credits`, `daily_remaining_credits` and `grants`.
314
+ (US-602)
315
+ - `@clipwright/core` exports the refusal schemas and the retry policy:
316
+ `parseApiFailure`, `isRetryableFailure`, `retryDelayMs`, `agentFailureReport`,
317
+ `apiError`, the 402 and 429 bodies, the rate-limit header names, `account` and
318
+ `creditGrant`. (US-622)
319
+ - *Server-side:* a service-wide daily spend cap; a run past it is refused with
320
+ `global_cap_exceeded`. (US-603)
321
+
322
+ ### Changed
323
+
324
+ - **Breaking:** *Server-side:* a run reserves credits before rendering. Without
325
+ enough balance the API answers 402 `insufficient_credits`; with unpaid debt, 402
326
+ `debt_outstanding`, whatever the balance. Buy credits to lift either. (US-602)
327
+ - **Breaking:** *Server-side:* rate limits per account: 60 requests a minute for
328
+ starting runs, 300 for quote, voices, run status and account. Over the limit
329
+ the API answers 429 `rate_limited` with `Retry-After` and `X-RateLimit-*`
330
+ headers; wait and repeat the same call. At most 3 renders run at once per
331
+ account; a fourth queues and still returns 202. (US-605)
332
+ - **Breaking:** the SDK throws `ClipwrightApiError` or `ClipwrightResponseError`
333
+ (both extend `Error`) instead of a plain `Error`, and reads the status before
334
+ the body. Code that parsed the message text should read the error's status and
335
+ code instead. `makeUgc` now waits out 429 and 5xx while polling; money refusals
336
+ and other 4xx still throw at once. `attempt` must be a positive safe integer and
337
+ is checked before any request. (US-622)
338
+ - **Breaking:** MCP tools return a refusal as a JSON report inside the text block,
339
+ with `isError: true`, instead of one sentence. Agents should branch on its
340
+ `retryable` field, not on prose. (US-622)
341
+ - The MCP server starts when `~/.clipwright` is read-only; only `make_ugc`
342
+ refuses, naming the variable that fixes it. (US-622)
343
+ - `SKILL.md` inside `@clipwright/mcp-server` is in English. (US-622)
344
+ - *Server-side:* idempotency keys are scoped to the account, so two accounts can
345
+ use the same key. (US-604)
346
+
347
+ ## [0.1.0] - 2026-07-26
348
+
349
+ ### Added
350
+
351
+ - First publication of `@clipwright/core`, `@clipwright/sdk` and
352
+ `@clipwright/mcp-server` under MIT. `@clipwright/cli` was not published.
353
+ - API: quote (`POST /v1/skills/make_ugc/quote`), run
354
+ (`POST /v1/skills/make_ugc/run`, `Idempotency-Key` required), run status
355
+ (`GET /v1/runs/{id}`), voice catalog (`GET /v1/voices`). Requests carry a
356
+ `cw_*` bearer token. (US-205, US-516, US-550)
357
+ - MCP tools `quote_ugc`, `make_ugc`, `get_run`, `list_voices`. `make_ugc` returns
358
+ a `run_id` at once, and the agent polls `get_run`. (US-206, US-512, US-516)
359
+ - SDK `ClipwrightClient` with `quoteUgc`, `startUgc`, `makeUgc`, `getRun` and
360
+ `listVoices`. The idempotency key comes from the input and
361
+ `CLIPWRIGHT_CLIENT_ID`; `attempt` starts a deliberate new run. (US-201, US-202)
362
+ - Input: `script` (up to 180 words), `voice`, `voice_id`, `image`,
363
+ `aspect_ratio` (default 9:16, 16:9 supported), `resolution`, `captions`,
364
+ `disclosure_overlay`. Parameters that are not honoured come back in
365
+ `warnings[]`; `webhook_url` is refused with 400. (US-533, US-535, US-539)
366
+ - Quote returns `credits_estimate`, `duration_estimate_sec`, `warnings`,
367
+ `contract_version`, `source` and `resolved_aspect_ratio`. A source whose aspect
368
+ ratio differs from the request by more than 15% is refused before any charge;
369
+ up to 15% it is snapped with a warning. (US-525)
370
+ - Credits: 30 per second of video, reserved at start and charged on the measured
371
+ duration. *Server-side:* a per-account daily spend cap refuses runs with
372
+ `daily_cap_exceeded`. (US-538, US-537)
373
+ - Contract version `2026-08` in `X-Clipwright-Contract` and `contract_version`.
374
+ (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
 
@@ -550,7 +561,7 @@ So:
550
561
  change the text or the voice instead;
551
562
  - **bump `attempt` only for a refusal that looks temporary** (vendor timeout, 5xx,
552
563
  a dropped connection);
553
- - **no daily cap stands between you and your credits (0.8.0).** Not on your
564
+ - **no daily cap stands between you and your credits (0.7.0).** Not on your
554
565
  account, and not on the service either: `global_cap_exceeded` is no longer
555
566
  produced. What still stops a run before any paid call is your own balance, an
556
567
  unpaid debt, and our killswitch.
@@ -740,7 +751,7 @@ Before you start, make sure of two different things.
740
751
 
741
752
  Tell two classes of failure apart, because they are fixed differently:
742
753
 
743
- - **`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
744
755
  defect. Read the error text: it names both the reason and the replacement;
745
756
  - **everything else** (timeout, 5xx, empty response, tool not found) — a candidate
746
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.11.0",
3
+ "version": "0.13.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.11.0",
32
- "@clipwright/sdk": "0.11.0"
32
+ "@clipwright/core": "0.13.0",
33
+ "@clipwright/sdk": "0.13.0"
33
34
  },
34
35
  "devDependencies": {
35
36
  "@types/node": "^26.1.1"