@productmaker/mcp 12.1.4 → 12.1.6

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 CHANGED
@@ -309,6 +309,23 @@ The `base64` field was removed. MCP JSON-RPC transports truncate large tool argu
309
309
 
310
310
  ## Version history
311
311
 
312
+ ### 12.1.6 — Service extraction incident recovery
313
+
314
+ Empty HTTP202 sources exhaust bounded browser retries before eligible fallback;
315
+ useful accepted pages stay valid. Brand overview accepts 4000 characters, with
316
+ deterministic retention for isolated overflow and no additional model purchase.
317
+ Firecrawl release configuration persists for API and workers. Public MCP tool
318
+ inputs and confirmation rules remain unchanged; deployment is separate.
319
+
320
+ ### 12.1.5 — Service image direction and source recovery
321
+
322
+ Service images use the saved business identity and service-specific sales direction,
323
+ while Product generation retains its existing authoring and provider recovery.
324
+ Eligible ordinary public-web acquisition failures can recover through server-owned
325
+ Firecrawl custody, with bounded attempts and unchanged customer preparation fees.
326
+ No public provider/key/source setting or confirmation input was added. API rollout,
327
+ compatible Motion agent rollout and Firecrawl configuration remain separate.
328
+
312
329
  ### 12.1.4 — Complete product review drafts and authored scenes
313
330
 
314
331
  Product playback preserves the complete main message, pain points, benefits and
package/dist/http.js CHANGED
@@ -6682,6 +6682,7 @@ var BillingProvider = z34.enum([
6682
6682
  "openrouter",
6683
6683
  "kie",
6684
6684
  "apify",
6685
+ "firecrawl",
6685
6686
  "elevenlabs",
6686
6687
  "serpapi",
6687
6688
  "meli",
@@ -11092,7 +11093,13 @@ var AD_CREATIVE_MODELS = {
11092
11093
  };
11093
11094
  var KALODATA_USD_CENTS_PER_PROVIDER_CREDIT = 9;
11094
11095
  var KALODATA_PROVIDER_CREDITS_PER_SOURCE_CEILING = 7.5;
11096
+ var FIRECRAWL_REFERENCE_CREDIT_COST_CENTS = 0.38;
11095
11097
  var DEFAULT_PRICING = {
11098
+ // Reference estimate only: monthly Hobby $19/5,000 credits. Callers settle actual credits.
11099
+ "firecrawl:service-website-acquisition": {
11100
+ ourCostCents: FIRECRAWL_REFERENCE_CREDIT_COST_CENTS,
11101
+ userPriceCents: 0
11102
+ },
11096
11103
  // IMPORTANT: despite the field name, these values are in *USD cents* (not USD dollars).
11097
11104
  // We store cents (and sometimes fractional cents) everywhere so we can convert to credits:
11098
11105
  // credits = cents * CREDITS_PER_USD_CENT
@@ -23493,6 +23500,16 @@ var ServiceImageIntentSchema = z113.enum([
23493
23500
  "user_brief",
23494
23501
  "delegate_to_ai"
23495
23502
  ]);
23503
+ var ServiceImageReferenceRoleSchema = z113.enum([
23504
+ "upload",
23505
+ "logo",
23506
+ "hero",
23507
+ "brand_reference"
23508
+ ]);
23509
+ var ServiceImageReferenceSchema = z113.object({
23510
+ key: z113.string().max(600),
23511
+ role: ServiceImageReferenceRoleSchema
23512
+ }).strict();
23496
23513
  var ServiceImageInputSchema = z113.object({
23497
23514
  instruction: z113.string().trim().max(4e3).default(""),
23498
23515
  intent: ServiceImageIntentSchema.default("user_brief")
@@ -23502,6 +23519,48 @@ var ServiceImageInputSchema = z113.object({
23502
23519
  "instruction"
23503
23520
  ]
23504
23521
  });
23522
+ var ServiceImageBrandVisualSchema = z113.object({
23523
+ designDirection: z113.string().max(60).optional(),
23524
+ photographyStyle: z113.string().max(60).optional(),
23525
+ buttonStyle: z113.string().max(40).optional(),
23526
+ radiusScale: z113.string().max(40).optional(),
23527
+ fonts: z113.object({
23528
+ display: z113.string().max(120).optional(),
23529
+ body: z113.string().max(120).optional()
23530
+ }).strict().optional(),
23531
+ categoryLayer: z113.string().max(60).optional(),
23532
+ visualAesthetics: z113.array(z113.string().max(80)).max(20).optional(),
23533
+ toneAdjectives: z113.array(z113.string().max(80)).max(20).optional(),
23534
+ coreValues: z113.array(z113.string().max(120)).max(20).optional(),
23535
+ paletteRoles: z113.object({
23536
+ primary: z113.string().max(20).optional(),
23537
+ secondary: z113.string().max(20).optional(),
23538
+ tertiary: z113.string().max(20).optional(),
23539
+ neutral: z113.string().max(20).optional(),
23540
+ accents: z113.array(z113.string().max(20)).max(8).optional()
23541
+ }).strict().optional(),
23542
+ positioning: z113.object({
23543
+ market: z113.string().max(200).optional(),
23544
+ innovation: z113.string().max(200).optional(),
23545
+ trust: z113.string().max(200).optional(),
23546
+ design: z113.string().max(200).optional()
23547
+ }).strict().optional()
23548
+ }).strict();
23549
+ var ServiceImagePersonaSchema = z113.object({
23550
+ name: z113.string().max(200),
23551
+ demographics: z113.string().max(2e3).optional(),
23552
+ painPoints: z113.array(z113.string().max(2e3)).max(10).optional(),
23553
+ motivations: z113.string().max(2e3).optional(),
23554
+ objections: z113.string().max(2e3).optional(),
23555
+ gender: z113.string().max(60).optional()
23556
+ }).strict();
23557
+ var ServiceImageBusinessSchema = z113.object({
23558
+ painPoints: z113.string().max(2e3).optional(),
23559
+ benefits: z113.string().max(2e3).optional(),
23560
+ whatsappNumber: z113.string().max(40).optional(),
23561
+ whatsappMessage: z113.string().max(500).optional(),
23562
+ facts: ServicePageFactsSchema.optional()
23563
+ }).strict();
23505
23564
  var ServiceImageContextSchema = z113.object({
23506
23565
  kind: z113.literal("service_image"),
23507
23566
  version: z113.literal(1),
@@ -23511,7 +23570,11 @@ var ServiceImageContextSchema = z113.object({
23511
23570
  description: z113.string().max(2e4),
23512
23571
  brandCard: z113.string().max(2e4),
23513
23572
  palette: z113.array(z113.string()).max(20),
23514
- referenceKeys: z113.array(z113.string()).max(10)
23573
+ referenceKeys: z113.array(z113.string()).max(10),
23574
+ references: z113.array(ServiceImageReferenceSchema).max(10).optional(),
23575
+ brandVisual: ServiceImageBrandVisualSchema.optional(),
23576
+ persona: ServiceImagePersonaSchema.optional(),
23577
+ business: ServiceImageBusinessSchema.optional()
23515
23578
  }).strict();
23516
23579
 
23517
23580
  // ../../packages/types/src/brand-creation.ts
@@ -23618,12 +23681,15 @@ var WEBSITE_CAPTURE_TIMING = {
23618
23681
  clientWaitMs: captureQueueMs + captureLeaseMs,
23619
23682
  readyMs: 30 * 6e4,
23620
23683
  bridgeRequestMs: 3e4,
23621
- uploadMs: 9e4
23684
+ uploadMs: 9e4,
23685
+ fallbackRequestMs: 6e4,
23686
+ fallbackMinimumRemainingMs: 9e4
23622
23687
  };
23623
23688
  var WEBSITE_CAPTURE_MAX_RESEARCH_BYTES = 1024 * 1024;
23624
23689
  var WEBSITE_CAPTURE_MAX_FILES = 100;
23625
23690
  var WEBSITE_CAPTURE_MAX_FILE_BYTES = 8 * 1024 * 1024;
23626
23691
  var WEBSITE_CAPTURE_MAX_BUNDLE_BYTES = 30 * 1024 * 1024;
23692
+ var WEBSITE_CAPTURE_MAX_SOURCE_HTML_BYTES = 2 * 1024 * 1024;
23627
23693
  var WebsiteCaptureCauseSchema = z116.enum([
23628
23694
  "site_blocked",
23629
23695
  "site_unreachable",
@@ -23670,7 +23736,9 @@ var WebsiteCaptureJobSchema = WebsiteCaptureRequestSchema.extend({
23670
23736
  attempt: z116.number().int().positive(),
23671
23737
  leaseUntil: z116.string().datetime(),
23672
23738
  /** Public profile document prepared by the API; never contains a provider credential. */
23673
- socialProfileHtml: z116.string().max(2e5).optional()
23739
+ socialProfileHtml: z116.string().max(2e5).optional(),
23740
+ /** Present only after explicit capability negotiation; legacy agents retain the old wire. */
23741
+ websiteFallback: z116.literal("v1").optional()
23674
23742
  });
23675
23743
  var WebsiteCaptureClaimResponseSchema = z116.object({
23676
23744
  capture: WebsiteCaptureJobSchema.nullable()
@@ -23679,6 +23747,34 @@ var attempt = {
23679
23747
  attempt: z116.number().int().positive()
23680
23748
  };
23681
23749
  var digest2 = z116.string().regex(/^[a-f0-9]{64}$/);
23750
+ var WebsiteCaptureFallbackReasonSchema = z116.enum([
23751
+ "http_403",
23752
+ "http_408",
23753
+ "http_429",
23754
+ "http_5xx",
23755
+ "navigation_timeout",
23756
+ "render_timeout",
23757
+ "anti_bot"
23758
+ ]);
23759
+ var WebsiteCaptureFallbackRequestSchema = z116.object({
23760
+ ...attempt,
23761
+ leaseUntil: z116.string().datetime(),
23762
+ deadlineAt: z116.string().datetime(),
23763
+ reason: WebsiteCaptureFallbackReasonSchema,
23764
+ browserClosed: z116.literal(true)
23765
+ }).strict();
23766
+ var sourceArtifactUrl = z116.string().url().max(8192).refine((value) => {
23767
+ const url = new URL(value);
23768
+ return url.protocol === "https:" && !url.username && !url.password;
23769
+ });
23770
+ var WebsiteCaptureExternalSourceSchema = z116.object({
23771
+ kind: z116.literal("firecrawl"),
23772
+ finalUrl: z116.string().url().max(2048).refine((value) => normalizeWebsiteCaptureUrl(value) !== null),
23773
+ htmlUrl: sourceArtifactUrl,
23774
+ htmlSha256: digest2,
23775
+ screenshotUrl: sourceArtifactUrl,
23776
+ screenshotSha256: digest2
23777
+ }).strict();
23682
23778
  var WebsiteCaptureUploadRequestSchema = z116.object({
23683
23779
  ...attempt,
23684
23780
  contentLength: z116.number().int().positive().max(WEBSITE_CAPTURE_MAX_BUNDLE_BYTES),
@@ -26048,7 +26144,7 @@ var ApiClient = class {
26048
26144
  };
26049
26145
 
26050
26146
  // src/index.ts
26051
- var MCP_VERSION = "12.1.4";
26147
+ var MCP_VERSION = "12.1.6";
26052
26148
 
26053
26149
  // src/meta-upload-app.ts
26054
26150
  import { readFileSync } from "fs";
package/dist/stdio.js CHANGED
@@ -6704,6 +6704,7 @@ var BillingProvider = z34.enum([
6704
6704
  "openrouter",
6705
6705
  "kie",
6706
6706
  "apify",
6707
+ "firecrawl",
6707
6708
  "elevenlabs",
6708
6709
  "serpapi",
6709
6710
  "meli",
@@ -10867,7 +10868,13 @@ var AD_CREATIVE_MODELS = {
10867
10868
  };
10868
10869
  var KALODATA_USD_CENTS_PER_PROVIDER_CREDIT = 9;
10869
10870
  var KALODATA_PROVIDER_CREDITS_PER_SOURCE_CEILING = 7.5;
10871
+ var FIRECRAWL_REFERENCE_CREDIT_COST_CENTS = 0.38;
10870
10872
  var DEFAULT_PRICING = {
10873
+ // Reference estimate only: monthly Hobby $19/5,000 credits. Callers settle actual credits.
10874
+ "firecrawl:service-website-acquisition": {
10875
+ ourCostCents: FIRECRAWL_REFERENCE_CREDIT_COST_CENTS,
10876
+ userPriceCents: 0
10877
+ },
10871
10878
  // IMPORTANT: despite the field name, these values are in *USD cents* (not USD dollars).
10872
10879
  // We store cents (and sometimes fractional cents) everywhere so we can convert to credits:
10873
10880
  // credits = cents * CREDITS_PER_USD_CENT
@@ -23261,6 +23268,16 @@ var ServiceImageIntentSchema = z113.enum([
23261
23268
  "user_brief",
23262
23269
  "delegate_to_ai"
23263
23270
  ]);
23271
+ var ServiceImageReferenceRoleSchema = z113.enum([
23272
+ "upload",
23273
+ "logo",
23274
+ "hero",
23275
+ "brand_reference"
23276
+ ]);
23277
+ var ServiceImageReferenceSchema = z113.object({
23278
+ key: z113.string().max(600),
23279
+ role: ServiceImageReferenceRoleSchema
23280
+ }).strict();
23264
23281
  var ServiceImageInputSchema = z113.object({
23265
23282
  instruction: z113.string().trim().max(4e3).default(""),
23266
23283
  intent: ServiceImageIntentSchema.default("user_brief")
@@ -23270,6 +23287,48 @@ var ServiceImageInputSchema = z113.object({
23270
23287
  "instruction"
23271
23288
  ]
23272
23289
  });
23290
+ var ServiceImageBrandVisualSchema = z113.object({
23291
+ designDirection: z113.string().max(60).optional(),
23292
+ photographyStyle: z113.string().max(60).optional(),
23293
+ buttonStyle: z113.string().max(40).optional(),
23294
+ radiusScale: z113.string().max(40).optional(),
23295
+ fonts: z113.object({
23296
+ display: z113.string().max(120).optional(),
23297
+ body: z113.string().max(120).optional()
23298
+ }).strict().optional(),
23299
+ categoryLayer: z113.string().max(60).optional(),
23300
+ visualAesthetics: z113.array(z113.string().max(80)).max(20).optional(),
23301
+ toneAdjectives: z113.array(z113.string().max(80)).max(20).optional(),
23302
+ coreValues: z113.array(z113.string().max(120)).max(20).optional(),
23303
+ paletteRoles: z113.object({
23304
+ primary: z113.string().max(20).optional(),
23305
+ secondary: z113.string().max(20).optional(),
23306
+ tertiary: z113.string().max(20).optional(),
23307
+ neutral: z113.string().max(20).optional(),
23308
+ accents: z113.array(z113.string().max(20)).max(8).optional()
23309
+ }).strict().optional(),
23310
+ positioning: z113.object({
23311
+ market: z113.string().max(200).optional(),
23312
+ innovation: z113.string().max(200).optional(),
23313
+ trust: z113.string().max(200).optional(),
23314
+ design: z113.string().max(200).optional()
23315
+ }).strict().optional()
23316
+ }).strict();
23317
+ var ServiceImagePersonaSchema = z113.object({
23318
+ name: z113.string().max(200),
23319
+ demographics: z113.string().max(2e3).optional(),
23320
+ painPoints: z113.array(z113.string().max(2e3)).max(10).optional(),
23321
+ motivations: z113.string().max(2e3).optional(),
23322
+ objections: z113.string().max(2e3).optional(),
23323
+ gender: z113.string().max(60).optional()
23324
+ }).strict();
23325
+ var ServiceImageBusinessSchema = z113.object({
23326
+ painPoints: z113.string().max(2e3).optional(),
23327
+ benefits: z113.string().max(2e3).optional(),
23328
+ whatsappNumber: z113.string().max(40).optional(),
23329
+ whatsappMessage: z113.string().max(500).optional(),
23330
+ facts: ServicePageFactsSchema.optional()
23331
+ }).strict();
23273
23332
  var ServiceImageContextSchema = z113.object({
23274
23333
  kind: z113.literal("service_image"),
23275
23334
  version: z113.literal(1),
@@ -23279,7 +23338,11 @@ var ServiceImageContextSchema = z113.object({
23279
23338
  description: z113.string().max(2e4),
23280
23339
  brandCard: z113.string().max(2e4),
23281
23340
  palette: z113.array(z113.string()).max(20),
23282
- referenceKeys: z113.array(z113.string()).max(10)
23341
+ referenceKeys: z113.array(z113.string()).max(10),
23342
+ references: z113.array(ServiceImageReferenceSchema).max(10).optional(),
23343
+ brandVisual: ServiceImageBrandVisualSchema.optional(),
23344
+ persona: ServiceImagePersonaSchema.optional(),
23345
+ business: ServiceImageBusinessSchema.optional()
23283
23346
  }).strict();
23284
23347
 
23285
23348
  // ../../packages/types/src/brand-creation.ts
@@ -23386,12 +23449,15 @@ var WEBSITE_CAPTURE_TIMING = {
23386
23449
  clientWaitMs: captureQueueMs + captureLeaseMs,
23387
23450
  readyMs: 30 * 6e4,
23388
23451
  bridgeRequestMs: 3e4,
23389
- uploadMs: 9e4
23452
+ uploadMs: 9e4,
23453
+ fallbackRequestMs: 6e4,
23454
+ fallbackMinimumRemainingMs: 9e4
23390
23455
  };
23391
23456
  var WEBSITE_CAPTURE_MAX_RESEARCH_BYTES = 1024 * 1024;
23392
23457
  var WEBSITE_CAPTURE_MAX_FILES = 100;
23393
23458
  var WEBSITE_CAPTURE_MAX_FILE_BYTES = 8 * 1024 * 1024;
23394
23459
  var WEBSITE_CAPTURE_MAX_BUNDLE_BYTES = 30 * 1024 * 1024;
23460
+ var WEBSITE_CAPTURE_MAX_SOURCE_HTML_BYTES = 2 * 1024 * 1024;
23395
23461
  var WebsiteCaptureCauseSchema = z116.enum([
23396
23462
  "site_blocked",
23397
23463
  "site_unreachable",
@@ -23438,7 +23504,9 @@ var WebsiteCaptureJobSchema = WebsiteCaptureRequestSchema.extend({
23438
23504
  attempt: z116.number().int().positive(),
23439
23505
  leaseUntil: z116.string().datetime(),
23440
23506
  /** Public profile document prepared by the API; never contains a provider credential. */
23441
- socialProfileHtml: z116.string().max(2e5).optional()
23507
+ socialProfileHtml: z116.string().max(2e5).optional(),
23508
+ /** Present only after explicit capability negotiation; legacy agents retain the old wire. */
23509
+ websiteFallback: z116.literal("v1").optional()
23442
23510
  });
23443
23511
  var WebsiteCaptureClaimResponseSchema = z116.object({
23444
23512
  capture: WebsiteCaptureJobSchema.nullable()
@@ -23447,6 +23515,34 @@ var attempt = {
23447
23515
  attempt: z116.number().int().positive()
23448
23516
  };
23449
23517
  var digest2 = z116.string().regex(/^[a-f0-9]{64}$/);
23518
+ var WebsiteCaptureFallbackReasonSchema = z116.enum([
23519
+ "http_403",
23520
+ "http_408",
23521
+ "http_429",
23522
+ "http_5xx",
23523
+ "navigation_timeout",
23524
+ "render_timeout",
23525
+ "anti_bot"
23526
+ ]);
23527
+ var WebsiteCaptureFallbackRequestSchema = z116.object({
23528
+ ...attempt,
23529
+ leaseUntil: z116.string().datetime(),
23530
+ deadlineAt: z116.string().datetime(),
23531
+ reason: WebsiteCaptureFallbackReasonSchema,
23532
+ browserClosed: z116.literal(true)
23533
+ }).strict();
23534
+ var sourceArtifactUrl = z116.string().url().max(8192).refine((value) => {
23535
+ const url = new URL(value);
23536
+ return url.protocol === "https:" && !url.username && !url.password;
23537
+ });
23538
+ var WebsiteCaptureExternalSourceSchema = z116.object({
23539
+ kind: z116.literal("firecrawl"),
23540
+ finalUrl: z116.string().url().max(2048).refine((value) => normalizeWebsiteCaptureUrl(value) !== null),
23541
+ htmlUrl: sourceArtifactUrl,
23542
+ htmlSha256: digest2,
23543
+ screenshotUrl: sourceArtifactUrl,
23544
+ screenshotSha256: digest2
23545
+ }).strict();
23450
23546
  var WebsiteCaptureUploadRequestSchema = z116.object({
23451
23547
  ...attempt,
23452
23548
  contentLength: z116.number().int().positive().max(WEBSITE_CAPTURE_MAX_BUNDLE_BYTES),
@@ -24375,7 +24471,7 @@ var ApiClient = class {
24375
24471
  };
24376
24472
 
24377
24473
  // src/index.ts
24378
- var MCP_VERSION = "12.1.4";
24474
+ var MCP_VERSION = "12.1.6";
24379
24475
 
24380
24476
  // src/meta-upload-app.ts
24381
24477
  import { readFileSync } from "fs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productmaker/mcp",
3
- "version": "12.1.4",
3
+ "version": "12.1.6",
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.",