@productmaker/mcp 12.0.0 → 12.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/http.js +100 -5
- package/dist/stdio.js +100 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -309,6 +309,12 @@ The `base64` field was removed. MCP JSON-RPC transports truncate large tool argu
|
|
|
309
309
|
|
|
310
310
|
## Version history
|
|
311
311
|
|
|
312
|
+
### 12.0.1 — Service output recovery
|
|
313
|
+
|
|
314
|
+
Internal motion output admission isolates artifacts by claim, accepts paired
|
|
315
|
+
upload ordering and preserves historical output URLs. Complete upload targets
|
|
316
|
+
and full-refund-aware settlement protect delivery without MCP contract changes.
|
|
317
|
+
|
|
312
318
|
### 12.0.0 — Ready service required for new service content
|
|
313
319
|
|
|
314
320
|
- New Motion Graphics videos require an owned ready Service (`brandId`) before
|
package/dist/http.js
CHANGED
|
@@ -16365,6 +16365,23 @@ var motionGraphicsStateSchema = z86.object({
|
|
|
16365
16365
|
speechOperations: z86.record(z86.string().regex(/^[a-f0-9]{64}$/), MotionGraphicsSpeechOperationSchema).refine((operations) => Object.keys(operations).length <= MOTION_GRAPHICS_VO_SEGMENTS_MAX + 3 * MOTION_GRAPHICS_LIPSYNC_MAX_CLIPS, {
|
|
16366
16366
|
message: "too many speech receipts"
|
|
16367
16367
|
}).optional(),
|
|
16368
|
+
/** Durable, unpaid Generate intent. Removed only after capture admission and payment. */
|
|
16369
|
+
captureAdmission: z86.object({
|
|
16370
|
+
version: z86.literal("v1"),
|
|
16371
|
+
captureId: z86.string().uuid().optional(),
|
|
16372
|
+
maxSocialAcquisitionPriceCents: z86.number().finite().nonnegative(),
|
|
16373
|
+
maxTotalPriceCents: z86.number().finite().nonnegative(),
|
|
16374
|
+
deadlineAt: z86.string().datetime(),
|
|
16375
|
+
failureCause: z86.enum([
|
|
16376
|
+
"site_blocked",
|
|
16377
|
+
"site_unreachable",
|
|
16378
|
+
"not_enough_content",
|
|
16379
|
+
"internal",
|
|
16380
|
+
"expired",
|
|
16381
|
+
"price_exceeded",
|
|
16382
|
+
"insufficient_credits"
|
|
16383
|
+
]).optional()
|
|
16384
|
+
}).strict().optional(),
|
|
16368
16385
|
websiteCapture: WebsiteCaptureBindingSchema.optional(),
|
|
16369
16386
|
format: MotionGraphicsFormatSchema,
|
|
16370
16387
|
durationSec: MotionGraphicsDurationSchema,
|
|
@@ -16373,6 +16390,8 @@ var motionGraphicsStateSchema = z86.object({
|
|
|
16373
16390
|
stage: MotionGraphicsStageSchema,
|
|
16374
16391
|
/** How many times an agent has taken this job. */
|
|
16375
16392
|
claims: z86.number().int().nonnegative(),
|
|
16393
|
+
/** Upload admission binds all outputs to this claim; absent on legacy jobs. */
|
|
16394
|
+
outputAttempt: z86.number().int().positive().optional(),
|
|
16376
16395
|
/** Until when the current claim holds. Null while queued. */
|
|
16377
16396
|
leaseUntil: z86.string().datetime().nullable(),
|
|
16378
16397
|
/** When the job first entered the queue: the age that decides "nobody is coming". */
|
|
@@ -16395,8 +16414,7 @@ var motionGraphicsStateSchema = z86.object({
|
|
|
16395
16414
|
/**
|
|
16396
16415
|
* Where the live preview (a screenshot of the site taken during research)
|
|
16397
16416
|
* was signed for upload. Recorded when the upload is signed, because it
|
|
16398
|
-
* arrives long before `done` writes `outputs`.
|
|
16399
|
-
* (`motionGraphicsOutputKey(taskId, "preview")`).
|
|
16417
|
+
* arrives long before `done` writes `outputs`. New admissions isolate it by claim.
|
|
16400
16418
|
*/
|
|
16401
16419
|
previewKey: z86.string().min(1).optional(),
|
|
16402
16420
|
outputs: MotionGraphicsOutputsSchema.optional(),
|
|
@@ -16515,6 +16533,8 @@ var MotionGraphicsExistingClipSchema = z87.object({
|
|
|
16515
16533
|
}
|
|
16516
16534
|
});
|
|
16517
16535
|
var MotionGraphicsJobSchema = z87.object({
|
|
16536
|
+
/** Protocol 7: delivery settlement follows the accepted hook prefix. */
|
|
16537
|
+
deliveryUsageVersion: z87.literal("v1").optional(),
|
|
16518
16538
|
soundtrackVersion: z87.literal("v1").optional(),
|
|
16519
16539
|
speechRecoveryVersion: z87.literal("v1").optional(),
|
|
16520
16540
|
freeDirectionVersion: z87.literal(MOTION_GRAPHICS_FREE_DIRECTION_VERSION).optional(),
|
|
@@ -16704,6 +16724,12 @@ var MotionGraphicsUploadResponseSchema = z87.object({
|
|
|
16704
16724
|
contentType: z87.string()
|
|
16705
16725
|
}))
|
|
16706
16726
|
});
|
|
16727
|
+
var MotionGraphicsDeliveryUsageSchema = z87.object({
|
|
16728
|
+
variantsDelivered: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1),
|
|
16729
|
+
clipsUsed: z87.number().int().min(0).max(MOTION_GRAPHICS_BROLL_MAX_CLIPS).optional(),
|
|
16730
|
+
lipsyncUsed: z87.number().int().min(0).max(MOTION_GRAPHICS_LIPSYNC_MAX_CLIPS).optional(),
|
|
16731
|
+
voUsed: z87.boolean().optional()
|
|
16732
|
+
}).strict();
|
|
16707
16733
|
var MotionGraphicsDoneRequestSchema = z87.object({
|
|
16708
16734
|
musicUsed: z87.boolean().optional(),
|
|
16709
16735
|
cleanVariants: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1).optional(),
|
|
@@ -16736,8 +16762,77 @@ var MotionGraphicsDoneRequestSchema = z87.object({
|
|
|
16736
16762
|
* EXTRA hook versions uploaded and delivered (0..2; the main video is not
|
|
16737
16763
|
* counted). Each paid version beyond it is refunded. Absent reads as 0.
|
|
16738
16764
|
*/
|
|
16739
|
-
variantsDelivered: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1).optional()
|
|
16740
|
-
|
|
16765
|
+
variantsDelivered: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1).optional(),
|
|
16766
|
+
usageByVariantCount: z87.array(MotionGraphicsDeliveryUsageSchema).min(1).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX).optional()
|
|
16767
|
+
}).strict().superRefine((request, ctx) => {
|
|
16768
|
+
const usage = request.usageByVariantCount;
|
|
16769
|
+
if (!usage) return;
|
|
16770
|
+
if (usage.length !== (request.variantsDelivered ?? 0) + 1) {
|
|
16771
|
+
ctx.addIssue({
|
|
16772
|
+
code: z87.ZodIssueCode.custom,
|
|
16773
|
+
path: [
|
|
16774
|
+
"usageByVariantCount"
|
|
16775
|
+
],
|
|
16776
|
+
message: "Usage must cover every delivered hook prefix"
|
|
16777
|
+
});
|
|
16778
|
+
}
|
|
16779
|
+
for (const [index, entry] of usage.entries()) {
|
|
16780
|
+
if (entry.variantsDelivered !== index) {
|
|
16781
|
+
ctx.addIssue({
|
|
16782
|
+
code: z87.ZodIssueCode.custom,
|
|
16783
|
+
path: [
|
|
16784
|
+
"usageByVariantCount",
|
|
16785
|
+
index,
|
|
16786
|
+
"variantsDelivered"
|
|
16787
|
+
],
|
|
16788
|
+
message: "Usage prefixes must be contiguous and ordered"
|
|
16789
|
+
});
|
|
16790
|
+
}
|
|
16791
|
+
const previous = usage[index - 1];
|
|
16792
|
+
for (const field of [
|
|
16793
|
+
"clipsUsed",
|
|
16794
|
+
"lipsyncUsed",
|
|
16795
|
+
"voUsed"
|
|
16796
|
+
]) {
|
|
16797
|
+
const value = entry[field];
|
|
16798
|
+
const aggregate = request[field];
|
|
16799
|
+
if (value === void 0 !== (aggregate === void 0) || index === usage.length - 1 && value !== aggregate) {
|
|
16800
|
+
ctx.addIssue({
|
|
16801
|
+
code: z87.ZodIssueCode.custom,
|
|
16802
|
+
path: [
|
|
16803
|
+
"usageByVariantCount",
|
|
16804
|
+
index,
|
|
16805
|
+
field
|
|
16806
|
+
],
|
|
16807
|
+
message: "Usage must preserve aggregate field presence and final totals"
|
|
16808
|
+
});
|
|
16809
|
+
}
|
|
16810
|
+
const before = previous?.[field];
|
|
16811
|
+
if (before !== void 0 && value !== void 0 && Number(value) < Number(before)) {
|
|
16812
|
+
ctx.addIssue({
|
|
16813
|
+
code: z87.ZodIssueCode.custom,
|
|
16814
|
+
path: [
|
|
16815
|
+
"usageByVariantCount",
|
|
16816
|
+
index,
|
|
16817
|
+
field
|
|
16818
|
+
],
|
|
16819
|
+
message: "Usage cannot decrease when a hook is added"
|
|
16820
|
+
});
|
|
16821
|
+
}
|
|
16822
|
+
}
|
|
16823
|
+
if (entry.clipsUsed !== void 0 && entry.lipsyncUsed !== void 0 && entry.lipsyncUsed > entry.clipsUsed) {
|
|
16824
|
+
ctx.addIssue({
|
|
16825
|
+
code: z87.ZodIssueCode.custom,
|
|
16826
|
+
path: [
|
|
16827
|
+
"usageByVariantCount",
|
|
16828
|
+
index,
|
|
16829
|
+
"lipsyncUsed"
|
|
16830
|
+
],
|
|
16831
|
+
message: "Lip sync usage cannot exceed clip usage"
|
|
16832
|
+
});
|
|
16833
|
+
}
|
|
16834
|
+
}
|
|
16835
|
+
});
|
|
16741
16836
|
var MotionGraphicsClipSubmitRequestSchema = z87.object({
|
|
16742
16837
|
attempt: MotionGraphicsAttemptSchema,
|
|
16743
16838
|
clips: MotionGraphicsClipRequestSchema.shape.clips
|
|
@@ -25510,7 +25605,7 @@ var ApiClient = class {
|
|
|
25510
25605
|
};
|
|
25511
25606
|
|
|
25512
25607
|
// src/index.ts
|
|
25513
|
-
var MCP_VERSION = "12.0.
|
|
25608
|
+
var MCP_VERSION = "12.0.2";
|
|
25514
25609
|
|
|
25515
25610
|
// src/meta-upload-app.ts
|
|
25516
25611
|
import { readFileSync } from "fs";
|
package/dist/stdio.js
CHANGED
|
@@ -16140,6 +16140,23 @@ var motionGraphicsStateSchema = z86.object({
|
|
|
16140
16140
|
speechOperations: z86.record(z86.string().regex(/^[a-f0-9]{64}$/), MotionGraphicsSpeechOperationSchema).refine((operations) => Object.keys(operations).length <= MOTION_GRAPHICS_VO_SEGMENTS_MAX + 3 * MOTION_GRAPHICS_LIPSYNC_MAX_CLIPS, {
|
|
16141
16141
|
message: "too many speech receipts"
|
|
16142
16142
|
}).optional(),
|
|
16143
|
+
/** Durable, unpaid Generate intent. Removed only after capture admission and payment. */
|
|
16144
|
+
captureAdmission: z86.object({
|
|
16145
|
+
version: z86.literal("v1"),
|
|
16146
|
+
captureId: z86.string().uuid().optional(),
|
|
16147
|
+
maxSocialAcquisitionPriceCents: z86.number().finite().nonnegative(),
|
|
16148
|
+
maxTotalPriceCents: z86.number().finite().nonnegative(),
|
|
16149
|
+
deadlineAt: z86.string().datetime(),
|
|
16150
|
+
failureCause: z86.enum([
|
|
16151
|
+
"site_blocked",
|
|
16152
|
+
"site_unreachable",
|
|
16153
|
+
"not_enough_content",
|
|
16154
|
+
"internal",
|
|
16155
|
+
"expired",
|
|
16156
|
+
"price_exceeded",
|
|
16157
|
+
"insufficient_credits"
|
|
16158
|
+
]).optional()
|
|
16159
|
+
}).strict().optional(),
|
|
16143
16160
|
websiteCapture: WebsiteCaptureBindingSchema.optional(),
|
|
16144
16161
|
format: MotionGraphicsFormatSchema,
|
|
16145
16162
|
durationSec: MotionGraphicsDurationSchema,
|
|
@@ -16148,6 +16165,8 @@ var motionGraphicsStateSchema = z86.object({
|
|
|
16148
16165
|
stage: MotionGraphicsStageSchema,
|
|
16149
16166
|
/** How many times an agent has taken this job. */
|
|
16150
16167
|
claims: z86.number().int().nonnegative(),
|
|
16168
|
+
/** Upload admission binds all outputs to this claim; absent on legacy jobs. */
|
|
16169
|
+
outputAttempt: z86.number().int().positive().optional(),
|
|
16151
16170
|
/** Until when the current claim holds. Null while queued. */
|
|
16152
16171
|
leaseUntil: z86.string().datetime().nullable(),
|
|
16153
16172
|
/** When the job first entered the queue: the age that decides "nobody is coming". */
|
|
@@ -16170,8 +16189,7 @@ var motionGraphicsStateSchema = z86.object({
|
|
|
16170
16189
|
/**
|
|
16171
16190
|
* Where the live preview (a screenshot of the site taken during research)
|
|
16172
16191
|
* was signed for upload. Recorded when the upload is signed, because it
|
|
16173
|
-
* arrives long before `done` writes `outputs`.
|
|
16174
|
-
* (`motionGraphicsOutputKey(taskId, "preview")`).
|
|
16192
|
+
* arrives long before `done` writes `outputs`. New admissions isolate it by claim.
|
|
16175
16193
|
*/
|
|
16176
16194
|
previewKey: z86.string().min(1).optional(),
|
|
16177
16195
|
outputs: MotionGraphicsOutputsSchema.optional(),
|
|
@@ -16290,6 +16308,8 @@ var MotionGraphicsExistingClipSchema = z87.object({
|
|
|
16290
16308
|
}
|
|
16291
16309
|
});
|
|
16292
16310
|
var MotionGraphicsJobSchema = z87.object({
|
|
16311
|
+
/** Protocol 7: delivery settlement follows the accepted hook prefix. */
|
|
16312
|
+
deliveryUsageVersion: z87.literal("v1").optional(),
|
|
16293
16313
|
soundtrackVersion: z87.literal("v1").optional(),
|
|
16294
16314
|
speechRecoveryVersion: z87.literal("v1").optional(),
|
|
16295
16315
|
freeDirectionVersion: z87.literal(MOTION_GRAPHICS_FREE_DIRECTION_VERSION).optional(),
|
|
@@ -16479,6 +16499,12 @@ var MotionGraphicsUploadResponseSchema = z87.object({
|
|
|
16479
16499
|
contentType: z87.string()
|
|
16480
16500
|
}))
|
|
16481
16501
|
});
|
|
16502
|
+
var MotionGraphicsDeliveryUsageSchema = z87.object({
|
|
16503
|
+
variantsDelivered: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1),
|
|
16504
|
+
clipsUsed: z87.number().int().min(0).max(MOTION_GRAPHICS_BROLL_MAX_CLIPS).optional(),
|
|
16505
|
+
lipsyncUsed: z87.number().int().min(0).max(MOTION_GRAPHICS_LIPSYNC_MAX_CLIPS).optional(),
|
|
16506
|
+
voUsed: z87.boolean().optional()
|
|
16507
|
+
}).strict();
|
|
16482
16508
|
var MotionGraphicsDoneRequestSchema = z87.object({
|
|
16483
16509
|
musicUsed: z87.boolean().optional(),
|
|
16484
16510
|
cleanVariants: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1).optional(),
|
|
@@ -16511,8 +16537,77 @@ var MotionGraphicsDoneRequestSchema = z87.object({
|
|
|
16511
16537
|
* EXTRA hook versions uploaded and delivered (0..2; the main video is not
|
|
16512
16538
|
* counted). Each paid version beyond it is refunded. Absent reads as 0.
|
|
16513
16539
|
*/
|
|
16514
|
-
variantsDelivered: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1).optional()
|
|
16515
|
-
|
|
16540
|
+
variantsDelivered: z87.number().int().min(0).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX - 1).optional(),
|
|
16541
|
+
usageByVariantCount: z87.array(MotionGraphicsDeliveryUsageSchema).min(1).max(MOTION_GRAPHICS_HOOK_VARIANTS_MAX).optional()
|
|
16542
|
+
}).strict().superRefine((request, ctx) => {
|
|
16543
|
+
const usage = request.usageByVariantCount;
|
|
16544
|
+
if (!usage) return;
|
|
16545
|
+
if (usage.length !== (request.variantsDelivered ?? 0) + 1) {
|
|
16546
|
+
ctx.addIssue({
|
|
16547
|
+
code: z87.ZodIssueCode.custom,
|
|
16548
|
+
path: [
|
|
16549
|
+
"usageByVariantCount"
|
|
16550
|
+
],
|
|
16551
|
+
message: "Usage must cover every delivered hook prefix"
|
|
16552
|
+
});
|
|
16553
|
+
}
|
|
16554
|
+
for (const [index, entry] of usage.entries()) {
|
|
16555
|
+
if (entry.variantsDelivered !== index) {
|
|
16556
|
+
ctx.addIssue({
|
|
16557
|
+
code: z87.ZodIssueCode.custom,
|
|
16558
|
+
path: [
|
|
16559
|
+
"usageByVariantCount",
|
|
16560
|
+
index,
|
|
16561
|
+
"variantsDelivered"
|
|
16562
|
+
],
|
|
16563
|
+
message: "Usage prefixes must be contiguous and ordered"
|
|
16564
|
+
});
|
|
16565
|
+
}
|
|
16566
|
+
const previous = usage[index - 1];
|
|
16567
|
+
for (const field of [
|
|
16568
|
+
"clipsUsed",
|
|
16569
|
+
"lipsyncUsed",
|
|
16570
|
+
"voUsed"
|
|
16571
|
+
]) {
|
|
16572
|
+
const value = entry[field];
|
|
16573
|
+
const aggregate = request[field];
|
|
16574
|
+
if (value === void 0 !== (aggregate === void 0) || index === usage.length - 1 && value !== aggregate) {
|
|
16575
|
+
ctx.addIssue({
|
|
16576
|
+
code: z87.ZodIssueCode.custom,
|
|
16577
|
+
path: [
|
|
16578
|
+
"usageByVariantCount",
|
|
16579
|
+
index,
|
|
16580
|
+
field
|
|
16581
|
+
],
|
|
16582
|
+
message: "Usage must preserve aggregate field presence and final totals"
|
|
16583
|
+
});
|
|
16584
|
+
}
|
|
16585
|
+
const before = previous?.[field];
|
|
16586
|
+
if (before !== void 0 && value !== void 0 && Number(value) < Number(before)) {
|
|
16587
|
+
ctx.addIssue({
|
|
16588
|
+
code: z87.ZodIssueCode.custom,
|
|
16589
|
+
path: [
|
|
16590
|
+
"usageByVariantCount",
|
|
16591
|
+
index,
|
|
16592
|
+
field
|
|
16593
|
+
],
|
|
16594
|
+
message: "Usage cannot decrease when a hook is added"
|
|
16595
|
+
});
|
|
16596
|
+
}
|
|
16597
|
+
}
|
|
16598
|
+
if (entry.clipsUsed !== void 0 && entry.lipsyncUsed !== void 0 && entry.lipsyncUsed > entry.clipsUsed) {
|
|
16599
|
+
ctx.addIssue({
|
|
16600
|
+
code: z87.ZodIssueCode.custom,
|
|
16601
|
+
path: [
|
|
16602
|
+
"usageByVariantCount",
|
|
16603
|
+
index,
|
|
16604
|
+
"lipsyncUsed"
|
|
16605
|
+
],
|
|
16606
|
+
message: "Lip sync usage cannot exceed clip usage"
|
|
16607
|
+
});
|
|
16608
|
+
}
|
|
16609
|
+
}
|
|
16610
|
+
});
|
|
16516
16611
|
var MotionGraphicsClipSubmitRequestSchema = z87.object({
|
|
16517
16612
|
attempt: MotionGraphicsAttemptSchema,
|
|
16518
16613
|
clips: MotionGraphicsClipRequestSchema.shape.clips
|
|
@@ -23839,7 +23934,7 @@ var ApiClient = class {
|
|
|
23839
23934
|
};
|
|
23840
23935
|
|
|
23841
23936
|
// src/index.ts
|
|
23842
|
-
var MCP_VERSION = "12.0.
|
|
23937
|
+
var MCP_VERSION = "12.0.2";
|
|
23843
23938
|
|
|
23844
23939
|
// src/meta-upload-app.ts
|
|
23845
23940
|
import { readFileSync } from "fs";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@productmaker/mcp",
|
|
3
|
-
"version": "12.0.
|
|
3
|
+
"version": "12.0.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"private": false,
|
|
6
6
|
"description": "ProductMaker MCP server — cost products, generate landing pages, UGC videos, and ad creatives, and publish to Shopify, Meta Ads, and TikTok Ads.",
|