# RankControl (npm · rankcontrol)

Plan, write and publish SEO articles on your own site, and track your Google and AI search traffic.

- Trust score: 66/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-18

## Components

- remote · `api.rctrl.com`: 36/100, [markdown](https://verifymcp.io/servers/rankcontrol-rankcontrol/api.md), [page](https://verifymcp.io/servers/rankcontrol-rankcontrol/api)
- npm · `rankcontrol`: 66/100 (this document), [markdown](https://verifymcp.io/servers/rankcontrol-rankcontrol/rankcontrol.md), [page](https://verifymcp.io/servers/rankcontrol-rankcontrol/rankcontrol)

## Channel facts

- Registry: `npm`
- Package: `rankcontrol`
- Version: `0.19.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-18.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 31 of 94 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 2 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 69/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 6938 tokens (~67/item across 103 items; 103 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 83/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 48% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 12 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "remove_tracked_query" implies "remove" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 103 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the RankControl MCP server?

RankControl runs locally as an npm package, launched with npx -y rankcontrol. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add rankcontrol-rankcontrol -- npx -y rankcontrol
```

### Cursor

```json
{
  "mcpServers": {
    "rankcontrol-rankcontrol": {
      "command": "npx",
      "args": [
        "-y",
        "rankcontrol"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "rankcontrol-rankcontrol": {
      "command": "npx",
      "args": [
        "-y",
        "rankcontrol"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add rankcontrol-rankcontrol -- npx -y rankcontrol
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "rankcontrol-rankcontrol": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "rankcontrol"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add rankcontrol-rankcontrol --command npx --arg -y --arg rankcontrol
```

### Hermes

```yaml
mcp_servers:
  rankcontrol-rankcontrol:
    command: "npx"
    args: ["-y", "rankcontrol"]
```

### Netclaw

```json
{
  "McpServers": {
    "rankcontrol-rankcontrol": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "rankcontrol"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add rankcontrol-rankcontrol -t stdio -c npx -a -y rankcontrol
```

### Other

```json
{
  "mcpServers": {
    "rankcontrol-rankcontrol": {
      "command": "npx",
      "args": [
        "-y",
        "rankcontrol"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-14 (score 66)

First indexed and scored.

## MCP tools (103)

### `get_overview_funnel` (~31 tokens)

AI pipeline overview for the last 30 days: AI crawler hits and visits referred by AI engines.

### `get_visibility_trend` (~47 tokens)

Daily AI visibility score series across the 6 tracked AI engines, from RankControl's stored weekly citation checks.

Input parameters:

- `days` (string): Window size in days, default 30

### `list_citations` (~58 tokens)

Recent AI citation checks: which tracked queries were checked on which AI model and whether the brand was cited.

Input parameters:

- `limit` (number)
- `model` (string): Filter by AI model, e.g. chatgpt, perplexity

### `get_web_footprint` (~53 tokens)

Web footprint for the workspace and every competitor it tracks: how much of the web links to each domain, scored 0 to 10. A new domain scoring near zero is why AI citations are still absent.

### `get_web_total_history` (~58 tokens)

Web total history for the workspace and every competitor it tracks: each domain's monthly web total over the last 3 months, oldest month first. The web total counts citations in ChatGPT and Google answers, including queries you do not track.

### `get_visibility_score` (~58 tokens)

Composite AI visibility score for the workspace, blending AI citation rate across the tracked models with Google and Bing rank share. Returns the composite and the score of each part: AI citations, Google and Bing (the AI part includes a per-model breakdown).

### `get_setup_progress` (~47 tokens)

The workspace's expeditions on the Overview: the current expedition, each step's name and whether it is done, and the next step. Use it to help the user finish setting up.

### `get_citability_report` (~60 tokens)

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.

Input parameters:

- `limit` (number): Max rows, default 25

### `get_citation_sentiment` (~52 tokens)

How AI answers frame the brand when it's cited: positive / neutral / negative counts, daily trend, and recent answer snippets as receipts.

Input parameters:

- `days` (number): Window in days, default 30

### `get_citation_sources` (~59 tokens)

Which domains AI engines cite when answering the brand's tracked queries, typed brand / competitive / UGC / editorial with counts and share. Shows where citation presence must be earned.

Input parameters:

- `days` (number): Window in days, default 30

### `get_share_of_voice` (~57 tokens)

Share of voice vs competitors: the brand's citation rate, top competitor mention rates, and the brand's share of all brand appearances in AI answers over the window.

Input parameters:

- `days` (number): Window in days, default 30

### `list_tracked_queries` (~56 tokens)

The workspace's tracked queries — the questions RankControl checks weekly across the 6 AI engines for brand citations — with their status and, for each tracked query, how many of the 6 engines cited it in their latest check.

### `get_query_slots` (~30 tokens)

Tracking slots in use and the plan's limit, as Query Control shows them (18/50 tracked).

### `get_crawler_access` (~78 tokens)

Daily AI-crawler reachability probe result — a DIAGNOSTIC, not a traffic metric: whether the site's edge (e.g. Cloudflare Bot Fight Mode) or robots.txt blocks GPTBot/ClaudeBot. 'shielded' means browsers and bots are both challenged (site-wide shield, ambiguous for real, signed crawlers).

### `get_analytics_sources` (~65 tokens)

Per-workspace analytics source setup: the selected writer for human traffic and AI-crawler data, which sources the setup qualifies for, and install state (Cloudflare zone/sync, WordPress plugin version, embed liveness). Both Analytics and Reports screens ship disabled until activated.

### `set_analytics_source` (~67 tokens)

Select the active writer for a data type. Validated server-side against what the customer's setup supports. Switching aiCrawlers to cloudflare starts a backfill sync.

Input parameters:

- `dataType` (string, required)
- `source` (string, required): cloudflare, wordpress_plugin or site_hook

### `activate_analytics_screen` (~39 tokens)

Turn on the Analytics or Reports screen for this workspace (they ship disabled; activation is one-time per screen).

Input parameters:

- `screen` (string, required)

### `get_cloudflare_connect_url` (~42 tokens)

OAuth URL to connect read-only Cloudflare analytics (AI-crawler data source). Open it in a browser; the grant is scoped to Analytics:Read.

### `list_cloudflare_zones` (~27 tokens)

Cloudflare zones visible to the connected grant, for picking which zone to poll.

### `select_cloudflare_zone` (~72 tokens)

Pick the Cloudflare zone to poll. A crawler source already set stays; Cloudflare becomes the source only when none is set, and its first sync backfills up to 7 days.

Input parameters:

- `zoneId` (string, required)
- `zoneName` (string, required): Zone name, e.g. example.com

### `install_framer_embed` (~68 tokens)

Install site-wide visit tracking on the connected Framer project via its custom-code API. Dry run unless confirm is true. Confirming ALSO PUBLISHES the customer's Framer site.

Input parameters:

- `confirm` (boolean): Actually install (default: dry run)
- `integrationId` (string)

### `install_webflow_custom_code` (~102 tokens)

Register and apply the tracking loader via Webflow's Custom Code API. Dry run unless confirm is true. Needs a site token with CMS + Custom code scopes (pass apiToken to upgrade the stored one). Goes live on the customer's next Webflow site publish.

Input parameters:

- `apiToken` (string): New site token with CMS + Custom code scopes
- `confirm` (boolean): Actually install (default: dry run)
- `integrationId` (string)

### `add_tracked_query` (~96 tokens)

Add a query. Weekly AI citation checks start immediately when a tracking slot is free; otherwise it is saved untracked. Pass coveredByContentId when the query is one of that article's question headings, so Content Ideas does not offer it again.

Input parameters:

- `coveredByContentId` (string): contentPage id of the article that already answers this query
- `queryText` (string, required): The search/AI query to track

### `hide_content_idea` (~54 tokens)

Hide an idea from Content Ideas. A tracked query keeps its weekly checks and its slot; use remove_tracked_query to delete a query outright.

Input parameters:

- `queryId` (string, required): Idea id from get_content_ideas

### `remove_tracked_query` (~39 tokens)

Delete a query. Frees its tracking slot if it was tracked.

Input parameters:

- `queryId` (string, required): Query id from get_tracked_queries

### `set_query_tracking` (~73 tokens)

Pause or resume weekly AI citation checks on a saved query. Tracking uses one of the plan's tracking slots; pausing frees it. The query is kept either way.

Input parameters:

- `queryId` (string, required): Query id from get_tracked_queries
- `tracked` (boolean, required): true to track weekly, false to pause

### `update_tracked_query` (~56 tokens)

Rewrite a tracked query's text. Future weekly checks use the new text.

Input parameters:

- `queryId` (string, required): Query id from get_tracked_queries
- `queryText` (string, required): New query text (min 5 characters)

### `get_competitors` (~46 tokens)

Tracked competitors used in share-of-voice and visibility comparisons, with each one's AI visibility score, citations of checks over the last 30 days, domain metrics and positioning analysis.

### `add_competitor` (~78 tokens)

Track a competitor (max 10). They enter weekly share-of-voice comparisons against the org's own citation rate. Omit websiteUrl to have the site resolved from the name.

Input parameters:

- `name` (string, required): Competitor name
- `websiteUrl` (string): Competitor website URL (optional; resolved from the name when omitted)

### `remove_competitor` (~31 tokens)

Stop tracking a competitor.

Input parameters:

- `competitorId` (string, required): Competitor id from get_competitors

### `get_topics` (~27 tokens)

The workspace's topics. Tracked queries, content ideas and planned articles all group under these.

### `set_topics` (~61 tokens)

Replace the FULL topic list. Send every topic that should exist; missing ones are removed, new ones created, duplicates merged. Read get_topics first and modify that list. Up to 20 topics.

Input parameters:

- `topics` (array, required): The complete list of topic names

### `delete_planned_title` (~62 tokens)

Remove a planned title from the content calendar. The title's keyword returns to Content Ideas as a saved query, so the topic is not lost. Only planned rows qualify; use archive for generated articles.

Input parameters:

- `contentId` (string, required): Planned contentPage id

### `get_traffic_overview` (~53 tokens)

Traffic overview from RankControl's own page analytics: total page views, unique visitors, sessions, bounce rate, and average time on page.

Input parameters:

- `days` (string): Window in days, default 30

### `get_rankings` (~131 tokens)

Verified Google and Bing positions per keyword (top 30), with Search Console clicks, impressions and average position when connected (gscPosition is an average over the searches you appeared in, never a rank), which page earned each query and whether it is one of your articles (isOurs), and how often Google's AI Overview shows above each keyword and cites one of your pages (a rate over the last 8 weekly checks). Defaults to queries your published articles appear for.

Input parameters:

- `scope` (string): "ours" (default): queries your published articles appear for. "site": everything on the domain.

### `get_planning_capacity` (~32 tokens)

How many article titles can still be planned onto the content calendar within the scheduling horizon. Check before plan_content.

### `get_team` (~27 tokens)

Workspace members and pending invites, with each member's per-screen permission matrix and the seat cap.

### `invite_team_member` (~85 tokens)

Invite a member to the workspace with per-screen none/read/write access (unspecified screens default to none — grant at least one). Dry-run unless confirm is true; confirming sends the invite email.

Input parameters:

- `confirm` (boolean): Set true to actually send the invite (default dry-run)
- `email` (string, required): Invitee email address
- `screenPermissions` (object)

### `revoke_team_invite` (~32 tokens)

Revoke a pending team invite by invitation id (from get_team).

Input parameters:

- `invitationId` (string, required)

### `remove_team_member` (~48 tokens)

Remove a member from the workspace (access revoked immediately). Dry-run unless confirm is true.

Input parameters:

- `confirm` (boolean)
- `userId` (string, required): Member user id from get_team

### `list_outreach_prospects` (~68 tokens)

Link outreach pipeline: prospect sites per published article with status (identified → contacted → replied → link placed), Domain Rating (dr, with drSource ahrefs; dataforseo marks an authority estimate for a domain Ahrefs has no number for) and any contact email already found.

### `get_outreach_stats` (~93 tokens)

Outreach funnel for the last 90 days by how each prospect was found (intersection = competitor linkers, footprint = resource pages, mention = topical mentions, fresh = fresh competitor links, brand_mention = brand mentions, legacy = earlier rows): prospects, sent, replied and placed with reply and placement rates per send, plus the total. The harvest reads the same numbers to weight its methods; nothing to configure.

### `find_outreach_contact` (~51 tokens)

Find an outreach email for one prospect site. Returns the stored contact or found:false. Capped at 5/min.

Input parameters:

- `backlinkId` (string, required): Prospect id from list_outreach_prospects

### `draft_outreach_reply` (~73 tokens)

AI-draft the next reply to a prospect who answered (status replied or rejected; auto-replies don't count). Returns subject and body only. Nothing sends: pass that subject and body to queue_outreach_email to send it.

Input parameters:

- `backlinkId` (string, required): Prospect id from list_outreach_prospects

### `queue_outreach_email` (~148 tokens)

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 (a reply to a prospect who answered must pass both); a "[Your name]" sign-off in the draft is replaced with the owner's profile name at send time. Dry-run unless confirm is true — a confirmed queue leads to a REAL email being sent.

Input parameters:

- `backlinkId` (string, required): Prospect id from list_outreach_prospects
- `body` (string): Override the drafted body
- `confirm` (boolean): Set true to actually queue the send
- `subject` (string): Override the drafted subject

### `cancel_outreach_email` (~56 tokens)

Cancel a queued outreach email (a first email, a reply or a follow-up) before it sends. Refused once it has gone out.

Input parameters:

- `backlinkId` (string, required): Prospect id from list_outreach_prospects

### `list_jobs` (~35 tokens)

Recent agent runs (job status feed). Async actions like content planning show up here with their outputs.

Input parameters:

- `limit` (number)

### `list_content` (~24 tokens)

List content pages in the workspace with their status (planned, draft, published).

### `plan_content` (~200 tokens)

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. To plan titles about something specific, pass it as subject with the workspace topics it fits as topics. If it fits none of them, offer to add a topic first (set_topics). Costly; capped at 5/min.

Input parameters:

- `contentTypes` (array)
- `intents` (array): informational / commercial / transactional
- `maxDifficulty` (number): Keyword-difficulty ceiling
- `subject` (string): What the titles should be about, in the user's words (150 characters max). Needs topics.
- `topics` (array): Topic names from get_topics; omit for auto
- `useCitationGaps` (boolean): Target queries where AI cites competitors but not us
- `useRankingGaps` (boolean): Target keywords ranking page 2-3 or slipping

### `commit_planned_titles` (~73 tokens)

Approve reviewed titles onto the content calendar (the approval half of the plan→commit gate). Pass rejected candidates in `discarded` so their keywords recycle into Content Ideas.

Input parameters:

- `discarded` (array): Rejected candidates
- `runId` (string)
- `titles` (array, required): Titles to schedule

### `publish_content` (~104 tokens)

Publish an article to the customer's connected CMS. Defaults to a DRY RUN describing what would happen; a human should approve before calling again with confirm=true. Delivery runs after this call returns. If the article does not go live, list_content shows its lastPublishError. Webhook receivers: https://rctrl.com/docs/webhook

Input parameters:

- `confirm` (boolean): Set true to actually publish (default: dry run)
- `contentId` (string, required): The content page id

### `generate_article` (~125 tokens)

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, and at most 5 articles in any 24 hours (the dry run reports withinDailyLimit and nextWriteAt). Defaults to a DRY RUN; a human should approve before calling again with confirm=true since generation is costly.

Input parameters:

- `confirm` (boolean): Set true to actually start generation (default: dry run)
- `contentId` (string, required): The planned content page id

### `get_article_settings` (~72 tokens)

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.

### `update_article_settings` (~89 tokens)

Merge-patch the article policy: only the fields you pass change. Set flexibleScheduling true to allow 1-5 articles/day and manual rescheduling. styleSet picks your workspace's image style for article hero images.

Input parameters:

- `articleSettings` (object)
- `flexibleScheduling` (boolean)
- `styleSet` (string): Your workspace's image style, one of the 25 styles.

### `reschedule_article` (~76 tokens)

Move a PLANNED article to another day (requires the flexible schedule; max 5/day; the exact hour is placed automatically). Pass the target day as YYYY-MM-DD in the workspace's timezone.

Input parameters:

- `contentId` (string, required)
- `date` (string, required): Target day as YYYY-MM-DD in the workspace's timezone

### `update_planned_article` (~163 tokens)

Change a planned article's own settings before it is written: length, tone, image style and custom instructions. Locked once writing starts.

Input parameters:

- `contentId` (string, required)
- `imageStyle` (string): One of the 25 image styles, or default to use your workspace's image style.
- `instructions` (string): Applied when this article is written, on top of your workspace's article settings. Empty clears them.
- `length` (string): auto (the article type's default), short (1,200–1,800 words), medium (2,000–2,800) or long (3,200–4,000)
- `tone` (string): One of the six brand tones, or default to follow your brand tone.

### `get_internal_links` (~63 tokens)

How the workspace's articles interlink: how many published articles link TO this page (with the source list) and how many internal links it sends out. Recorded from the real injected links at publish render time.

Input parameters:

- `contentId` (string, required): The content page id

### `list_site_pages` (~31 tokens)

Site pages RankControl links to from inside articles and the Related Reading block (with linkable/alive flags).

### `detect_site_links` (~95 tokens)

Scan the customer's sitemap (nested indexes handled) or crawl a blog root page and return same-site page URLs, minus the articles RankControl published (those are linked already). The source is remembered and re-read daily. Costly (3/min); review the URLs, then call add_site_pages with the keepers.

Input parameters:

- `source` (string, required)
- `url` (string, required): Sitemap XML URL or a page URL to crawl

### `add_site_pages` (~44 tokens)

Add site page URLs for internal linking. Duplicates and articles RankControl published are skipped; page titles fill in automatically in the background.

Input parameters:

- `urls` (array, required)

### `set_site_page_linking` (~56 tokens)

Turn linking to a site page on or off. Off keeps the page in your list, but articles published after this don't link to it.

Input parameters:

- `isLinkable` (boolean, required)
- `pageId` (string, required)

### `remove_site_page` (~48 tokens)

Remove a page from your site pages. Articles published after this don't link to it, and scans don't add it back; add_site_pages adds it again.

Input parameters:

- `pageId` (string, required)

### `list_repurpose_queue` (~43 tokens)

Published articles with their social repurpose drafts per platform (platform + status chips). Shows which articles still need drafts and which scheduler is connected (Buffer or Postiz).

### `get_repurpose_drafts` (~66 tokens)

Full social drafts (title, body, images, status) for one published article across the 8 platforms (LinkedIn, X/Twitter, Pinterest, Instagram, Facebook, Threads, YouTube, TikTok).

Input parameters:

- `contentId` (string, required): The content page id

### `generate_repurpose_drafts` (~70 tokens)

Draft platform-native social posts for all eight platforms from a published article. Only for an article with no drafts yet; edit existing drafts in the dashboard. Defaults to a DRY RUN; confirm=true generates (costly).

Input parameters:

- `confirm` (boolean)
- `contentId` (string, required)

### `update_repurpose_draft` (~48 tokens)

Edit a repurpose draft's body and/or title before pushing or posting.

Input parameters:

- `body` (string)
- `draftId` (string, required)
- `title` (string)

### `mark_repurpose_posted` (~40 tokens)

Mark a repurpose draft as posted — use after publishing its text manually (outside Buffer or Postiz).

Input parameters:

- `draftId` (string, required)

### `list_postiz_channels` (~38 tokens)

Connected social channels across Postiz and Buffer (scheduler, id, name, platform). Channel ids are required by push_repurpose_draft.

### `push_repurpose_draft` (~158 tokens)

Send a repurpose draft to a connected scheduler's channels: Postiz or Buffer (schedule, save as a draft, or add to Buffer's queue). YouTube and TikTok drafts are recording scripts and never push. PUBLICLY VISIBLE side effect: defaults to a DRY RUN; a human should approve before calling again with confirm=true.

Input parameters:

- `confirm` (boolean)
- `date` (string): ISO time for scheduleType=schedule
- `draftId` (string, required)
- `integrationIds` (array): Channel ids from list_postiz_channels (required with confirm)
- `scheduleType` (string): Default draft; queue is Buffer only
- `scheduler` (string): Which scheduler; required when both are connected

### `get_content_ideas` (~48 tokens)

Scored content-idea backlog: uncovered tracked queries ranked by citation gaps, competitor citations, trending topics, and quick-win rankings. Each idea carries a suggested title and winnability metrics.

### `plan_content_idea` (~68 tokens)

Put one of your Content Ideas on the calendar as a planned article. Pass its queryText from get_content_ideas. The idea's own title and numbers are used; a title is generated only when it has none.

Input parameters:

- `queryText` (string, required): The idea's keyword/query text

### `archive_content` (~66 tokens)

Archive an article: it moves to the Archived tab and RankControl stops refreshing it. The published post stays live on your site; remove it there separately to take it down. It can't be restored. Refused while the article is still being written.

Input parameters:

- `contentId` (string, required)

### `get_page_engagement` (~34 tokens)

Per-page engagement for the last 30 days: views, AI citations, and a view sparkline per published page.

### `get_exec_summary` (~42 tokens)

Executive report: last 30 days vs the 30 before — cite rate, citations, page views, AI-referred views, crawler hits, and articles published.

### `get_top_wins` (~39 tokens)

Biggest wins of the last 30 days: most-cited page, best query cite-rate jump, biggest Google ranking climb, best new backlink.

### `get_agent_activity` (~63 tokens)

Recent pipeline runs per agent lane (brand control, radar, forge, recon, deploy, outreach, sentinel, social).

Input parameters:

- `perAgent` (number): Runs per lane, default 15
- `sinceDays` (number): Window in days, default 30

### `list_backlinks` (~60 tokens)

The workspace's backlink table, newest first. Each row carries its source (index, outreach, managed, network).

Input parameters:

- `status` (string): Filter: discovered, verified, lost, placed, identified, contacted, replied, link_placed, rejected

### `get_backlink_stats` (~29 tokens)

Backlink totals (live, lost, avg DA, unique domains) plus outreach pipeline counts.

### `update_outreach_status` (~61 tokens)

Move an outreach prospect through the pipeline. A move to link_placed is confirmed by reading their page now and again tomorrow; the row keeps Placed and shows what was seen.

Input parameters:

- `backlinkId` (string, required)
- `status` (string, required)

### `get_link_network` (~36 tokens)

Editorial Circle state: credit balance/earn/spend, membership (optedIn), and hosted/received placements with partners and anchors.

### `set_link_network_opt_in` (~64 tokens)

Join or leave the Editorial Circle. SIDE EFFECT on partner sites (leaving retires live links): defaults to a DRY RUN; a human should approve before calling again with confirm=true.

Input parameters:

- `confirm` (boolean)
- `optIn` (boolean, required)

### `remove_network_placement` (~69 tokens)

Retire one Editorial Circle placement on an article your site hosts (a link you received can't be removed). VISIBLE on the partner site: defaults to a DRY RUN; call again with confirm=true after human approval.

Input parameters:

- `confirm` (boolean)
- `placementId` (string, required)

### `list_social_threads` (~57 tokens)

Social thread prospects (Reddit/X) where the brand's articles could earn a mention, with subreddit rules context, sorted by intent.

Input parameters:

- `age` (string)
- `platform` (string)
- `status` (string)

### `get_social_stats` (~14 tokens)

Social thread pipeline counts.

### `update_social_thread_status` (~53 tokens)

Skip a social thread so it leaves the queue (the only manual status; Posted is set automatically once your reply is found in the thread).

Input parameters:

- `status` (string, required)
- `threadId` (string, required)

### `open_social_thread` (~94 tokens)

Open a drafted social thread to post the reply yourself: returns the thread URL (for X, a link that opens X's composer with the reply filled in) and starts four checks over 72 hours that mark the thread Posted once your reply is found there. Pass text to use an edited reply; X replies must be 280 characters or fewer.

Input parameters:

- `text` (string)
- `threadId` (string, required)

### `set_social_x_handle` (~44 tokens)

Save the X handle used to recognise your posted replies (optional; text matching covers the rest). Pass an empty handle to clear it.

Input parameters:

- `handle` (string, required)

### `set_reddit_profile` (~135 tokens)

Save the Reddit account the Social tab drafts for: username (optional), comment karma, account age (under1mo, 1to6mo, 6moto2yr or over2yr), goal, founderStory and tone. Karma and age decide whether drafts may mention your product; the reply returns the readiness tier (warmup or ready). Replaces the stored profile — send every field.

Input parameters:

- `accountAge` (string, required)
- `founderStory` (string, required)
- `goal` (string, required)
- `karma` (number, required)
- `tone` (string, required)
- `username` (string)

### `draft_social_reply` (~74 tokens)

AI-draft a reply for a social thread. Nothing posts — the draft lands on the thread for human review. Subject to the same warm-up/pacing guards as the dashboard.

Input parameters:

- `mentionMode` (string): Brand-mention mode; warm-up accounts are clamped to none
- `threadId` (string, required)

### `contact_support` (~106 tokens)

Send a message or bug report to the RankControl team (emails support with the workspace identified; the org owner is set as reply-to). Use when an API call errors unexpectedly or data looks wrong — include the failing request, ids, and what you expected. Capped at 3/min.

Input parameters:

- `message` (string, required): Details: what happened, errors, ids, steps to reproduce
- `pageUrl` (string): Related dashboard or API URL
- `subject` (string, required)

### `get_help_page` (~80 tokens)

RankControl's help pages: setup guides for each publishing destination, the crawler and its IP address, AI crawler access, the API, CLI and MCP, getting started, and the plan and pricing. Without a page, lists the pages.

Input parameters:

- `page` (string): Page slug, such as nextjs, bot, wordpress or plan-and-pricing

### `get_billing` (~58 tokens)

This workspace's billing as Settings, Billing shows it: status (trial, active or cancelling), billing cycle, next charge, add-ons, usage against the plan's limits and recent payments. Read-only; changes are made in Settings, Billing.

### `get_brand` (~53 tokens)

The workspace's brand data in one read: brand profile (voice, colors, meta), links/CTAs, products, buyer profiles (ICPs) and brand guidelines. This is the context RankControl's writers use.

### `confirm_brand_reviewed` (~34 tokens)

Mark the brand as reviewed: the Confirm your brand step of Expedition I, as the Overview's Mark reviewed button does.

### `add_brand_guideline` (~78 tokens)

Add a brand guideline the writer follows in every article, as Brand Control, Writing, Brand Guidelines does: its type (tone, terminology, topic, style or factual), what to avoid and what to write instead (300 characters each).

Input parameters:

- `avoid` (string, required)
- `instead` (string, required)
- `type` (string, required)

### `set_brand_guideline_active` (~42 tokens)

Turn a brand guideline on or off. Guideline ids come from get_brand.

Input parameters:

- `guidelineId` (string, required)
- `on` (boolean, required)

### `remove_brand_guideline` (~34 tokens)

Delete a brand guideline. This can't be undone; turning it off keeps it.

Input parameters:

- `guidelineId` (string, required)

### `update_brand_profile` (~100 tokens)

Patch brand voice/style fields: tone, colors, defaultLocale, flexibleScheduling. Only provided fields change; they steer all future article generation.

Input parameters:

- `defaultLocale` (string): BCP-47 tag from the supported registry
- `flexibleScheduling` (boolean)
- `primaryColor` (string)
- `secondaryColor` (string)
- `tone` (string): One of: professional, conversational, technical, friendly, journalistic, persuasive

### `update_brand_identity` (~222 tokens)

Update workspace identity: name, industry and subIndustry (values from the dashboard's industry list; a new industry without a subIndustry clears the old one), productDescription, authors (EEAT bylines used in article JSON-LD), styleReferenceUrls (articles whose writing style the writer imitates), brandAliases (other spellings and short forms of the brand; pages using them count as brand mentions) and brandExclusions (same-name companies or products whose pages are skipped). Every array REPLACES the stored list — call get_brand first and send the full updated list. Saving a name change runs the brand-mention search once a day at most. websiteUrl is immutable and cannot be changed.

Input parameters:

- `authors` (array)
- `brandAliases` (array)
- `brandExclusions` (array)
- `industry` (string)
- `name` (string)
- `productDescription` (string)
- `styleReferenceUrls` (array)
- `subIndustry` (string): Specialty within the industry, from the same list

### `write_brand_product` (~117 tokens)

Create, update, or delete a product in brand memory (feeds article context + entity triples). Create: name+description+category. Update: productId + changed fields. Delete: productId + del=true.

Input parameters:

- `category` (string)
- `del` (boolean)
- `description` (string)
- `features` (array)
- `name` (string)
- `pricing` (string)
- `productId` (string)
- `url` (string)
- `usps` (array)

### `write_brand_icp` (~142 tokens)

Create, update, or delete a buyer profile / ICP (feeds article targeting + entity triples). Create: title+industry+demographics. Update: profileId + changed fields. Delete: profileId + del=true.

Input parameters:

- `buyingTriggers` (array)
- `companySize` (string)
- `del` (boolean)
- `demographics` (object): Demographics object; required on create (same shape the dashboard saves)
- `industry` (string)
- `objections` (array)
- `painPoints` (array)
- `preferredChannels` (array)
- `profileId` (string)
- `title` (string)

### `suggest_brand_icps` (~69 tokens)

Suggest up to 8 audiences for this site from its brand, products, competitors and topics. Saves nothing. Pick one and pass it to draft_brand_icp, or write your own with write_brand_icp.

Input parameters:

- `exclude` (array): Audience titles already shown, to get different ones

### `draft_brand_icp` (~146 tokens)

Draft one buyer profile from a one-sentence description or a suggestion from suggest_brand_icps. Returns the fields to review; nothing is saved until write_brand_icp. Fields passed in given are kept as written.

Input parameters:

- `describe` (string): Who the audience is, in one sentence
- `given` (object): Fields to keep as written (same keys as write_brand_icp, plus ageRange, seniority, department as strings). A key you pass is kept, empty included; a key you leave out is filled.
- `title` (string): Title of a suggestion from suggest_brand_icps
- `who` (string): The suggestion's one-line description

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/rankcontrol-rankcontrol/rankcontrol#diagnostics

## Score history

- 2026-10-18: 66
- 2026-10-17: 66
- 2026-10-16: 66
- 2026-10-15: 66
- 2026-10-14: 66

## Common questions

### What is the RankControl MCP server?

RankControl is an MCP server listed in the public MCP registry as io.github.rankcontrol/rankcontrol. Plan, write and publish SEO articles on your own site, and track your Google and AI search traffic. This page covers its npm package (rankcontrol).

### Is the RankControl MCP server safe to use?

RankControl scores 66 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 18 October 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the RankControl MCP server expose?

RankControl exposes 103 tools: get_overview_funnel, get_visibility_trend, list_citations, get_web_footprint, get_web_total_history, and 98 more. Their descriptions and schemas cost roughly 6,938 tokens of context every time the server is loaded.

### Is the RankControl MCP server still maintained?

RankControl is still listed as active in the MCP registry. We last reached this channel on 18 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the RankControl MCP server under?

RankControl declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/rankcontrol
- Socket report: https://socket.dev/npm/package/rankcontrol
- Repository: https://github.com/rankcontrol/rankcontrol
- Website: https://rctrl.com/mcp
- Changelog RSS feed: https://verifymcp.io/servers/rankcontrol-rankcontrol/rankcontrol.xml
- Changelog JSON feed: https://verifymcp.io/servers/rankcontrol-rankcontrol/rankcontrol.json
- HTML version of this page: https://verifymcp.io/servers/rankcontrol-rankcontrol/rankcontrol
