@sellable/mcp
v0.1.334
Published
Sellable MCP server for Claude Code and Codex campaign workflows
Downloads
14,148
Readme
Sellable Claude Code Plugin
Craft personalized LinkedIn messages using the REPLY framework directly in Claude Code.
What It Does
- Load your Sellable campaigns
- Create campaigns headlessly with a realtime watch link
- Research prospects (web search and LinkedIn API)
- Apply the REPLY framework with 11 quality gates
- Save and approve messages for sending
Each message gets 5+ minutes of Claude attention with deep research - no other tool does this.
Installation
Prompt Source Of Truth
There are five public Sellable entrypoints shared across hosts:
sellable:create-campaignsellable:create-ab-testsellable:foundationsellable:contentsellable:create-post
The create-campaign public wrapper at
mcp/sellable/skills/create-campaign/SKILL.md handles auth/bootstrap and loads
the approval-gated workflow from:
mcp/sellable/skills/create-campaign-v2/SKILL.md
The create-ab-test public wrapper prepares clean A/B split lead lists and review-copy campaigns from:
mcp/sellable/skills/create-ab-test/SKILL.md
The foundation public wrapper loads the core identity/company memory workflow from:
mcp/sellable/skills/foundation/SKILL.md
The tested internal/backward-compatible memory engine remains:
mcp/sellable/skills/interview/SKILL.md
The content public wrapper captures transcripts and rough notes, clusters recurring ideas, extracts story/proof/question cards, and develops post seeds before drafting from:
mcp/sellable/skills/content/SKILL.md
The create-post public wrapper captures raw ideas, loads voice internally,
researches hooks plus market beliefs, develops a premise with story/tension and
reader value, validates proof/AI tells, and saves content artifacts under
~/.sellable/content/linkedin/** from:
mcp/sellable/skills/create-post/SKILL.md
Keep create-campaign-v2 and load-voice internal. Do not advertise either as
a public command. load-voice remains a direct MCP utility for generic writing
surfaces that are not posts or campaigns.
1. One-Command Agent Install
For Claude Code and Codex CLI:
curl -fsSL "https://app.sellable.dev/api/v2/cli/install" | shAgent-readable install instructions are available at:
https://app.sellable.dev/agent-install.txtThe reviewable curl installer is:
curl -fsSL "https://app.sellable.dev/api/v2/cli/install" | shWindows users can use the native PowerShell installer:
iwr "https://app.sellable.dev/api/v2/cli/install.ps1" | iexPhase 112 v1 uses package stdio MCP through @sellable/mcp. Hosted HTTP
MCP is a future/advanced mode until the hosted endpoint exists.
Package-mode installs launch @sellable/mcp@latest, so each fresh host MCP
start resolves the newest stable npm release. The MCP server also runs a cached
startup/auth update check and tells the agent to run
curl -fsSL "https://app.sellable.dev/api/v2/cli/install" | sh when the
installed runtime is behind npm.
For CI/scripted installs, set SELLABLE_TOKEN and SELLABLE_WORKSPACE_ID
before running the curl installer. The public path remains:
curl -fsSL "https://app.sellable.dev/api/v2/cli/install" | shPublishing @sellable/mcp
Publish from the repo root with:
npm run validate:sellable-skills
npm run mcp:publishThe script loads .env and prod.env, builds mcp/sellable, verifies npm auth,
and publishes with a temporary npm config file. Prefer NPM_TOKEN=<npm token> in
prod.env; NODE_AUTH_TOKEN, SELLABLE_NPM_TOKEN, and NPM_PUBLISH_TOKEN are
also supported.
2. Generate API Token
- Go to https://app.sellable.dev/settings
- Click "Generate Token"
- Copy the token (starts with
skt_live_)
3. Claude Setup Fallback
The public installer should handle Claude setup. Use this manual path only for troubleshooting when Node/npm/npx are already known-good and the installer route is unavailable.
Install MCP server manually:
claude mcp add --transport stdio sellable -- npm exec --yes --package @sellable/mcp@latest -- sellable-mcpCreate auth config at ~/.sellable/config.json:
{
"token": "skt_live_your_token_here",
"activeWorkspaceId": "your_workspace_id"
}The token is provided when you generate it. Use list_workspaces +
set_active_workspace to choose a workspace if you don't know the ID yet.
4. Codex Setup
For customer/package installs, use the public installer:
curl -fsSL "https://app.sellable.dev/api/v2/cli/install" | shIf you already have ~/.sellable/config.json, rerun/verify without rewriting
auth:
curl -fsSL "https://app.sellable.dev/api/v2/cli/install" | sh
sellable --verify-only --host codex --jsonThe installer does the full local setup:
- writes
~/.sellable/config.json - registers the
sellableMCP server with Codex - installs the
sellable@sellableDesktop plugin so Codex Desktop loads themcp__sellable__*tools into skill sessions
After the installer passes, fully quit and reopen Codex Desktop. Start a new
thread and select Sellable Create Campaign, Sellable Create A/B Test,
Sellable Foundation, Sellable Content, or Sellable Create Post; or invoke
$sellable:create-campaign, $sellable:create-ab-test,
$sellable:foundation, $sellable:content, or $sellable:create-post. If the app still says
mcp__sellable__* tools are missing after the installer passes, check that
~/.codex/config.toml contains both [marketplaces.sellable] and
[plugins."sellable@sellable"].
The skill being visible only proves skill discovery; the plugin is what mounts
the Sellable MCP tools for Codex Desktop.
Public Names And Host Commands
Use these names consistently:
- Claude Code command:
/sellable:create-campaign - Claude Code command:
/sellable:create-ab-test - Claude Code command:
/sellable:foundation - Claude Code command:
/sellable:content - Claude Code command:
/sellable:create-post - Codex command:
$sellable:create-campaign - Codex command:
$sellable:create-ab-test - Codex command:
$sellable:foundation - Codex command:
$sellable:content - Codex command:
$sellable:create-post - Codex Desktop plugin:
sellable@sellable - Codex visible skill:
Sellable Create Campaign - Codex visible skill:
Sellable Create A/B Test - Codex visible skill:
Sellable Foundation - Codex visible skill:
Sellable Content - Codex visible skill:
Sellable Create Post - Codex skill frontmatter name:
create-campaign - Codex skill frontmatter name:
create-ab-test - Codex skill frontmatter name:
foundation - Codex skill frontmatter name:
content - Codex skill frontmatter name:
create-post - MCP server name:
sellable - Internal workflow prompt:
create-campaign-v2 - Internal/backward-compatible memory prompt:
interview
Never tell users to run /sellable:create-campaign-v2,
$sellable:create-campaign-v2, $sellable:load-voice, or
$sellable:sellable:create-campaign. create-campaign-v2 is an internal MCP
subskill loaded by get_subskill_prompt({ subskillName: "create-campaign-v2" }).
load-voice is an internal direct MCP utility. content is the preferred
entrypoint for adding transcripts, recurring ideas, and post seeds.
foundation is the preferred entrypoint for durable founder/company memory.
create-post remains a supported direct drafting shortcut and loads voice
silently for post drafting.
Structured Question Parity
Claude Code should ask intake and approval gates with AskUserQuestion.
Codex should ask them with request_user_input when it is exposed in an
interactive session. The installer enables Default mode support by writing
default_mode_request_user_input = true under [features] in
~/.codex/config.toml. codex exec is non-interactive and cannot show the
structured questionnaire UI, so it is only useful for smoke checks that stop
before human intake/approval.
Create-Campaign Soul
The create-campaign workflow ships with a command-specific SOUL.md identity:
the Sellable campaign GTM engineer. It tells Claude/Codex to translate internal
workflow state into founder-friendly campaign language, use "quick question
panel" for structured questions, and keep implementation details out of normal
customer-facing updates.
Use quick question panel in customer-facing setup blockers.
The Codex installer also writes compatibility cache aliases for recent plugin versions so stale Desktop skill links resolve to the current wrapper instead of showing file/version debugging to the user.
Usage
From Sellable UI
- Open any campaign
- Go to the Launch tab
- Click "Open in Claude Code"
- Copy the command shown
From Claude Code
Use the create-campaign skill:
/sellable:create-campaignThen describe intent naturally, for example:
- "Let's make a campaign with sellable"
- "Create a campaign for acme.com"
- "Launch a LinkedIn campaign for this company"
For local UAT-style runs against a company/domain:
npm run campaign:v2:local -- teaatshiloh.comFrom Codex
Use the Codex skill entrypoint:
$sellable:create-campaignInstalled skill package path:
~/.codex/plugins/cache/sellable/sellable/<version>/skills/sellable-create-campaign/SKILL.md
Host Parity Runbook (Codex + Claude)
Use the same MCP runtime preflight in both hosts:
get_auth_status()get_campaign_framework({ flowVersion: "v2", includePlugins: true })- Optional resume branch with
get_campaign_context({ campaignId, refresh: true }) - Subskill discovery and load via:
list_subskill_prompts(catalog)search_subskill_prompts(lookup)get_subskill_prompt({ subskillName: "create-campaign-v2" })(load)
- Net-new sender research completion gate before create:
get_subskill_prompt({ subskillName: "research-sender" })- run sender research
complete_sender_research(...)
Canonical shortcut:
bootstrap_create_campaign({ flowVersion: "v2", campaignId?, host?, model?, reasoningEffort?, modelMetadataSource? })
Pass model/reasoning metadata only when it comes from active turn/runtime
metadata or explicit user confirmation. For Codex, use
nodeRepl.requestMeta["x-codex-turn-metadata"] and pass
modelMetadataSource: "codex_turn_metadata". Config files such as
~/.codex/config.toml are fallback/cross-check evidence only and must not
trigger model-switch warnings.
For Claude Code, pass model metadata only when the current host exposes active
runtime model and effort for the same session, or when the user explicitly
confirms current /status or /model output that includes both model and effort.
If the current Claude session context explicitly states both values, use
modelMetadataSource: "claude_session_context". Use
modelMetadataSource: "user_confirmed" for explicit user confirmation. Do not
use a nested claude -p run, ~/.claude/settings.json, or CLI defaults as
active-session evidence.
Claude session-context self-report shape:
- Model (name): ...
- Model (ID): ...
- Reasoning effort: ...
- Source: active Claude Code session contextIf bootstrap returns blocking errors, fail fast and do not continue into provider search/import tools.
Provider preflight contract:
- Call
get_provider_prompt({ provider, campaignOfferId? })before any provider action. - Provider actions (
search_apollo,search_sales_nav,search_prospeo,search_signals,import_leads) are runtime-gated until prompt preload is done.
Parallel execution contract:
- Source work stays inline in the parent thread with active provider MCP tools.
get_source_scout_registryintentionally returns no custom source-scout agents in the normal package; do not add source scouts back without an explicit source-comparison/debug requirement. get_post_find_leads_scout_registryreturns only the Message Drafting worker for normal create-campaign runs. Afterconfirm_lead_listimports a non-empty review batch and rows are proven, ask the filter-choice question immediately. Do not load this registry or deep filter/message prompts before that question. Once the user answers, launch Message Drafting from the same campaign/table basis. This launch is required whether filters are chosen or skipped. If the user chooses filters, keep filter/rubric work in the parent thread: show Filter Rules, loadreferences/filter-leads.md, save rubrics, then ask for filter approval. After approval, move to Filter Leads and show waiting copy while Message Drafting finishes or the template is approved. If filters are skipped, start Message Drafting first, then move to Messages/message review;currentStep=messagesis not proof of worker kickoff. Enrichment/filtering and Generate Message cells wait for message approval.- Source scouts and Prospect Filters are not normal create-campaign background agents. Only Message Drafting may spawn as a background/custom agent on the normal path; if it cannot be launched and the user does not approve inline fallback, stop instead of silently drafting in the parent thread.
Config path resolution (in order):
SELLABLE_CONFIG_PATH~/.sellable/config.json$CODEX_HOME/sellable.json(compatibility fallback)~/.codex/sellable.json(compatibility fallback)~/.claude/sellable.json(compatibility fallback)
Hetzner Smoke / UAT
For hosted MCP verification, keep the product MCP host separate from the
sellable-admin host:
- product MCP:
sellable-web-mcp - admin MCP:
sellable-ops
The product MCP runtime reads auth from the normal sellable.json path
resolution above. SELLABLE_TOKEN by itself is not the authoritative runtime
contract for hosted smoke/UAT runs.
Recommended smoke/UAT flow on the VPS:
- use the shared helper in
scripts/lib/vps-common.sh - rebuild with
npm run mcp:build - run the direct stdio MCP client in
scripts/mcp/sellable-tool-call.mjs - use
scripts/run-sellable-mcp-smoke.shfor the baseline host proof before feature-specific UAT
For file-path features like CSV upload, create the fixture file on the VPS itself and pass the absolute host path to the tool.
Engage Memory (Learns Over Time)
The engage skill persists user-specific, workspace-scoped memory in a separate
JSON file so it can learn over time without editing repo or package files.
Default path: next to your sellable.json (same directory), named:
sellable.engage.json
Override path with:
SELLABLE_ENGAGE_MEMORY_PATH
This file stores the commenting style guide (markdown), proven search keywords with outcomes, and tracked people (LinkedIn profiles), all scoped by workspace.
Config You Can Edit (Source Of Truth)
- Auth + active workspace:
~/.sellable/config.json(orSELLABLE_CONFIG_PATH; old$CODEX_HOME/sellable.json,~/.codex/sellable.json, and~/.claude/sellable.jsonfiles remain compatibility fallbacks) - Engage memory (style guide + searches + tracked people):
sellable.engage.json(orSELLABLE_ENGAGE_MEMORY_PATH) - Team-editable durable configs (home-level source of truth):
~/.sellable/configs/writing/styleguide.md~/.sellable/configs/audience/icp-filters.md~/.sellable/configs/proof/claims.md~/.sellable/configs/discovery/influencers.md~/.sellable/configs/discovery/post-filters.md
Files under mcp/sellable/skills/**/core/* are package repo files, not the intended user config surface.
Skills
/sellable:create-campaign
Primary public entrypoint for the approval-gated campaign creation flow.
/sellable:foundation
Public founder/company memory command. Builds durable core files under
~/.sellable/configs/core/**, raw archives under ~/.sellable/interviews/**,
and reusable answer/proof/story/transcript/reference memory for downstream
Sellable writing workflows.
The internal prompt name interview remains available for backward
compatibility and as the tested foundation-memory engine.
Available Tools
Workspace Tools (Free)
list_workspaces- List accessible workspacesget_active_workspace- Show active workspace selectionset_active_workspace- Set active workspace by IDcreate_workspace- Create a new workspaceadd_teammate- Invite a teammate
Campaign Tools (Free)
get_campaigns- List all campaignsget_campaign- Get campaign detailscreate_campaign- Create a campaign offerupdate_campaign- Update campaign positioning/brief/workflowget_campaign_messages_preview- Preview campaign leads for messaging (supports filters + pagination)get_table_rows- Get leads listget_rows_minimal- Get minimal lead list (fast)get_rows- Get full lead dataupdate_cell- Save message/approveget_subskill_prompt({ subskillName: "generate-messages" })- Get the full message-generation prompt with references and quality gatesstart_campaign/pause_campaign- Control sending
Lead Tools (Free)
search_apollo- Apollo people searchsearch_prospeo- Prospeo people searchsearch_sales_nav- Sales Navigator searchsearch_signals- Signal discovery searchload_csv_domains- Preview/confirm a CSV-on-disk company-domain file and return adomainFilterIdload_csv_linkedin_leads- Preview/confirm a CSV-on-disk LinkedIn profile file and create a lead listimport_leads- Create a lead list and start importing leadsconfirm_lead_list- Import confirmed lead list into campaign table
Inbox Reply Tools (Approval-Gated)
These tools use the existing product /api/v3/inbox routes, the same backend
surface as the Sellable UI.
search_inbox_threads- Search inbox threads throughGET /api/v3/inboxget_inbox_thread- Load one inbox thread throughGET /api/v3/inbox/[threadId]check_inbox_reply_eligibility- Load product reply eligibility for one threadupdate_inbox_draft- Edit an existing draft throughPATCH /api/v3/inbox/[threadId]/draftsend_inbox_draft- Send the approved current draft after exact body, version, thread snapshot, idempotency key, and explicit operator approval checkssend_inbox_manual_reply- Send one exact approved manual reply after message hash, thread snapshot, idempotency key, and explicit operator approval checks
No production send smoke may run without explicit operator approval for the workspace, sender, thread or recipient, exact body, tool, route, and expected side effect. Draft editing only edits an existing draft; new reply draft generation is not part of these inbox tools.
Processing Tools (Free)
draft_rubrics- Draft rubric criteria (stored in MCP state)select_necessary_rubrics- Keep/mark required rubric checkssave_rubrics- Persist rubrics and enable ICP filteringadd_rubric_item- Add a single rubric criterionupdate_rubric_item- Update a rubric criterion by IDdelete_rubric_item- Delete a rubric criterion by checkNamecheck_rubric- Queue enrichment + scoring samplewait_for_rubric_results- Poll pass-rate resultsupsert_rubric- Save rubric to campaign (legacy)
Readiness Tools (Free)
wait_for_lead_list_ready- Wait for lead list import to complete (and rows)wait_for_campaign_table_ready- Wait for campaign table rows to appear
LinkedIn Tools (Cost Credits)
fetch_linkedin_posts- Recent LinkedIn postsfetch_linkedin_profile- Full profile datafetch_company- Company profile data
Credits
- Campaign tools are free (you pay Claude tokens)
- LinkedIn tools cost Sellable credits
- WebSearch is free (your Claude subscription)
Troubleshooting
"Sellable not configured" Error
Create ~/.sellable/config.json with your token. Get one at https://app.sellable.dev/settings?tab=integrations.
Token Not Working
- Make sure token starts with
skt_ - Check token is not revoked
- Verify activeWorkspaceId matches your workspace (or run list_workspaces + set_active_workspace)
Support
- Issues: https://github.com/csreyes/sellable/issues
- Docs: https://docs.sellable.dev
- Email: [email protected]
