rankcontrol 0.8.1 → 0.8.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rankcontrol",
3
- "version": "0.8.1",
3
+ "version": "0.8.3",
4
4
  "description": "RankControl CLI + MCP server: drive your SEO/AI-visibility workspace from the terminal or any AI agent",
5
5
  "license": "MIT",
6
6
  "homepage": "https://rctrl.com",
package/src/cli.mjs CHANGED
@@ -63,6 +63,11 @@ export function runCli(argv) {
63
63
  .description("Composite visibility score blending AI citation rate with Google and Bing rank share, with subscores")
64
64
  .action(() => api.visibilityScore().then(out).catch(fail));
65
65
 
66
+ program
67
+ .command("expedition")
68
+ .description("First-run setup progress: five acts with per-step completion and the current act")
69
+ .action(() => api.expedition().then(out).catch(fail));
70
+
66
71
  program
67
72
  .command("visibility")
68
73
  .description("Daily AI visibility score trend from the stored weekly citation checks")
@@ -414,7 +419,7 @@ export function runCli(argv) {
414
419
  program
415
420
  .command("generate <contentId>")
416
421
  .description("Write a planned article's body now, keeping its publish slot (past-due or ≤3 days ahead; dry run unless --confirm)")
417
- .option("--confirm", "Actually start generation (spends LLM budget)")
422
+ .option("--confirm", "Actually start generation (costly)")
418
423
  .action((contentId, opts) =>
419
424
  api.generateContent(contentId, !!opts.confirm).then(out).catch(fail)
420
425
  );
@@ -531,7 +536,7 @@ export function runCli(argv) {
531
536
 
532
537
  program
533
538
  .command("repurpose-generate <contentId>")
534
- .description("Draft social posts for a published article (dry run unless --confirm; spends LLM budget)")
539
+ .description("Draft social posts for a published article (dry run unless --confirm; costly)")
535
540
  .option(
536
541
  "--platforms <a,b>",
537
542
  "Subset: linkedin,twitter,pinterest,instagram,facebook,threads,youtube,tiktok"
package/src/client.mjs CHANGED
@@ -103,6 +103,7 @@ export const api = {
103
103
  return request("GET", `/api/v1/citations${qs ? `?${qs}` : ""}`);
104
104
  },
105
105
  visibilityScore: () => request("GET", "/api/v1/visibility/score"),
106
+ expedition: () => request("GET", "/api/v1/expedition"),
106
107
  planningCapacity: () => request("GET", "/api/v1/content/planning-capacity"),
107
108
  jobs: (limit = 20) => request("GET", `/api/v1/jobs?limit=${limit}`),
108
109
  content: () => request("GET", "/api/v1/content"),
package/src/mcp.mjs CHANGED
@@ -29,7 +29,7 @@ const plannedTitle = z.object({
29
29
  });
30
30
 
31
31
  export async function startMcpServer() {
32
- const server = new McpServer({ name: "rankcontrol", version: "0.8.1" });
32
+ const server = new McpServer({ name: "rankcontrol", version: "0.8.3" });
33
33
 
34
34
  server.tool(
35
35
  "get_overview_funnel",
@@ -40,7 +40,7 @@ export async function startMcpServer() {
40
40
 
41
41
  server.tool(
42
42
  "get_visibility_trend",
43
- "Daily AI visibility score series (share of weekly citation checks where the brand was cited across the 6 tracked AI engines). Data comes from RankControl's stored weekly checks.",
43
+ "Daily AI visibility score series across the 6 tracked AI engines, from RankControl's stored weekly citation checks.",
44
44
  { days: z.enum(["30", "60", "90"]).optional().describe("Window size in days, default 30") },
45
45
  run(({ days }) => api.visibilityTrend(days ? Number(days) : 30))
46
46
  );
@@ -62,6 +62,13 @@ export async function startMcpServer() {
62
62
  run(() => api.visibilityScore())
63
63
  );
64
64
 
65
+ server.tool(
66
+ "get_setup_progress",
67
+ "First-run setup progress for the workspace: five acts from first article live through analytics, each with per-step completion, plus the current act. Use to tell the user what remains to finish setting up.",
68
+ {},
69
+ run(() => api.expedition())
70
+ );
71
+
65
72
  server.tool(
66
73
  "get_citability_report",
67
74
  "Published pages ranked by citability score (how extractable each page is for AI answers), worst first, each with its top open fixes. Use to decide which articles to improve.",
@@ -339,7 +346,7 @@ export async function startMcpServer() {
339
346
 
340
347
  server.tool(
341
348
  "find_outreach_contact",
342
- "Find an outreach email for one prospect by scraping their site (mailto links, contact page, obfuscated text; Prospeo fallback when configured). Returns the stored contact or found:false. Capped at 5/min.",
349
+ "Find an outreach email for one prospect site. Returns the stored contact or found:false. Capped at 5/min.",
343
350
  { backlinkId: z.string().describe("Prospect id from list_outreach_prospects") },
344
351
  run(({ backlinkId }) => api.outreachFindContact(backlinkId))
345
352
  );
@@ -353,7 +360,7 @@ export async function startMcpServer() {
353
360
 
354
361
  server.tool(
355
362
  "queue_outreach_email",
356
- "Queue an outreach email to a prospect. It sends from the workspace's own connected mailbox, paced ~1 per 10 minutes up to the daily cap. Uses the stored draft unless subject/body are given. Dry-run unless confirm is true — a confirmed queue leads to a REAL email being sent.",
363
+ "Queue an outreach email to a prospect. It sends from the workspace's own connected mailbox, paced automatically with a daily cap. Uses the stored draft unless subject/body are given. Dry-run unless confirm is true — a confirmed queue leads to a REAL email being sent.",
357
364
  {
358
365
  backlinkId: z.string().describe("Prospect id from list_outreach_prospects"),
359
366
  subject: z.string().optional().describe("Override the drafted subject"),
@@ -379,7 +386,7 @@ export async function startMcpServer() {
379
386
 
380
387
  server.tool(
381
388
  "plan_content",
382
- "Generate candidate article titles (capacity-gated). This DOES NOT put anything on the calendar: review the returned titles, then call commit_planned_titles with the keepers. Costs an LLM call; capped at 5/min.",
389
+ "Generate candidate article titles (capacity-gated). This DOES NOT put anything on the calendar: review the returned titles, then call commit_planned_titles with the keepers. Costly; capped at 5/min.",
383
390
  {
384
391
  topics: z.array(z.string()).optional().describe("Brand topics to focus on; omit for auto"),
385
392
  contentTypes: z.array(z.string()).optional(),
@@ -413,7 +420,7 @@ export async function startMcpServer() {
413
420
 
414
421
  server.tool(
415
422
  "generate_article",
416
- "Write a PLANNED article's body immediately instead of waiting for the scheduled pipeline (generate-only: its publish slot is unchanged). Allowed for past-due slots and up to 3 days ahead. Defaults to a DRY RUN; a human should approve before calling again with confirm=true since generation spends LLM budget.",
423
+ "Write a PLANNED article's body immediately instead of waiting for the scheduled pipeline (generate-only: its publish slot is unchanged). Allowed for past-due slots and up to 3 days ahead. Defaults to a DRY RUN; a human should approve before calling again with confirm=true since generation is costly.",
417
424
  {
418
425
  contentId: z.string().describe("The planned content page id"),
419
426
  confirm: z.boolean().optional().describe("Set true to actually start generation (default: dry run)"),
@@ -432,7 +439,7 @@ export async function startMcpServer() {
432
439
 
433
440
  server.tool(
434
441
  "get_article_settings",
435
- "The workspace article policy: per-article defaults (auto-write, auto-publish, images, title-in-hero, section infographics, Related Reading, YouTube, emojis, link counts, global instructions) plus the flexible-scheduling flag.",
442
+ "The workspace article policy: per-article defaults (auto-write, auto-publish, images, title-in-hero, section infographics, Related Reading, YouTube, emojis, link counts, global instructions) plus the flexible-scheduling flag. News and trending articles always publish manually, regardless of auto-publish.",
436
443
  {},
437
444
  run(() => api.articleSettings())
438
445
  );
@@ -529,7 +536,7 @@ export async function startMcpServer() {
529
536
 
530
537
  server.tool(
531
538
  "generate_repurpose_drafts",
532
- "Draft platform-native social posts for a published article. Regeneration replaces unposted drafts for the chosen platforms. Defaults to a DRY RUN; confirm=true generates (spends LLM budget).",
539
+ "Draft platform-native social posts for a published article. Regeneration replaces unposted drafts for the chosen platforms. Defaults to a DRY RUN; confirm=true generates (costly).",
533
540
  {
534
541
  contentId: z.string(),
535
542
  platforms: z