@sellable/mcp 0.1.262 → 0.1.264

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/dist/server.js CHANGED
@@ -9,7 +9,7 @@ import { getCampaignTableSchema, queueCampaignCells, reviseMessageTemplateAndRer
9
9
  import { createCampaign, duplicateCampaign, getCampaign, getCampaignMessagesPreview, getCampaigns, pauseCampaign, startCampaign, updateCampaign, updateCampaignBrief, } from "./tools/campaigns.js";
10
10
  import { queueCells, updateCell } from "./tools/cells.js";
11
11
  import { handleStartCliLogin, handleWaitForCliLogin, } from "./tools/cli-login.js";
12
- import { capturePostIdeaTool, getPostDraftTool, getPostIdeaTool, getPublishedPostTool, listPostDraftIterationsTool, listPostDraftsTool, listPostIdeasTool, listPublishedPostsTool, markPostPublishedTool, saveHookResearchTool, savePostDraftTool, updatePostDraftTool, updatePublishedPostMetricsTool, } from "./tools/content-posts.js";
12
+ import { calculateLinkedInHookPreviewTool, capturePostIdeaTool, getPostDraftTool, getPostIdeaTool, getPublishedPostTool, listPostDraftIterationsTool, listPostDraftsTool, listPostIdeasTool, listPublishedPostsTool, markPostPublishedTool, renderLinkedInPostPreviewTool, saveHookResearchTool, savePostDraftTool, updatePostDraftTool, updatePublishedPostMetricsTool, } from "./tools/content-posts.js";
13
13
  import { getCampaignContext, hydrateCampaignContextFromCampaign, markCampaignContextDirty, } from "./tools/context.js";
14
14
  import { addToCommentCampaign, addToConnectionCampaign, addToInmailCampaign, getEngagedPosts, getOrCreateDirectCampaignTable, pauseDirectCampaign, startDirectCampaign, } from "./tools/direct-campaigns.js";
15
15
  import { bootstrapEngage, bootstrapEngageMulti, } from "./tools/engage-bootstrap.js";
@@ -244,6 +244,12 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
244
244
  case "save_post_draft":
245
245
  result = savePostDraftTool(args);
246
246
  break;
247
+ case "calculate_linkedin_hook_preview":
248
+ result = calculateLinkedInHookPreviewTool(args);
249
+ break;
250
+ case "render_linkedin_post_preview":
251
+ result = renderLinkedInPostPreviewTool(args);
252
+ break;
247
253
  case "update_post_draft":
248
254
  result = updatePostDraftTool(args);
249
255
  break;
@@ -1,4 +1,4 @@
1
- type ContentKind = "idea" | "hook_research" | "draft" | "published_post";
1
+ type ContentKind = "idea" | "hook_research" | "draft" | "published_post" | "linkedin_preview";
2
2
  type ArtifactMetadata = {
3
3
  id: string;
4
4
  type: ContentKind;
@@ -94,6 +94,19 @@ export declare const contentPostToolDefinitions: ({
94
94
  body?: undefined;
95
95
  validationReceipt?: undefined;
96
96
  status?: undefined;
97
+ postText?: undefined;
98
+ sourceLabel?: undefined;
99
+ measurementMode?: undefined;
100
+ requireBrowserMeasurement?: undefined;
101
+ clampLines?: undefined;
102
+ mobileClampLines?: undefined;
103
+ desktopClampLines?: undefined;
104
+ mobileTextWidthPx?: undefined;
105
+ desktopTextWidthPx?: undefined;
106
+ renderId?: undefined;
107
+ renderScreenshots?: undefined;
108
+ requireScreenshots?: undefined;
109
+ reviewClampLines?: undefined;
97
110
  updatedAt?: undefined;
98
111
  publishUrl?: undefined;
99
112
  activityId?: undefined;
@@ -193,6 +206,19 @@ export declare const contentPostToolDefinitions: ({
193
206
  body?: undefined;
194
207
  validationReceipt?: undefined;
195
208
  status?: undefined;
209
+ postText?: undefined;
210
+ sourceLabel?: undefined;
211
+ measurementMode?: undefined;
212
+ requireBrowserMeasurement?: undefined;
213
+ clampLines?: undefined;
214
+ mobileClampLines?: undefined;
215
+ desktopClampLines?: undefined;
216
+ mobileTextWidthPx?: undefined;
217
+ desktopTextWidthPx?: undefined;
218
+ renderId?: undefined;
219
+ renderScreenshots?: undefined;
220
+ requireScreenshots?: undefined;
221
+ reviewClampLines?: undefined;
196
222
  updatedAt?: undefined;
197
223
  publishUrl?: undefined;
198
224
  activityId?: undefined;
@@ -215,6 +241,7 @@ export declare const contentPostToolDefinitions: ({
215
241
  properties: {
216
242
  draftId: {
217
243
  type: string;
244
+ description?: undefined;
218
245
  };
219
246
  ideaId: {
220
247
  type: string;
@@ -259,6 +286,19 @@ export declare const contentPostToolDefinitions: ({
259
286
  selectedPatterns?: undefined;
260
287
  previewBudget?: undefined;
261
288
  notes?: undefined;
289
+ postText?: undefined;
290
+ sourceLabel?: undefined;
291
+ measurementMode?: undefined;
292
+ requireBrowserMeasurement?: undefined;
293
+ clampLines?: undefined;
294
+ mobileClampLines?: undefined;
295
+ desktopClampLines?: undefined;
296
+ mobileTextWidthPx?: undefined;
297
+ desktopTextWidthPx?: undefined;
298
+ renderId?: undefined;
299
+ renderScreenshots?: undefined;
300
+ requireScreenshots?: undefined;
301
+ reviewClampLines?: undefined;
262
302
  updatedAt?: undefined;
263
303
  publishUrl?: undefined;
264
304
  activityId?: undefined;
@@ -279,8 +319,171 @@ export declare const contentPostToolDefinitions: ({
279
319
  inputSchema: {
280
320
  type: string;
281
321
  properties: {
322
+ postText: {
323
+ type: string;
324
+ description: string;
325
+ };
326
+ draftId: {
327
+ type: string;
328
+ description: string;
329
+ };
330
+ sourceLabel: {
331
+ type: string;
332
+ };
333
+ measurementMode: {
334
+ type: string;
335
+ enum: string[];
336
+ description: string;
337
+ };
338
+ requireBrowserMeasurement: {
339
+ type: string;
340
+ description: string;
341
+ };
342
+ clampLines: {
343
+ type: string;
344
+ description: string;
345
+ };
346
+ mobileClampLines: {
347
+ type: string;
348
+ description: string;
349
+ };
350
+ desktopClampLines: {
351
+ type: string;
352
+ description: string;
353
+ };
354
+ mobileTextWidthPx: {
355
+ type: string;
356
+ description: string;
357
+ };
358
+ desktopTextWidthPx: {
359
+ type: string;
360
+ description: string;
361
+ };
362
+ rawSource?: undefined;
363
+ title?: undefined;
364
+ distilledBrief?: undefined;
365
+ ideaId?: undefined;
366
+ sourceType?: undefined;
367
+ sourceUrl?: undefined;
368
+ capturedAt?: undefined;
369
+ researchId?: undefined;
370
+ topic?: undefined;
371
+ keywords?: undefined;
372
+ sourcePosts?: undefined;
373
+ selectedPatterns?: undefined;
374
+ previewBudget?: undefined;
375
+ notes?: undefined;
376
+ createdAt?: undefined;
377
+ hookResearchId?: undefined;
378
+ priorDraftId?: undefined;
379
+ iteration?: undefined;
380
+ body?: undefined;
381
+ validationReceipt?: undefined;
382
+ status?: undefined;
383
+ renderId?: undefined;
384
+ renderScreenshots?: undefined;
385
+ requireScreenshots?: undefined;
386
+ reviewClampLines?: undefined;
387
+ updatedAt?: undefined;
388
+ publishUrl?: undefined;
389
+ activityId?: undefined;
390
+ publishedAt?: undefined;
391
+ finalText?: undefined;
392
+ updateDraftStatus?: undefined;
393
+ publishedPostId?: undefined;
394
+ year?: undefined;
395
+ metrics?: undefined;
396
+ note?: undefined;
397
+ };
398
+ required: never[];
399
+ additionalProperties: boolean;
400
+ };
401
+ } | {
402
+ name: string;
403
+ description: string;
404
+ inputSchema: {
405
+ type: string;
406
+ properties: {
407
+ postText: {
408
+ type: string;
409
+ description: string;
410
+ };
282
411
  draftId: {
283
412
  type: string;
413
+ description: string;
414
+ };
415
+ renderId: {
416
+ type: string;
417
+ description: string;
418
+ };
419
+ sourceLabel: {
420
+ type: string;
421
+ };
422
+ createdAt: {
423
+ type: string;
424
+ };
425
+ renderScreenshots: {
426
+ type: string;
427
+ description: string;
428
+ };
429
+ requireScreenshots: {
430
+ type: string;
431
+ description: string;
432
+ };
433
+ reviewClampLines: {
434
+ type: string;
435
+ description: string;
436
+ };
437
+ rawSource?: undefined;
438
+ title?: undefined;
439
+ distilledBrief?: undefined;
440
+ ideaId?: undefined;
441
+ sourceType?: undefined;
442
+ sourceUrl?: undefined;
443
+ capturedAt?: undefined;
444
+ researchId?: undefined;
445
+ topic?: undefined;
446
+ keywords?: undefined;
447
+ sourcePosts?: undefined;
448
+ selectedPatterns?: undefined;
449
+ previewBudget?: undefined;
450
+ notes?: undefined;
451
+ hookResearchId?: undefined;
452
+ priorDraftId?: undefined;
453
+ iteration?: undefined;
454
+ body?: undefined;
455
+ validationReceipt?: undefined;
456
+ status?: undefined;
457
+ measurementMode?: undefined;
458
+ requireBrowserMeasurement?: undefined;
459
+ clampLines?: undefined;
460
+ mobileClampLines?: undefined;
461
+ desktopClampLines?: undefined;
462
+ mobileTextWidthPx?: undefined;
463
+ desktopTextWidthPx?: undefined;
464
+ updatedAt?: undefined;
465
+ publishUrl?: undefined;
466
+ activityId?: undefined;
467
+ publishedAt?: undefined;
468
+ finalText?: undefined;
469
+ updateDraftStatus?: undefined;
470
+ publishedPostId?: undefined;
471
+ year?: undefined;
472
+ metrics?: undefined;
473
+ note?: undefined;
474
+ };
475
+ required: never[];
476
+ additionalProperties: boolean;
477
+ };
478
+ } | {
479
+ name: string;
480
+ description: string;
481
+ inputSchema: {
482
+ type: string;
483
+ properties: {
484
+ draftId: {
485
+ type: string;
486
+ description?: undefined;
284
487
  };
285
488
  hookResearchId: {
286
489
  type: string;
@@ -323,6 +526,19 @@ export declare const contentPostToolDefinitions: ({
323
526
  previewBudget?: undefined;
324
527
  notes?: undefined;
325
528
  createdAt?: undefined;
529
+ postText?: undefined;
530
+ sourceLabel?: undefined;
531
+ measurementMode?: undefined;
532
+ requireBrowserMeasurement?: undefined;
533
+ clampLines?: undefined;
534
+ mobileClampLines?: undefined;
535
+ desktopClampLines?: undefined;
536
+ mobileTextWidthPx?: undefined;
537
+ desktopTextWidthPx?: undefined;
538
+ renderId?: undefined;
539
+ renderScreenshots?: undefined;
540
+ requireScreenshots?: undefined;
541
+ reviewClampLines?: undefined;
326
542
  publishUrl?: undefined;
327
543
  activityId?: undefined;
328
544
  publishedAt?: undefined;
@@ -344,6 +560,7 @@ export declare const contentPostToolDefinitions: ({
344
560
  properties: {
345
561
  draftId: {
346
562
  type: string;
563
+ description?: undefined;
347
564
  };
348
565
  publishUrl: {
349
566
  type: string;
@@ -384,6 +601,19 @@ export declare const contentPostToolDefinitions: ({
384
601
  body?: undefined;
385
602
  validationReceipt?: undefined;
386
603
  status?: undefined;
604
+ postText?: undefined;
605
+ sourceLabel?: undefined;
606
+ measurementMode?: undefined;
607
+ requireBrowserMeasurement?: undefined;
608
+ clampLines?: undefined;
609
+ mobileClampLines?: undefined;
610
+ desktopClampLines?: undefined;
611
+ mobileTextWidthPx?: undefined;
612
+ desktopTextWidthPx?: undefined;
613
+ renderId?: undefined;
614
+ renderScreenshots?: undefined;
615
+ requireScreenshots?: undefined;
616
+ reviewClampLines?: undefined;
387
617
  updatedAt?: undefined;
388
618
  publishedPostId?: undefined;
389
619
  year?: undefined;
@@ -436,6 +666,19 @@ export declare const contentPostToolDefinitions: ({
436
666
  body?: undefined;
437
667
  validationReceipt?: undefined;
438
668
  status?: undefined;
669
+ postText?: undefined;
670
+ sourceLabel?: undefined;
671
+ measurementMode?: undefined;
672
+ requireBrowserMeasurement?: undefined;
673
+ clampLines?: undefined;
674
+ mobileClampLines?: undefined;
675
+ desktopClampLines?: undefined;
676
+ mobileTextWidthPx?: undefined;
677
+ desktopTextWidthPx?: undefined;
678
+ renderId?: undefined;
679
+ renderScreenshots?: undefined;
680
+ requireScreenshots?: undefined;
681
+ reviewClampLines?: undefined;
439
682
  updatedAt?: undefined;
440
683
  publishUrl?: undefined;
441
684
  activityId?: undefined;
@@ -455,6 +698,7 @@ export declare function ensureContentLayout(root?: string): {
455
698
  hookResearch: "linkedin/research/hooks";
456
699
  drafts: "linkedin/drafts";
457
700
  published: "linkedin/published";
701
+ previews: "linkedin/previews";
458
702
  commentLibrary: "linkedin/comments/library";
459
703
  };
460
704
  };
@@ -529,6 +773,182 @@ export declare function savePostDraftTool(input: {
529
773
  updatedAt: string;
530
774
  preview: string;
531
775
  };
776
+ type LinkedInHookPreviewSurface = {
777
+ label: "mobile" | "desktop";
778
+ textWidthPx: number;
779
+ fontSizePx: number;
780
+ lineHeightPx: number;
781
+ clampLines: number;
782
+ charGuardrail: number;
783
+ renderedLines: string[];
784
+ visibleLines: string[];
785
+ visibleTextBlock: string;
786
+ visibleTextBlockCharCount: number;
787
+ withinCharGuardrail: boolean;
788
+ lineCountBeforeClamp: number;
789
+ blankLinesBeforeClamp: number;
790
+ truncated: boolean;
791
+ seeMoreWouldShow: boolean;
792
+ hiddenTextStartsWith?: string;
793
+ measurementBasis: "local_chrome_browser_layout" | "estimated_width_model";
794
+ measurementWarning?: string;
795
+ chromePath?: string;
796
+ };
797
+ export declare function calculateLinkedInHookPreviewTool(input: {
798
+ postText?: string;
799
+ draftId?: string;
800
+ sourceLabel?: string;
801
+ measurementMode?: "browser" | "estimated";
802
+ requireBrowserMeasurement?: boolean;
803
+ clampLines?: number;
804
+ mobileClampLines?: number;
805
+ desktopClampLines?: number;
806
+ mobileTextWidthPx?: number;
807
+ desktopTextWidthPx?: number;
808
+ }): {
809
+ basis: string;
810
+ ruleConfidence: string;
811
+ cssContractVersion: string;
812
+ sourceLabel: string | undefined;
813
+ draftId: string | undefined;
814
+ ruleSummary: string;
815
+ rules: {
816
+ visibleUnit: string;
817
+ defaultClampLines: number;
818
+ fontSizePx: number;
819
+ lineHeightPx: number;
820
+ whiteSpace: string;
821
+ overflowWrap: string;
822
+ desktopCharGuardrail: number;
823
+ mobileCharGuardrail: number;
824
+ characterCountsAreGuardrailsOnly: boolean;
825
+ notOfficialLinkedInApi: boolean;
826
+ strongestEvidence: string;
827
+ };
828
+ mobile: LinkedInHookPreviewSurface;
829
+ desktop: LinkedInHookPreviewSurface;
830
+ diagnostics: {
831
+ charCount: number;
832
+ charCountIncludingNewlines: number;
833
+ firstLineChars: number;
834
+ firstTwoPhysicalLinesChars: number;
835
+ physicalLineCount: number;
836
+ contentLineCount: number;
837
+ longestNonblankLineChars: number;
838
+ blankLineCount: number;
839
+ };
840
+ };
841
+ export declare function renderLinkedInPostPreviewTool(input: {
842
+ postText?: string;
843
+ draftId?: string;
844
+ renderId?: string;
845
+ sourceLabel?: string;
846
+ createdAt?: string;
847
+ renderScreenshots?: boolean;
848
+ requireScreenshots?: boolean;
849
+ reviewClampLines?: number;
850
+ }): {
851
+ id: string;
852
+ path: string;
853
+ artifactDir: string;
854
+ absoluteArtifactDir: string;
855
+ combinedHtmlPath: string;
856
+ absoluteCombinedHtmlPath: string;
857
+ mobile: {
858
+ absoluteHtmlPath: string;
859
+ absoluteScreenshotPath: string | undefined;
860
+ textWidthPx: number;
861
+ viewportWidthPx: number;
862
+ fontSizePx: number;
863
+ lineHeightPx: number;
864
+ reviewClampLines: number;
865
+ estimatedVisibleTextBlock: string;
866
+ estimatedRenderedLines: string[];
867
+ estimatedLineCountBeforeClamp: number;
868
+ estimatedBlankLinesBeforeClamp: number;
869
+ htmlPath: string;
870
+ screenshotPath: string | undefined;
871
+ };
872
+ desktop: {
873
+ absoluteHtmlPath: string;
874
+ absoluteScreenshotPath: string | undefined;
875
+ textWidthPx: number;
876
+ viewportWidthPx: number;
877
+ fontSizePx: number;
878
+ lineHeightPx: number;
879
+ reviewClampLines: number;
880
+ estimatedVisibleTextBlock: string;
881
+ estimatedRenderedLines: string[];
882
+ estimatedLineCountBeforeClamp: number;
883
+ estimatedBlankLinesBeforeClamp: number;
884
+ htmlPath: string;
885
+ screenshotPath: string | undefined;
886
+ };
887
+ screenshotStatus: {
888
+ status: "rendered";
889
+ chromePath: string;
890
+ } | {
891
+ status: "skipped";
892
+ reason: string;
893
+ } | {
894
+ status: "failed";
895
+ reason: string;
896
+ chromePath?: string;
897
+ };
898
+ renderedPreview: {
899
+ basis: string;
900
+ cssContractVersion: string;
901
+ generatedAt: string;
902
+ sourceLabel: string;
903
+ mobile: {
904
+ textWidthPx: number;
905
+ viewportWidthPx: number;
906
+ fontSizePx: number;
907
+ lineHeightPx: number;
908
+ reviewClampLines: number;
909
+ estimatedVisibleTextBlock: string;
910
+ estimatedRenderedLines: string[];
911
+ estimatedLineCountBeforeClamp: number;
912
+ estimatedBlankLinesBeforeClamp: number;
913
+ htmlPath: string;
914
+ screenshotPath: string | undefined;
915
+ };
916
+ desktop: {
917
+ textWidthPx: number;
918
+ viewportWidthPx: number;
919
+ fontSizePx: number;
920
+ lineHeightPx: number;
921
+ reviewClampLines: number;
922
+ estimatedVisibleTextBlock: string;
923
+ estimatedRenderedLines: string[];
924
+ estimatedLineCountBeforeClamp: number;
925
+ estimatedBlankLinesBeforeClamp: number;
926
+ htmlPath: string;
927
+ screenshotPath: string | undefined;
928
+ };
929
+ diagnostics: {
930
+ charCount: number;
931
+ charCountIncludingNewlines: number;
932
+ firstLineChars: number;
933
+ firstTwoPhysicalLinesChars: number;
934
+ physicalLineCount: number;
935
+ contentLineCount: number;
936
+ longestNonblankLineChars: number;
937
+ blankLineCount: number;
938
+ };
939
+ screenshotStatus: {
940
+ status: "rendered";
941
+ chromePath: string;
942
+ } | {
943
+ status: "skipped";
944
+ reason: string;
945
+ } | {
946
+ status: "failed";
947
+ reason: string;
948
+ chromePath?: string;
949
+ };
950
+ };
951
+ };
532
952
  export declare function updatePostDraftTool(input: {
533
953
  draftId: string;
534
954
  hookResearchId?: string;