@sellable/mcp 0.1.193 → 0.1.194

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
@@ -388,7 +388,7 @@ Sellable writing workflows.
388
388
  - `get_rows_minimal` - Get minimal lead list (fast)
389
389
  - `get_rows` - Get full lead data
390
390
  - `update_cell` - Save message/approve
391
- - `get_message_prompt` - Get REPLY framework
391
+ - `get_subskill_prompt({ subskillName: "generate-messages" })` - Get the full message-generation prompt with references and quality gates
392
392
  - `start_campaign` / `pause_campaign` - Control sending
393
393
 
394
394
  ### Lead Tools (Free)
@@ -435,7 +435,7 @@ Sellable writing workflows.
435
435
 
436
436
  ### "Sellable not configured" Error
437
437
 
438
- Create `~/.sellable/config.json` with your token. Get one at https://app.sellable.dev/settings/integrations.
438
+ Create `~/.sellable/config.json` with your token. Get one at https://app.sellable.dev/settings?tab=integrations.
439
439
 
440
440
  ### Token Not Working
441
441
 
package/dist/auth.js CHANGED
@@ -72,7 +72,7 @@ export function getConfig() {
72
72
  "}\n\n" +
73
73
  "Config path resolution order:\n" +
74
74
  `${renderConfigPathOrder(configPathCandidates)}\n\n` +
75
- "Get your token at: https://app.sellable.dev/settings/integrations\n" +
75
+ "Get your token at: https://app.sellable.dev/settings?tab=integrations\n" +
76
76
  "Then run list_workspaces + set_active_workspace to select a workspace.");
77
77
  }
78
78
  try {
package/dist/server.js CHANGED
@@ -22,7 +22,7 @@ import { fetchCompany, fetchCompanyPosts, fetchLinkedInPosts, fetchLinkedInProfi
22
22
  import { getCampaignNavigationState } from "./tools/navigation.js";
23
23
  import { addOnDemandLeads, createOnDemandCampaign, createOnDemandTable, initOnDemandSequence, pauseOnDemandCampaign, startOnDemandCampaign, } from "./tools/one-off.js";
24
24
  import { upsertRubric } from "./tools/processing.js";
25
- import { completeSenderResearch, getMessagePrompt, getPostFindLeadsScoutRegistry, getSourceScoutRegistry, getSubskillAsset, getSubskillPrompt, listSubskillPrompts, searchSubskillPrompts, } from "./tools/prompts.js";
25
+ import { completeSenderResearch, getPostFindLeadsScoutRegistry, getSourceScoutRegistry, getSubskillAsset, getSubskillPrompt, listSubskillPrompts, searchSubskillPrompts, } from "./tools/prompts.js";
26
26
  import { waitForCampaignTableReady, waitForLeadListReady, } from "./tools/readiness.js";
27
27
  import { allTools } from "./tools/registry.js";
28
28
  import { getRows, getTableRows, getTableRowsMinimal } from "./tools/rows.js";
@@ -392,9 +392,6 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
392
392
  case "queue_cells":
393
393
  result = await queueCells(args?.tableId, args?.cellIds);
394
394
  break;
395
- case "get_message_prompt":
396
- result = await getMessagePrompt();
397
- break;
398
395
  case "get_subskill_prompt":
399
396
  result = getSubskillPrompt(args?.subskillName, args?.offset, args?.limit);
400
397
  break;
@@ -1,15 +1,3 @@
1
- /**
2
- * Response from the edit-message prompt endpoint.
3
- * The prompt contains all 11 quality gates inline.
4
- */
5
- export interface PromptResponse {
6
- prompt: string;
7
- metadata: {
8
- framework: string;
9
- author: string;
10
- description: string;
11
- };
12
- }
13
1
  export interface SubskillPromptResponse {
14
2
  name: string;
15
3
  description: string;
@@ -148,29 +136,6 @@ export interface PostFindLeadsScoutRegistryResponse {
148
136
  export declare const DEFAULT_SUBSKILL_PROMPT_CHUNK_CHARS = 48000;
149
137
  export declare const MAX_SUBSKILL_PROMPT_CHUNK_CHARS = 48000;
150
138
  export declare const promptToolDefinitions: ({
151
- name: string;
152
- description: string;
153
- inputSchema: {
154
- type: string;
155
- properties: {
156
- limit?: undefined;
157
- includePublic?: undefined;
158
- includeInternal?: undefined;
159
- subskillName?: undefined;
160
- offset?: undefined;
161
- assetPath?: undefined;
162
- query?: undefined;
163
- depth?: undefined;
164
- proofItemsFound?: undefined;
165
- caseStudyItemsFound?: undefined;
166
- credibilitySignalsFound?: undefined;
167
- notes?: undefined;
168
- };
169
- required: never[];
170
- additionalProperties?: undefined;
171
- };
172
- _meta?: undefined;
173
- } | {
174
139
  name: string;
175
140
  description: string;
176
141
  inputSchema: {
@@ -373,7 +338,6 @@ export declare const promptToolDefinitions: ({
373
338
  })[];
374
339
  export declare function getSourceScoutRegistry(): SourceScoutRegistryResponse;
375
340
  export declare function getPostFindLeadsScoutRegistry(): PostFindLeadsScoutRegistryResponse;
376
- export declare function getMessagePrompt(): Promise<PromptResponse>;
377
341
  export declare function listSubskillPrompts(limit?: number, includePublic?: boolean, includeInternal?: boolean): ListSubskillPromptsResponse;
378
342
  export declare function getSubskillPrompt(subskillName: string, offset?: number, limit?: number): SubskillPromptResponse;
379
343
  export declare function getSubskillAsset(subskillName: string, assetPath: string, offset?: number, limit?: number): SubskillAssetResponse;
@@ -1,6 +1,5 @@
1
1
  import * as fs from "fs";
2
2
  import * as path from "path";
3
- import { getApi } from "../api.js";
4
3
  import { getSkillByName, listSkills, resolveSkillsDir, stripFrontmatter, } from "../skills.js";
5
4
  import { markCreateCampaignPromptLoaded, markResearchPromptLoaded, markSenderResearchCompleted, } from "./flow-preflight.js";
6
5
  // Chunk size sits below Claude Code's max-token cap on tool results
@@ -15,15 +14,6 @@ import { markCreateCampaignPromptLoaded, markResearchPromptLoaded, markSenderRes
15
14
  export const DEFAULT_SUBSKILL_PROMPT_CHUNK_CHARS = 48_000;
16
15
  export const MAX_SUBSKILL_PROMPT_CHUNK_CHARS = 48_000;
17
16
  export const promptToolDefinitions = [
18
- {
19
- name: "get_message_prompt",
20
- description: "Get the REPLY framework prompt for crafting LinkedIn messages. Returns the full prompt with 11 quality gates inline. Load this when actively crafting to ensure quality standards.",
21
- inputSchema: {
22
- type: "object",
23
- properties: {},
24
- required: [],
25
- },
26
- },
27
17
  {
28
18
  name: "list_subskill_prompts",
29
19
  description: "List available Sellable subskill prompts with visibility controls. Use this when the host does not expose prompts/list.",
@@ -346,10 +336,6 @@ export function getPostFindLeadsScoutRegistry() {
346
336
  },
347
337
  };
348
338
  }
349
- export async function getMessagePrompt() {
350
- const api = getApi();
351
- return api.get("/api/v3/prompts/edit-message");
352
- }
353
339
  function filterSubskills(includePublic = false, includeInternal = true) {
354
340
  return listSkills().filter((skill) => {
355
341
  if (skill.visibility === "public")
@@ -214,29 +214,6 @@ export declare const allTools: ({
214
214
  required: string[];
215
215
  additionalProperties: boolean;
216
216
  };
217
- } | {
218
- name: string;
219
- description: string;
220
- inputSchema: {
221
- type: string;
222
- properties: {
223
- limit?: undefined;
224
- includePublic?: undefined;
225
- includeInternal?: undefined;
226
- subskillName?: undefined;
227
- offset?: undefined;
228
- assetPath?: undefined;
229
- query?: undefined;
230
- depth?: undefined;
231
- proofItemsFound?: undefined;
232
- caseStudyItemsFound?: undefined;
233
- credibilitySignalsFound?: undefined;
234
- notes?: undefined;
235
- };
236
- required: never[];
237
- additionalProperties?: undefined;
238
- };
239
- _meta?: undefined;
240
217
  } | {
241
218
  name: string;
242
219
  description: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.193",
3
+ "version": "0.1.194",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -80,7 +80,7 @@ into the campaign).
80
80
  synthesizer re-runs the Phase 84 finalizer pass on its rewrite.
81
81
  This is the last guardrail against critic-introduced token drift.
82
82
  Default stays `true`.
83
- - **`critique.opus.enabled`** — Flag gating Opus / craft-message
83
+ - **`critique.opus.enabled`** — Flag gating Opus refinement
84
84
  usage. Opus is reserved for the highest-value subset only. Stays
85
85
  off by default; flip on only when the targeting critic flags a
86
86
  high-priority row and budget allows.
@@ -158,7 +158,7 @@ logs and adjust:
158
158
  critique protocol: bounded sample, parallel critics, synthesis,
159
159
  budget caps, and token-contract enforcement.
160
160
  - `references/thomas-variant-selection.md` — Plan 85-03 rules for
161
- which rows earn an Opus / craft-message rewrite.
161
+ which rows earn an Opus refinement rewrite.
162
162
  - `references/thomas-revision-filters.md` — the positive-target and
163
163
  automatic-revision filters that gate any critique rewrite.
164
164
 
@@ -87,7 +87,7 @@ messaging:
87
87
  # guardrail against critic-introduced token drift.
88
88
  enforceFinalizerPass: true
89
89
  opus:
90
- # Opus / craft-message is reserved for the highest-value subset
90
+ # Opus refinement is reserved for the highest-value subset
91
91
  # only. Count is a hard cap per critique pass. Selection lives
92
92
  # in references/thomas-variant-selection.md.
93
93
  enabled: false
@@ -1,7 +1,7 @@
1
1
  # Thomas Variant Selection
2
2
 
3
3
  This reference governs which rows in a Plan 85-03 critique sample earn
4
- an Opus / craft-message rewrite. Load this file only when
4
+ an Opus refinement rewrite. Load this file only when
5
5
  `messaging.critique.enabled === true` AND
6
6
  `messaging.critique.opus.enabled === true` in
7
7
  `core/auto-execute.yaml`. When Opus is off, the protocol never
@@ -416,7 +416,7 @@ strings, which is why Step 16 requires Step 15 to be complete.
416
416
  the flag but never flips it; critique stays off until the flag is
417
417
  deliberately enabled.
418
418
  3. If `messaging.critique.opus.enabled` is also true, route the
419
- highest-value subset through the Opus / craft-message path per
419
+ highest-value subset through the Opus refinement path per
420
420
  `references/thomas-variant-selection.md`. Opus is capped by
421
421
  `messaging.critique.opus.maxMessagesPerPass` and
422
422
  `messaging.critique.opus.budgetUsdCap`; tripping either cap keeps
@@ -17,7 +17,6 @@ You craft messages in one of two modes:
17
17
  - `mcp__sellable__update_campaign_brief` (live campaign mode only)
18
18
  - `mcp__sellable__get_rows` (live campaign mode only)
19
19
  - `mcp__sellable__update_cell` (live campaign mode only)
20
- - `mcp__sellable__get_message_prompt`
21
20
  - `WebSearch` (live campaign mode only)
22
21
  - `mcp__sellable__fetch_linkedin_profile` (live campaign mode only)
23
22
  - `mcp__sellable__fetch_linkedin_posts` (live campaign mode only)
@@ -2425,8 +2424,8 @@ borrow the closest message shape from
2425
2424
  ### Single Row
2426
2425
 
2427
2426
  1. Load campaign examples, calibration notes, and bounded copy from the brief first.
2428
- 2. Load the REPLY framework prompt with `get_message_prompt` only as a fallback
2429
- structure and QA backstop when the brief lacks a concrete pattern.
2427
+ 2. Use the quality gates and fallback REPLY framework embedded in this
2428
+ `generate-messages` prompt. Do not call a separate message-prompt tool.
2430
2429
  3. Fetch lead details via `get_rows`.
2431
2430
  4. Draft a message, show it with a full 12-gate check.
2432
2431
  5. If the message cell is empty, auto-save the draft with `update_cell` and say "Draft saved (not approved)."
@@ -2444,7 +2443,8 @@ Code and Codex; host subagents are optional acceleration only when the user
2444
2443
  explicitly asked for agent fan-out.**
2445
2444
 
2446
2445
  1. Load campaign examples, calibration notes, and bounded copy from the brief first.
2447
- 2. Call `get_message_prompt()` once to get the fallback REPLY framework and QA checks
2446
+ 2. Use the quality gates and fallback REPLY framework embedded in this
2447
+ `generate-messages` prompt.
2448
2448
  3. If the user explicitly asked for agent fan-out and the host exposes subagents,
2449
2449
  spawn parallel workers with explicit model/config. Otherwise batch independent
2450
2450
  MCP/tool reads where available or run rows sequentially with honest progress
@@ -2533,7 +2533,7 @@ research → condense → 10 angle agents in parallel → finalizer combines bes
2533
2533
  {event-led, signal-led, job-post-led, and proof-led specialist fallback rules from gold-standard-message-patterns.md}
2534
2534
 
2535
2535
  ## Fallback REPLY Framework
2536
- {full prompt from get_message_prompt()}
2536
+ {quality gates and fallback REPLY rules embedded in this generate-messages prompt}
2537
2537
 
2538
2538
  ## Instructions
2539
2539
  1. Research the prospect (WebSearch, LinkedIn tools if needed)
@@ -6,7 +6,7 @@ visibility: internal
6
6
 
7
7
  # Research Protocol (Fast + Parallel)
8
8
 
9
- This is the shared research flow for **all** skills (craft-message, campaign-messages, enrich-prospects, create-campaign).
9
+ This is the shared research flow for **all** active MCP workflows (generate-messages, enrich-prospects, create-campaign).
10
10
  The orchestrator remains the main model (e.g., Opus). Use host-aware parallel execution:
11
11
 
12
12
  - Claude host: `Task` subagents on Sonnet-4.5