Free AI visibility report

Get my report

MCP · 48 tools

Connect an AI agent

RankBull ships a built-in MCP server. Point Claude Code, Cursor, Windsurf, Codex, Copilot, Gemini CLI, or any MCP client at it. The agent runs the workspace without the dashboard — same plan caps as the UI.

Agents reading this page: the complete tool contract is below. Prefer the markdown mirror at https://rankbull.io/docs/mcp.md if your client handles .md cleaner than HTML.

1. Create an API key

In the dashboard, open Settings → API & MCP and create a key. Grant read permissions for inspection; articles:write lets the agent import, edit, schedule, publish, and generate (generate consumes a plan article credit). sites:write covers prompts, competitors, and index inspect. The full key is shown exactly once.

  • Endpoint: https://dashboard.rankbull.io/api/mcp
  • Header: Authorization: Bearer YOUR_KEY (an x-api-key header works too)

2. Connect your client

Claude Code

claude mcp add --transport http rankbull https://dashboard.rankbull.io/api/mcp \
  --header "Authorization: Bearer YOUR_KEY"

Cursor

Add to ~/.cursor/mcp.json (or a project's .cursor/mcp.json):

{
  "mcpServers": {
    "rankbull": {
      "url": "https://dashboard.rankbull.io/api/mcp",
      "headers": { "Authorization": "Bearer YOUR_KEY" }
    }
  }
}

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "rankbull": {
      "serverUrl": "https://dashboard.rankbull.io/api/mcp",
      "headers": { "Authorization": "Bearer YOUR_KEY" }
    }
  }
}

OpenAI Codex

Add to ~/.codex/config.toml (key names have shifted between Codex releases — check codex mcp --help if this doesn't take):

[mcp_servers.rankbull]
url = "https://dashboard.rankbull.io/api/mcp"
http_headers = { "Authorization" = "Bearer YOUR_KEY" }

GitHub Copilot (VS Code)

Add to .vscode/mcp.json in your workspace:

{
  "servers": {
    "rankbull": {
      "type": "http",
      "url": "https://dashboard.rankbull.io/api/mcp",
      "headers": { "Authorization": "Bearer YOUR_KEY" }
    }
  }
}

Gemini CLI

Add to ~/.gemini/settings.json:

{
  "mcpServers": {
    "rankbull": {
      "httpUrl": "https://dashboard.rankbull.io/api/mcp",
      "headers": { "Authorization": "Bearer YOUR_KEY" }
    }
  }
}

Anything else

Any client that speaks MCP over streamable HTTP works: point it at https://dashboard.rankbull.io/api/mcp with the Authorization header. The server answers stateless JSON-RPC — no session setup required.

3. How an agent should operate

  • Start every session with whoami. It returns workspaceId, key permissions, and siteIds.
  • Plan caps match the dashboard. generate_article spends one article credit and real LLM budget — confirm with the user, never loop it.
  • import_article does not spend a credit. contentHtml must be publish HTML (p, h2–h6, ul/ol, a, img, table). Markdown is rejected.
  • Prompt and competitor adds fail with the same plan-limit errors as the UI.
  • request_index_inspect is capped at 20 per site per day.
  • Keyword research reads are free and never call DataForSEO. add_target_keywords is hand-typed only. run_keyword_ideas spends one ideas credit — confirm first.
  • get_prompt_answers returns receipts: real engine runs and cited URLs.
  • Revoking the API key in Settings cuts the agent off immediately.

4. Tools (48)

Generated from the live MCP registry. Names, permissions, and arguments are what the server actually exposes.

  1. whoami
  2. list_sites
  3. get_site
  4. list_monitors
  5. visibility_overview
  6. list_prompts
  7. get_prompt_answers
  8. list_opportunities
  9. top_cited_sources
  10. list_citations
  11. list_competitors
  12. add_competitor
  13. remove_competitor
  14. list_serp_competitors
  15. get_site_health
  16. search_performance
  17. traffic_overview
  18. bing_performance
  19. domain_overview
  20. indexing_summary
  21. list_indexing_pages
  22. request_index_inspect
  23. list_articles
  24. get_article
  25. get_article_content
  26. list_calendar
  27. list_keyword_candidates
  28. get_job_status
  29. import_article
  30. save_article_html
  31. schedule_article
  32. reschedule_article
  33. cancel_article_schedule
  34. publish_article
  35. generate_article
  36. list_keywords
  37. list_keyword_clusters
  38. list_target_keywords
  39. add_target_keywords
  40. remove_target_keyword
  41. list_ranked_keywords
  42. list_keyword_ideas
  43. run_keyword_ideas
  44. add_prompt
  45. set_prompt_status
  46. get_automation_policy
  47. pause_automation
  48. resume_automation

Identity & sites

Start here. whoami is free and returns workspaceId, permissions, and siteIds.

whoami

Who am Iread · any valid API key

Confirms which RankBull workspace this API key belongs to, lists the key's permissions, and (when the key has sites:read) the workspace's sites with their siteIds. Free to call — start every session here to discover siteIds for the other tools.

No arguments.

list_sites

List sitesread · sites:read

Lists every active site in the key's workspace with siteId, domain, status, language, and sitemap URL. Use the returned siteId for all site-scoped tools.

No arguments.

get_site

Get siteread · sites:read

Fetches one site's full record: domain, status, language, sitemap URL, target countries, and analysis state. Prefer list_sites first when you only need a siteId.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami (e.g. "js7…").

AI visibility

Scores, prompts, receipts, opportunities, and cited sources.

list_monitors

List tracking monitorsread · sites:read

Lists AI-visibility monitors for a site (monitorId, cadence, status, engines). Needed before add_prompt.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

visibility_overview

Visibility overviewread · sites:read

Daily AI-search visibility aggregates for a site: visibility score, presence rate, share of voice, citation rate, and run counts per engine/brand/day. Rows cover the site's own brand and tracked competitors (distinguish by brandId). Free to call.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
days?numberLookback window in days (default 30, max 90).

list_prompts

List tracked promptsread · sites:read

Lists the AI-search prompts tracked for a site (across its monitors) with promptId, text, intent, funnel stage, locale, and status. Pass a promptId to get_prompt_answers for the underlying runs and citations.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

get_prompt_answers

Get prompt answersread · sites:read

The receipts for one tracked prompt: real AI-engine runs (mention/citation counts per run) plus every source URL those answers cited, flagged is_your_domain when the citation points at the site. Use this to prove or debug why a prompt does/doesn't surface the brand.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
promptIdstringPrompt ID from list_prompts.
days?numberLookback window in days (default 30, max 90).

list_opportunities

List opportunitiesread · sites:read

Scored AI-visibility opportunities for a site (content gaps, competitor wins, citation gaps) with a recommended action each. Highest composite score first — start at the top.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
status?"new" | "saved" | "in_progress" | "completed" | "dismissed"Filter by workflow status (default "new").

top_cited_sources

Top cited sourcesread · sites:read

Domains AI engines cite most when answering this site's tracked prompts, with citation counts, engine spread, and share of total. Use it to find the publications and directories worth earning mentions on.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
days?numberLookback window in days (default 30, max 90).
engineKey?stringFilter to one AI engine: chatgpt, claude, perplexity, gemini, aio (Google AI Overviews), ai_mode, or grok. Omit for all engines.
limit?numberMax domains to return (default 25, max 100).

list_citations

List citationsread · sites:read

Citation rows for a site (host, title, url, engine). Optional host or engineKey filter. Read-only.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
days?numberLookback days (default 30, max 90).
host?stringFilter to one host, e.g. dev.to
engineKey?stringFilter to one engine, e.g. chatgpt
limit?numberMax rows (default from API).

Competitors

Same per-site caps as the dashboard.

list_competitors

List competitorsread · sites:read

Tracked competitor brands for a site (linkId, name, domain, source). Use linkId with remove_competitor.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

add_competitor

Add competitorwrite · sites:write

Adds a manual competitor brand. Enforces the plan's per-site competitor cap (same error as the dashboard).

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
displayNamestringCompetitor brand name.
primaryDomain?stringCompetitor domain, e.g. example.com. Optional but recommended.

remove_competitor

Remove competitorwrite · sites:write

Removes a competitor link from the site. Frees a cap slot. Use linkId from list_competitors.

ArgumentTypeNotes
linkIdstringCompetitor link ID from list_competitors.

list_serp_competitors

List Google SERP competitorsread · sites:read

Domains that rank in stored Google SERP snapshots where this site does not. Read-only — does not spend a SERP refresh. Empty until keyword research has stored SERPs. For AI-answer competitors use list_competitors.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

Site health

Read the latest scan. Does not start a crawl.

get_site_health

Get site healthread · sites:read

Latest site-health scan: score, status, summary, pages scanned, and recent score trend. Read-only — does not start a new crawl.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

Analytics

Search Console, GA4, and Bing — once connected in Settings → Analytics. GSC data lags ~2 days.

search_performance

Search performance (GSC)read · sites:read

Google Search Console performance for a site: total clicks, impressions, CTR, and average position, plus top queries and a daily series. GSC data lags ~2 days behind real time. Returns connected:false when Search Console isn't linked — point the user at Settings → Analytics.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
dateRange?"7d" | "28d" | "90d"Reporting window: 7d, 28d (default), or 90d. GSC data lags ~2 days, so the window ends about 2 days ago.

traffic_overview

Traffic overview (GA4)read · sites:read

Google Analytics 4 traffic for a site: page views, sessions, users, engagement, top pages, traffic sources, and a daily series. GA4 data lags ~1 day. Returns connected:false when GA4 isn't linked — point the user at Settings → Analytics.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
dateRange?"7d" | "28d" | "90d"Reporting window: 7d, 28d (default), or 90d. GSC data lags ~2 days, so the window ends about 2 days ago.

bing_performance

Search performance (Bing)read · sites:read

Bing Webmaster Tools performance for a site: total clicks, impressions, CTR, and average position, plus top queries, top pages, and a daily series. Bing data lags ~2 days. Returns connected:false when Bing isn't linked — point the user at Settings → Analytics.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
dateRange?"7d" | "28d" | "90d"Reporting window: 7d, 28d (default), or 90d. GSC data lags ~2 days, so the window ends about 2 days ago.

domain_overview

Domain overviewread · sites:read

One snapshot of the site: GSC clicks/impressions/avg position (if connected) and latest site-health score. Does not call DataForSEO. Pair with visibility_overview for AI scores.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

Indexing

Indexing Doctor reads plus a Google inspect (20/site/day).

indexing_summary

Indexing summaryread · sites:read

Google index coverage for a site's watched pages: counts per bucket (indexed, not_indexed, pending, blocked, error, excluded), pages due for re-inspection, last inspection time, IndexNow key status, and the sitemap URL. Use list_indexing_pages to drill into one bucket.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

list_indexing_pages

List indexing pagesread · sites:read

Lists the watched pages for a site with their index bucket, Google verdict, coverage state, and crawl/inspection timestamps, newest first. Filter by bucket (e.g. not_indexed) to find the pages that need fixing; paginate with the returned continueCursor.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
bucket?"pending" | "indexed" | "not_indexed" | "blocked" | "error" | "excluded"Filter to one bucket: pending (not inspected yet), indexed, not_indexed, blocked (robots/noindex), error (fetch failed), or excluded (canonical elsewhere). Omit for all pages.
limit?numberMax pages to return (default 50, max 100).
cursor?stringPagination cursor from a previous call's continueCursor.

request_index_inspect

Request index inspectionwrite · sites:write

Pulls one watched page's next Google inspection to now. Same cap as the dashboard: 20 manual inspects per site per day. Get pageId from list_indexing_pages.

ArgumentTypeNotes
pageIdstringindexing_pages id from list_indexing_pages (field id).

Articles & calendar (read)

List, read HTML, calendar, generation job status, keyword candidates.

list_articles

List articlesread · articles:read

Lists a site's articles (latest 100) with articleId, target keyword, status (queued/drafting/draft/published/failed…), current title, and published URL.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

get_article

Get articleread · articles:read

Fetches one article's full record plus its latest version summary (title, slug, version number). Includes scheduling and publish state.

ArgumentTypeNotes
articleIdstringArticle ID from list_articles.

get_article_content

Get article HTMLread · articles:read

Returns the current article body HTML plus title/slug/meta/status/schedule so an agent can edit or review without the dashboard.

ArgumentTypeNotes
articleIdstringArticle ID from list_articles or import_article.

list_calendar

List publish calendarread · articles:read

Lists reserved/failed scheduled publishes for a site (keyword, when, articleId). Use schedule_article / reschedule_article / cancel_article_schedule to change it.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

list_keyword_candidates

List keyword candidatesread · keywords:read

Researched keyword ideas for a site ranked by opportunity score, with search volume, difficulty, intent, and — when an article already targets the keyword — its articleId/status so you don't generate duplicates.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
limit?numberMax candidates to return (default 100, max 500).

get_job_status

Get job statusread · jobs:read

Status of a background job (article generation, publish, site analysis) with its latest run and any error. Poll this after generate_article; generation typically takes a few minutes — do not poll more than once every 30 seconds.

ArgumentTypeNotes
jobIdstringJob ID returned by a queuing tool such as generate_article.

Articles & calendar (write)

import_article is free (publish HTML only). generate_article spends a credit — confirm first.

import_article

Import custom articlewrite · articles:write

Imports a finished article you (or the agent) wrote. Does NOT consume an article credit and does NOT call the RankBull writer. contentHtml MUST be publish HTML — the same article.content_html the publisher webhook sends (p, h2–h6, ul/ol, a, img, table). Markdown is rejected. Creates a review-status article you can schedule or publish_now.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
keywordstringTarget keyword for this article (2+ characters).
contentHtmlstringPublish HTML body (not markdown). Same tags the webhook posts as article.content_html.
title?stringArticle title. Defaults to the keyword.
slug?stringURL slug. Optional.
metaTitle?stringSEO meta title. Optional.
metaDescription?stringSEO meta description. Optional.

save_article_html

Edit article HTMLwrite · articles:write

Replaces the body of a draft/review/scheduled/published article with publish HTML (same sanitizer as the webhook). Does not consume an article credit. Cannot edit an article that is still generating.

ArgumentTypeNotes
articleIdstringArticle ID from list_articles or import_article.
contentHtmlstringReplacement publish HTML (not markdown).
title?stringNew title. Omit to keep current.
slug?stringNew slug. Omit to keep current.
metaTitle?stringNew meta title. Omit to keep current.
metaDescription?stringNew meta description. Omit to keep current.

schedule_article

Schedule articlewrite · articles:write

Puts a review/draft article on the publish calendar at scheduledForIso. Same overlap checks as the dashboard. Does not consume an article credit. If duplicate_warning is returned, confirm with the user and retry with duplicateOverrideConfirmed=true.

ArgumentTypeNotes
articleIdstringArticle ID from list_articles or import_article.
scheduledForIsostringISO-8601 datetime in the future, e.g. 2026-09-12T15:00:00.000Z
duplicateOverrideConfirmed?booleanSet true only after the user confirms publishing a near-duplicate.

reschedule_article

Reschedule articlewrite · articles:write

Moves an already-scheduled article to a new ISO datetime. Fails if nothing is scheduled or it is currently dispatching.

ArgumentTypeNotes
articleIdstringArticle ID from list_articles or import_article.
scheduledForIsostringISO-8601 datetime in the future, e.g. 2026-09-12T15:00:00.000Z

cancel_article_schedule

Cancel scheduled publishwrite · articles:write

Removes the article from the calendar and returns it to review. Does not delete the article.

ArgumentTypeNotes
articleIdstringArticle ID from list_articles or import_article.

publish_article

Publish article nowwrite · articles:write

Publishes a draft/review article immediately through the site's connected destination (same job as the dashboard Publish button). Does not consume an extra article credit. Poll get_job_status with the returned jobId.

ArgumentTypeNotes
articleIdstringArticle ID from list_articles or import_article.
forcePublish?booleanSet true only if the user confirms publishing a flagged duplicate.

generate_article

Generate articlewrite · articles:write

SPENDS MONEY: creates an article for the keyword and queues AI generation. This consumes one article credit from the workspace's plan and real LLM budget — always confirm with the user before calling, and never call it in a loop. Check list_articles/list_keyword_candidates first to avoid duplicate keywords. Generation quality mode comes from the site's settings. Returns articleId + jobId; poll get_job_status for progress.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
keywordstringTarget keyword/topic for the article (2+ characters).
maxBudgetUsd?numberOptional hard cap on LLM spend for this generation in USD. Omit to use the plan default.

Keywords

Research reads never call DataForSEO. add_target_keywords is hand-typed only. run_keyword_ideas spends one ideas credit.

list_keywords

List keyword researchread · keywords:read

Read-only dump of this site's keyword research (candidates with volume, difficulty, opportunity, intent, linked article). Does NOT trigger DataForSEO. For keywords you typed in yourself, use list_target_keywords.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

list_keyword_clusters

List keyword clustersread · keywords:read

Read-only topic clusters from prior keyword research. Does NOT trigger DataForSEO.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

list_target_keywords

List custom target keywordsread · keywords:read

Keywords you (or an agent) added by hand. Not a DataForSEO run.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

add_target_keywords

Add custom keywordswrite · keywords:write

Adds keywords you supply to the site's target list. Does NOT call DataForSEO and does not consume keyword-research credits. Duplicates are skipped.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
keywordsstring[]One or more keywords to track (max 50 per call).

remove_target_keyword

Remove custom keywordwrite · keywords:write

Removes one hand-added target keyword by keywordId from list_target_keywords.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
keywordIdstringtarget_keywords id from list_target_keywords.

list_ranked_keywords

List ranked keywords (GSC)read · sites:read

Queries this site already ranks for in Google Search Console (clicks, impressions, CTR, position). Free. GSC lags ~2 days. If connected:false, tell the user to connect Search Console in Settings → Analytics.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

list_keyword_ideas

List last keyword ideas runread · keywords:read

Read the latest keyword-ideas result. Does not call DataForSEO. Use run_keyword_ideas to spend a credit and fetch new ideas.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

run_keyword_ideas

Run keyword ideaswrite · keywords:write

Spends one keyword-ideas credit (hosted: 1/2/4 per month on Starter/Growth/Scale) and calls DataForSEO once. Confirm with the user before calling. Seed with a topic or brand term. Poll list_keyword_ideas until status is ready or failed.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
seedstringSeed keyword or topic (min 2 characters).

Prompts

Add, pause, or archive. Same plan caps as the UI.

add_prompt

Add tracking promptwrite · sites:write

Adds one prompt to a monitor. Enforces the plan's per-site prompt cap (same error as the dashboard). Default status is active.

ArgumentTypeNotes
monitorIdstringMonitor ID from list_monitors or list_prompts.
textstringThe question to ask AI engines (8+ characters).
intent?"informational" | "commercial" | "transactional" | "navigational" | "jtbd"Search intent. Optional.
status?"active" | "paused" | "archived"Defaults to active. Archived does not count toward the cap.

set_prompt_status

Pause, activate, or archive a promptwrite · sites:write

Sets one prompt to active, paused, or archived. Un-archiving an archived prompt re-checks the plan prompt cap.

ArgumentTypeNotes
promptIdstringPrompt ID from list_prompts.
status"active" | "paused" | "archived"New status.

Automation

Pause and resume use the same policy as the dashboard.

get_automation_policy

Get automation policyread · automation:read

Current automation policy for the site (mode, enabled, cadence, autoPause).

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

pause_automation

Pause automationwrite · automation:write

Pauses site automation (same as the dashboard pause). Generation/publish robots stop until resume_automation.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.
reason?stringOptional reason stored on the policy.

resume_automation

Resume automationwrite · automation:write

Clears auto-pause so automation can run again.

ArgumentTypeNotes
siteIdstringSite ID from list_sites or whoami.

Notes

  • Available on all hosted plans. Self-hosted licence support is coming.
  • Requests are rate-limited per key; usage appears in the same API logs as REST traffic.
  • Revoking the key in Settings cuts the agent off immediately.