@sellable/mcp 0.1.743 → 0.1.745

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.
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Lightweight projection of the canonical MCP registry for control-plane
3
+ * manifests. Keep this free of tool implementation imports so Next can bundle
4
+ * it; registry parity is enforced in sellable-agent-tool-policy.test.ts.
5
+ */
6
+ export declare const SELLABLE_MCP_TOOL_NAMES: readonly ["add_column", "add_on_demand_leads", "add_rubric_item", "add_teammate", "add_to_comment_campaign", "add_to_connection_campaign", "add_to_inmail_campaign", "archive_campaign", "attach_recommended_sequence", "attach_sequence", "bootstrap_create_campaign", "bootstrap_engage", "bootstrap_engage_multi", "bootstrap_find_leads", "bulk_enrich_with_prospeo", "calculate_linkedin_hook_preview", "cancel_campaign_message_preparation", "cancel_find_leads", "cancel_lead_import", "capture_post_idea", "check_inbox_reply_eligibility", "check_rubric", "commit_blueprint", "complete_sender_research", "confirm_harvest_job_companies", "confirm_lead_list", "confirm_prospeo_company_accounts", "copy_sender_config", "create_campaign", "create_on_demand_campaign", "create_on_demand_table", "create_workflow_table", "create_workspace", "delete_column", "delete_rubric_item", "draft_rubrics", "duplicate_campaign", "enrich_with_prospeo", "export_table_csv", "export_workspace_csv", "fetch_company", "fetch_company_posts", "fetch_linkedin_posts", "fetch_linkedin_profile", "fetch_post_engagers", "fill_campaign_horizon", "get_active_workspace", "get_auth_status", "get_campaign", "get_campaign_context", "get_campaign_framework", "get_campaign_message_preparation_status", "get_campaign_messages_preview", "get_campaign_navigation_state", "get_campaign_refill_state", "get_campaign_table_schema", "get_campaign_waterfall", "get_campaigns", "get_column_schema", "get_company_info", "get_engage_memory", "get_engage_state", "get_engaged_posts", "get_find_leads_run", "get_inbox_thread", "get_linkedin_profile", "get_or_create_direct_campaign_table", "get_post_draft", "get_post_find_leads_scout_registry", "get_post_idea", "get_prospeo_credits", "get_provider_prompt", "get_published_post", "get_refill_plan_v2", "get_refill_target_plan", "get_rows", "get_rows_minimal", "get_runtime_identity", "get_scheduler_fill_capacity", "get_sender", "get_sender_routing", "get_source_scout_registry", "get_subskill_asset", "get_subskill_prompt", "get_table_rows", "get_user_posts", "get_workspace", "import_leads", "init_on_demand_sequence", "list_column_types", "list_dnc_entries", "list_post_draft_iterations", "list_post_drafts", "list_post_ideas", "list_published_posts", "list_senders", "list_subskill_prompts", "list_tables", "list_workspaces", "load_csv_dnc_entries", "load_csv_domains", "load_csv_linkedin_leads", "lookup_sales_nav_filter", "mark_post_published", "migrate_flat_configs", "pause_campaign", "pause_direct_campaign", "pause_on_demand_campaign", "preflight_find_leads_provider", "prepare_campaign_ab_test", "queue_campaign_cells", "queue_cells", "record_campaign_review_batch", "record_engage_proven_search", "refill_sends", "refill_sends_v2", "refresh_paid_inmail_credits", "refresh_sender_engagement", "reissue_find_leads_watch_link", "render_linkedin_post_preview", "reorder_columns", "resolve_campaign_fill_route", "revise_message_template_and_rerun", "run_scheduler_sweep", "save_domain_filters", "save_hook_research", "save_post_draft", "save_rubrics", "search_apollo", "search_engagement_posts", "search_harvest_jobs", "search_inbox_threads", "search_prospeo", "search_prospeo_companies", "search_sales_nav", "search_signals", "search_subskill_prompts", "select_campaign_cells", "select_necessary_rubrics", "select_promising_posts", "send_inbox_draft", "send_inbox_manual_reply", "set_active_workspace", "set_campaign_waterfall_order", "set_company_info", "set_engage_state", "set_engage_style_guide", "set_headline_icp_criteria", "set_sender_calendar_link", "set_sender_routing", "setup_evergreen_campaigns", "start_campaign", "start_campaign_message_preparation", "start_cli_login", "start_direct_campaign", "start_on_demand_campaign", "update_campaign", "update_campaign_brief", "update_cell", "update_column", "update_find_leads_run", "update_inbox_draft", "update_post_draft", "update_published_post_metrics", "update_rubric_item", "upsert_engage_tracked_person", "upsert_rubric", "validate_campaign1_kickoff_handoff", "verify_table_row", "wait_for_campaign_processing", "wait_for_campaign_table_ready", "wait_for_cli_login", "wait_for_find_leads_run", "wait_for_lead_list_ready", "wait_for_rubric_results"];
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Lightweight projection of the canonical MCP registry for control-plane
3
+ * manifests. Keep this free of tool implementation imports so Next can bundle
4
+ * it; registry parity is enforced in sellable-agent-tool-policy.test.ts.
5
+ */
6
+ export const SELLABLE_MCP_TOOL_NAMES = [
7
+ "add_column",
8
+ "add_on_demand_leads",
9
+ "add_rubric_item",
10
+ "add_teammate",
11
+ "add_to_comment_campaign",
12
+ "add_to_connection_campaign",
13
+ "add_to_inmail_campaign",
14
+ "archive_campaign",
15
+ "attach_recommended_sequence",
16
+ "attach_sequence",
17
+ "bootstrap_create_campaign",
18
+ "bootstrap_engage",
19
+ "bootstrap_engage_multi",
20
+ "bootstrap_find_leads",
21
+ "bulk_enrich_with_prospeo",
22
+ "calculate_linkedin_hook_preview",
23
+ "cancel_campaign_message_preparation",
24
+ "cancel_find_leads",
25
+ "cancel_lead_import",
26
+ "capture_post_idea",
27
+ "check_inbox_reply_eligibility",
28
+ "check_rubric",
29
+ "commit_blueprint",
30
+ "complete_sender_research",
31
+ "confirm_harvest_job_companies",
32
+ "confirm_lead_list",
33
+ "confirm_prospeo_company_accounts",
34
+ "copy_sender_config",
35
+ "create_campaign",
36
+ "create_on_demand_campaign",
37
+ "create_on_demand_table",
38
+ "create_workflow_table",
39
+ "create_workspace",
40
+ "delete_column",
41
+ "delete_rubric_item",
42
+ "draft_rubrics",
43
+ "duplicate_campaign",
44
+ "enrich_with_prospeo",
45
+ "export_table_csv",
46
+ "export_workspace_csv",
47
+ "fetch_company",
48
+ "fetch_company_posts",
49
+ "fetch_linkedin_posts",
50
+ "fetch_linkedin_profile",
51
+ "fetch_post_engagers",
52
+ "fill_campaign_horizon",
53
+ "get_active_workspace",
54
+ "get_auth_status",
55
+ "get_campaign",
56
+ "get_campaign_context",
57
+ "get_campaign_framework",
58
+ "get_campaign_message_preparation_status",
59
+ "get_campaign_messages_preview",
60
+ "get_campaign_navigation_state",
61
+ "get_campaign_refill_state",
62
+ "get_campaign_table_schema",
63
+ "get_campaign_waterfall",
64
+ "get_campaigns",
65
+ "get_column_schema",
66
+ "get_company_info",
67
+ "get_engage_memory",
68
+ "get_engage_state",
69
+ "get_engaged_posts",
70
+ "get_find_leads_run",
71
+ "get_inbox_thread",
72
+ "get_linkedin_profile",
73
+ "get_or_create_direct_campaign_table",
74
+ "get_post_draft",
75
+ "get_post_find_leads_scout_registry",
76
+ "get_post_idea",
77
+ "get_prospeo_credits",
78
+ "get_provider_prompt",
79
+ "get_published_post",
80
+ "get_refill_plan_v2",
81
+ "get_refill_target_plan",
82
+ "get_rows",
83
+ "get_rows_minimal",
84
+ "get_runtime_identity",
85
+ "get_scheduler_fill_capacity",
86
+ "get_sender",
87
+ "get_sender_routing",
88
+ "get_source_scout_registry",
89
+ "get_subskill_asset",
90
+ "get_subskill_prompt",
91
+ "get_table_rows",
92
+ "get_user_posts",
93
+ "get_workspace",
94
+ "import_leads",
95
+ "init_on_demand_sequence",
96
+ "list_column_types",
97
+ "list_dnc_entries",
98
+ "list_post_draft_iterations",
99
+ "list_post_drafts",
100
+ "list_post_ideas",
101
+ "list_published_posts",
102
+ "list_senders",
103
+ "list_subskill_prompts",
104
+ "list_tables",
105
+ "list_workspaces",
106
+ "load_csv_dnc_entries",
107
+ "load_csv_domains",
108
+ "load_csv_linkedin_leads",
109
+ "lookup_sales_nav_filter",
110
+ "mark_post_published",
111
+ "migrate_flat_configs",
112
+ "pause_campaign",
113
+ "pause_direct_campaign",
114
+ "pause_on_demand_campaign",
115
+ "preflight_find_leads_provider",
116
+ "prepare_campaign_ab_test",
117
+ "queue_campaign_cells",
118
+ "queue_cells",
119
+ "record_campaign_review_batch",
120
+ "record_engage_proven_search",
121
+ "refill_sends",
122
+ "refill_sends_v2",
123
+ "refresh_paid_inmail_credits",
124
+ "refresh_sender_engagement",
125
+ "reissue_find_leads_watch_link",
126
+ "render_linkedin_post_preview",
127
+ "reorder_columns",
128
+ "resolve_campaign_fill_route",
129
+ "revise_message_template_and_rerun",
130
+ "run_scheduler_sweep",
131
+ "save_domain_filters",
132
+ "save_hook_research",
133
+ "save_post_draft",
134
+ "save_rubrics",
135
+ "search_apollo",
136
+ "search_engagement_posts",
137
+ "search_harvest_jobs",
138
+ "search_inbox_threads",
139
+ "search_prospeo",
140
+ "search_prospeo_companies",
141
+ "search_sales_nav",
142
+ "search_signals",
143
+ "search_subskill_prompts",
144
+ "select_campaign_cells",
145
+ "select_necessary_rubrics",
146
+ "select_promising_posts",
147
+ "send_inbox_draft",
148
+ "send_inbox_manual_reply",
149
+ "set_active_workspace",
150
+ "set_campaign_waterfall_order",
151
+ "set_company_info",
152
+ "set_engage_state",
153
+ "set_engage_style_guide",
154
+ "set_headline_icp_criteria",
155
+ "set_sender_calendar_link",
156
+ "set_sender_routing",
157
+ "setup_evergreen_campaigns",
158
+ "start_campaign",
159
+ "start_campaign_message_preparation",
160
+ "start_cli_login",
161
+ "start_direct_campaign",
162
+ "start_on_demand_campaign",
163
+ "update_campaign",
164
+ "update_campaign_brief",
165
+ "update_cell",
166
+ "update_column",
167
+ "update_find_leads_run",
168
+ "update_inbox_draft",
169
+ "update_post_draft",
170
+ "update_published_post_metrics",
171
+ "update_rubric_item",
172
+ "upsert_engage_tracked_person",
173
+ "upsert_rubric",
174
+ "validate_campaign1_kickoff_handoff",
175
+ "verify_table_row",
176
+ "wait_for_campaign_processing",
177
+ "wait_for_campaign_table_ready",
178
+ "wait_for_cli_login",
179
+ "wait_for_find_leads_run",
180
+ "wait_for_lead_list_ready",
181
+ "wait_for_rubric_results",
182
+ ];
@@ -47,10 +47,28 @@ export function decideAgentTool(compiled, tool) {
47
47
  };
48
48
  }
49
49
  export function listToolsForAgent(compiled, definitions) {
50
- const allowed = new Set(compiled.entries
51
- .filter((entry) => entry.decision !== "DENY")
50
+ const denied = new Set(compiled.entries
51
+ .filter((entry) => entry.decision === "DENY")
52
52
  .map((entry) => entry.tool));
53
- return definitions.filter((definition) => allowed.has(definition.name));
53
+ return definitions.filter((definition) => !denied.has(definition.name));
54
+ }
55
+ function decideRegisteredAgentTool(compiled, definitions, tool) {
56
+ const explicit = decideAgentTool(compiled, tool);
57
+ if (explicit.version !== "unknown")
58
+ return explicit;
59
+ if (!definitions.some((definition) => definition.name === tool)) {
60
+ return explicit;
61
+ }
62
+ return {
63
+ tool,
64
+ version: "registry-v1",
65
+ decision: "AUTO",
66
+ method: "POST",
67
+ route: `mcp://sellable/${tool}`,
68
+ handler: tool,
69
+ workspaceBinding: "workspaceId",
70
+ allowed: true,
71
+ };
54
72
  }
55
73
  function canonicalize(value) {
56
74
  if (Array.isArray(value))
@@ -63,18 +81,16 @@ function canonicalize(value) {
63
81
  return value;
64
82
  }
65
83
  const SHA256_CONSTANTS = [
66
- 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b,
67
- 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01,
68
- 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7,
69
- 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
70
- 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152,
71
- 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
72
- 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc,
73
- 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
74
- 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,
75
- 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08,
76
- 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f,
77
- 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
84
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
85
+ 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
86
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
87
+ 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
88
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
89
+ 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
90
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
91
+ 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
92
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
93
+ 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
78
94
  0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
79
95
  ];
80
96
  function rotateRight(value, bits) {
@@ -91,8 +107,8 @@ export function portableSha256(value) {
91
107
  view.setUint32(paddedLength - 8, Math.floor(bitLength / 0x100000000));
92
108
  view.setUint32(paddedLength - 4, bitLength >>> 0);
93
109
  const hash = [
94
- 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f,
95
- 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
110
+ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c,
111
+ 0x1f83d9ab, 0x5be0cd19,
96
112
  ];
97
113
  const words = new Uint32Array(64);
98
114
  for (let offset = 0; offset < paddedLength; offset += 64) {
@@ -212,15 +228,28 @@ export function createAgentMcpAuthorizationHandlers(input) {
212
228
  async authorizeCall(call) {
213
229
  const principal = call.context.principal;
214
230
  if (!principal) {
215
- return { allowed: false, decision: "DENY", code: "agent_principal_required" };
231
+ return {
232
+ allowed: false,
233
+ decision: "DENY",
234
+ code: "agent_principal_required",
235
+ };
216
236
  }
217
237
  if (principal.policyHash !== policy.policyHash) {
218
- return { allowed: false, decision: "DENY", code: "policy_hash_mismatch" };
238
+ return {
239
+ allowed: false,
240
+ decision: "DENY",
241
+ code: "policy_hash_mismatch",
242
+ };
219
243
  }
220
- if (!Number.isSafeInteger(principal.generation) || principal.generation < 1) {
221
- return { allowed: false, decision: "DENY", code: "credential_generation_invalid" };
244
+ if (!Number.isSafeInteger(principal.generation) ||
245
+ principal.generation < 1) {
246
+ return {
247
+ allowed: false,
248
+ decision: "DENY",
249
+ code: "credential_generation_invalid",
250
+ };
222
251
  }
223
- const decision = decideAgentTool(policy, call.name);
252
+ const decision = decideRegisteredAgentTool(policy, input.allTools, call.name);
224
253
  if (!decision.allowed) {
225
254
  return { allowed: false, decision: "DENY", code: "tool_denied" };
226
255
  }
@@ -3001,6 +3001,16 @@ export async function executeOneYoloPrimitive(action, workspaceId) {
3001
3001
  action: "status",
3002
3002
  targetDate,
3003
3003
  requestKey,
3004
+ // fix(112ao-1-revert): the identity-only probe REQUIRES the FIX 1
3005
+ // server half (route isStatusReadScope). It shipped in 0.1.743 while
3006
+ // the deployed route still demanded the full triple, so every probe
3007
+ // 400'd invalid_scheduler_scope, api.ts threw, and the sweep primitive
3008
+ // died before its action:"run" dispatch — no sweep could place in ANY
3009
+ // workspace. Restored to the full scope until the server half is
3010
+ // deployed. Re-remove these three ONLY after that deploy is live.
3011
+ targetShapeRevision,
3012
+ expectedTargetsHash,
3013
+ maxPlacements,
3004
3014
  }));
3005
3015
  const statusErrorCode = stringValue(recordValue(statusResult?.lastError)?.code);
3006
3016
  if (statusResult?.scopeMatches === true &&
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.743",
3
+ "version": "0.1.745",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code, Codex, and Hermes campaign workflows",
6
6
  "main": "dist/index.js",