@sellable/mcp 0.1.33 → 0.1.35

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
@@ -481,22 +481,19 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
481
481
  }
482
482
  });
483
483
  // List available prompts (skills)
484
+ //
485
+ // Public slash commands take NO arguments. The `offset/limit` chunked-read
486
+ // pattern was leaking into this surface from the internal
487
+ // `get_subskill_prompt` tool — Claude Code's UI treats any declared
488
+ // arguments as gating input and prevents the user from invoking the slash
489
+ // command. Returning an empty arguments list keeps the slash command
490
+ // directly invokable. Internal chunked reads stay on the
491
+ // `get_subskill_prompt` MCP tool, where they belong.
484
492
  server.setRequestHandler(ListPromptsRequestSchema, async () => ({
485
493
  prompts: listSkills("public").map((skill) => ({
486
494
  name: skill.name,
487
495
  description: skill.description,
488
- arguments: [
489
- {
490
- name: "offset",
491
- description: "Optional character offset for chunked prompt reads.",
492
- required: false,
493
- },
494
- {
495
- name: "limit",
496
- description: "Optional max characters to return for chunked prompt reads.",
497
- required: false,
498
- },
499
- ],
496
+ arguments: [],
500
497
  })),
501
498
  }));
502
499
  // Get prompt content
@@ -116,17 +116,30 @@ export async function getAuthStatus() {
116
116
  // thing instead of dumping the technical fallback guidance.
117
117
  const ftuxAgentInstruction = "AGENT INSTRUCTION (verbatim, do not paraphrase, do not show the user `error.guidance`): " +
118
118
  "The user has not signed in to Sellable yet. Run the magic-link CLI handoff. " +
119
- "1) Say to the user verbatim: `Welcome to Sellable. What's your email?` " +
119
+ "1) Say to the user verbatim:\\n" +
120
+ "`Welcome to Sellable! I'll help you launch a LinkedIn outbound campaign right here, all via chat — leads, messages, the whole thing.\\n\\n" +
121
+ "First, let's connect your Sellable account:\\n\\n" +
122
+ " 1. Drop your email below\\n" +
123
+ " 2. I'll send a magic login link to your inbox\\n" +
124
+ " 3. Click it, come back here, and we'll keep going\\n\\n" +
125
+ "What email should I use?` " +
120
126
  "2) Wait for the user to type their email in normal chat (do NOT use AskUserQuestion / request_user_input). " +
121
127
  "3) Call `mcp__sellable__start_cli_login({ email })` with that email. " +
122
- "4) On `ok: true`, say verbatim (substituting the email exactly as typed): " +
123
- "`Magic link sent to {email}. Click it from your inbox — I'll wait. " +
124
- "(If your team already has a Sellable workspace, ask an admin to invite you instead — that gets you straight into their data.)` " +
128
+ "4) On `ok: true`, say verbatim (substituting the email exactly as typed):\\n" +
129
+ "`Magic link sent to {email}.\\n\\n" +
130
+ "─────────────────────────────────────────────\\n" +
131
+ " Your turn — check your inbox\\n" +
132
+ "─────────────────────────────────────────────\\n\\n" +
133
+ " 1. Open the email from Sellable\\n" +
134
+ " 2. Click the magic link\\n" +
135
+ " 3. Come back here when you're done\\n\\n" +
136
+ "I'll be waiting right here.\\n\\n" +
137
+ " (If your team already uses Sellable, ask an admin to invite you into their shared workspace instead — that gets you straight in.)` " +
125
138
  "5) Call `mcp__sellable__wait_for_cli_login({ sessionId })` using the sessionId returned by start_cli_login. " +
126
139
  "6) If the result is `error.type === 'tool_timeout_guard'`, IMMEDIATELY re-call wait_for_cli_login with the SAME sessionId — do not narrate, do not call start_cli_login again. Loop until you get a different result. " +
127
140
  "7) On `ok: true`, the user is signed in and `~/.sellable/config.json` has been written. Branch on `isReturningUser`: " +
128
- "if true, say `You're in — using your {activeWorkspaceName} workspace.\\n\\nNow — paste the LinkedIn profile URL of the person you want to send from.`; " +
129
- "if false, say `Welcome to Sellablecreated {activeWorkspaceName} for you.\\n\\nNow — paste the LinkedIn profile URL of the person you want to send from.`";
141
+ "if true, say `You're in — {activeWorkspaceName} workspace, ready to roll.\\n\\nNow — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you (the founder), or whoever's voice the messages should sound like.\\n\\ne.g. https://www.linkedin.com/in/your-handle`; " +
142
+ "if false, say `You're set upyour {activeWorkspaceName} workspace is ready.\\n\\nNow — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you (the founder), or whoever's voice the messages should sound like.\\n\\ne.g. https://www.linkedin.com/in/your-handle`";
130
143
  if (error instanceof SellableApiError && error.isAuthError) {
131
144
  return {
132
145
  ...base,
@@ -131,7 +131,7 @@ export async function handleStartCliLogin(args) {
131
131
  sessionId: body.sessionId,
132
132
  confirmUrl: body.confirmUrl,
133
133
  expiresInSec: body.expiresInSec,
134
- humanMessage: `Magic link sent to ${args.email}. Click it from your inbox I'll wait. (If your team already has a Sellable workspace, ask an admin to invite you instead — that gets you straight into their data.)`,
134
+ humanMessage: `Magic link sent to ${args.email}.\n\n─────────────────────────────────────────────\n Your turn check your inbox\n─────────────────────────────────────────────\n\n 1. Open the email from Sellable\n 2. Click the magic link\n 3. Come back here when you're done\n\nI'll be waiting right here.\n\n (If your team already uses Sellable, ask an admin to invite you into their shared workspace instead — that gets you straight in.)`,
135
135
  };
136
136
  }
137
137
  export async function handleWaitForCliLogin(args) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.33",
3
+ "version": "0.1.35",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -331,7 +331,15 @@ updates.
331
331
  a. Say to the user verbatim:
332
332
 
333
333
  ```text
334
- Welcome to Sellable. What's your email?
334
+ Welcome to Sellable! I'll help you launch a LinkedIn outbound campaign right here, all via chat — leads, messages, the whole thing.
335
+
336
+ First, let's connect your Sellable account:
337
+
338
+ 1. Drop your email below
339
+ 2. I'll send a magic login link to your inbox
340
+ 3. Click it, come back here, and we'll keep going
341
+
342
+ What email should I use?
335
343
  ```
336
344
 
337
345
  b. Wait for the user to paste their email in normal chat. Do NOT use
@@ -347,7 +355,19 @@ updates.
347
355
  as the user typed it):
348
356
 
349
357
  ```text
350
- Magic link sent to {email}. Click it from your inbox — I'll wait. (If your team already has a Sellable workspace, ask an admin to invite you instead — that gets you straight into their data.)
358
+ Magic link sent to {email}.
359
+
360
+ ─────────────────────────────────────────────
361
+ Your turn — check your inbox
362
+ ─────────────────────────────────────────────
363
+
364
+ 1. Open the email from Sellable
365
+ 2. Click the magic link
366
+ 3. Come back here when you're done
367
+
368
+ I'll be waiting right here.
369
+
370
+ (If your team already uses Sellable, ask an admin to invite you into their shared workspace instead — that gets you straight in.)
351
371
  ```
352
372
 
353
373
  f. Call `mcp__sellable__wait_for_cli_login({ sessionId })` using the
@@ -378,18 +398,22 @@ updates.
378
398
  (substituting `activeWorkspaceName` exactly):
379
399
 
380
400
  ```text
381
- You're in — using your {activeWorkspaceName} workspace.
401
+ You're in — {activeWorkspaceName} workspace, ready to roll.
382
402
 
383
- Now — paste the LinkedIn profile URL of the person you want to send from.
403
+ Now — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you (the founder), or whoever's voice the messages should sound like.
404
+
405
+ e.g. https://www.linkedin.com/in/your-handle
384
406
  ```
385
407
 
386
408
  - If `isReturningUser === false`, prepend ONE line confirming the new
387
409
  workspace, then the locked Step 3 narration verbatim:
388
410
 
389
411
  ```text
390
- Welcome to Sellablecreated {activeWorkspaceName} for you.
412
+ You're set upyour {activeWorkspaceName} workspace is ready.
413
+
414
+ Now — paste the LinkedIn profile URL of the person you'll be sending campaigns from. Usually that's you (the founder), or whoever's voice the messages should sound like.
391
415
 
392
- Now — paste the LinkedIn profile URL of the person you want to send from.
416
+ e.g. https://www.linkedin.com/in/your-handle
393
417
  ```
394
418
 
395
419
  No other lines. No "all set", no "signed in", no other acknowledgement.