Server data from the Official MCP Registry
Plan SEO keywords, write and publish articles to your site, read Search Console and backlink data
About
Plan SEO keywords, write and publish articles to your site, read Search Console and backlink data
Remote endpoints: streamable-http: https://www.outrank.so/api/mcp
Security Report
The outrank-cli MCP server is an agent CLI for the Outrank SEO API, exposing commands as MCP tools authenticated via an API key from env vars or a local config file with no hardcoded secrets visible in the reviewed files. Permissions (network_http, env_vars, file_read for config and image upload context) match its stated purpose, and the remaining code is largely documentation-driven tool notes; the truncated source limits full verification, so only minor code quality and scope observations are raised. Supply chain analysis found 5 known vulnerabilities in dependencies (0 critical, 2 high severity). Package verification found 1 issue.
6 files analyzed · 9 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
Permissions Required
This plugin requests these system permissions. Most are normal for its category.
What You'll Need
Set these up before or after installing:
Environment variable: OUTRANK_API_KEY
How to Install & Connect
Available as Local & Remote
This plugin can run on your machine or connect to a hosted endpoint. during install.
Documentation
View on GitHubFrom the project's GitHub README.
Outrank CLI
Agent-first CLI for the Outrank agent API, with a built-in MCP server for Claude Code, Cursor and other MCP clients.
Install
Requires Node.js 18+. Works on macOS, Linux, and Windows.
npm install -g outrank-cli
outrank-cli --help
Get an API key
- Sign in to your Outrank account at https://www.outrank.so.
- Open Settings → API keys: https://www.outrank.so/dashboard/settings/api-keys.
- Click Create key, give it a name, and copy the
outr_live_...value. The key is shown only once — store it somewhere safe. - Revoke a key from the same page if it ever leaks. Generate a fresh one and re-run
auth login.
You can also rotate keys at any time; each key is independent and can be revoked without affecting the others.
Current scope
This repo currently targets the agent endpoints that already exist in outrank:
mcp(the stdio MCP server that exposes the commands below as tools, see MCP server)auth login|whoami|status|profiles|logoutproducts list|get|create|update|pause|resumeproducts integrations providers|prepare|connect|poll|validate|list|create|get|update|test|deleteproducts integrations notion databases|schemaproducts integrations framer collections|fieldsproducts integrations webflow sites|collections|fields|itemsproducts output-settings get|updatefor product article settingsproducts target-audiences list|replaceproducts competitors list|replaceproducts gsc status|connect|poll|reconnect|disconnect|accounts|properties|set-property|performance|search-analytics|inspect-url|cannibalizationproducts linking sources get|updateproducts linking detectproducts linking target-config get|updateproducts linking targets list|add-manual|upsert|clear-customizations|deleteproducts backlinks get|update|credits|earned|unverified|check-removal|reverify|subscription|subscribe-quotekeywords list|get|export|generation-status|add|update|suggest|generate|bulk-reschedule|delete|bulk-deletearticles list|create|get|get-content|update|update-content|replace|bulk-replace|upload-image|upload-featured-image|publish|sync|retry-publish|delete|precreate|generateproducts blog ...for a hosted Outrank Blog:posts list|create|get|update|delete|get-content|update-content|publish|unpublish|sync,design get|patch|update|publish|discard, settings, pages, categories, authors, domain, redirects, snippets, subscribers, webhooks, preview and analyticsimprovements settings get|updateimprovements analyzeimprovements candidates list|brief|edit-brief|scheduleimprovements tasks list|reschedule|cancel|edit-brief|executeimprovements executions list|get|decisions|pushmarketplace seller status|onboard|eligibility|settings|integrations|stripe|complete-onboarding|placements|earnings|content-historymarketplace notifications list|mark-readmarketplace buyer status|billing-status|subscription|subscribe-quote|checkout|change-plan|target-pages|participation|placements|article|creditsai-cited-lists status|overview|lists|outreach|offers|wins|questions|settings|mailbox|top-up-consent|entry|setup|citationsfor AI-Cited Lists (Backlinks Enterprise)subscription statususage statsbilling portal-urlbilling purchase-products quote|buy
The broader roadmap from the internal implementation plan is larger than the live backend surface. This CLI is structured so new groups can be added cleanly as the server catches up.
Auth
The CLI reads credentials in this order of precedence:
--api-key <key>and--base-url <url>on the command line (highest priority, per-call)- A profile selected with
--profile <name>orOUTRANK_PROFILE. A selected profile is used as-is:OUTRANK_API_KEYandOUTRANK_BASE_URLare ignored, and a profile without a stored key fails withCLI_AUTH_REQUIREDinstead of silently using another key OUTRANK_API_KEYandOUTRANK_BASE_URLenvironment variables- The default profile in
~/.outrank/config.json, populated byoutrank-cli auth login <api-key>(lowest priority, persistent)
auth status shows which profile is active and where its key and base URL came from (flag, env, profile, or profile (env ignored) when an environment variable was set but a higher-priority source won).
Pick one. For interactive use on your own machine, auth login is simplest. For CI / ephemeral environments, prefer the env var.
# Sign in through the browser, so no key is ever pasted (also what an AI assistant should use)
outrank-cli auth login --browser
# Or store an API key once
outrank-cli auth login outr_live_xxx
outrank-cli auth status # confirms the key is stored
outrank-cli auth whoami # round-trips it against the server
# OR per-shell env var (no config file written)
export OUTRANK_API_KEY="outr_live_xxx" # macOS / Linux (bash, zsh)
outrank-cli auth whoami
# OR per-call (useful in scripts)
outrank-cli auth whoami --api-key outr_live_xxx
On Windows PowerShell, set the env var with $env:OUTRANK_API_KEY = "outr_live_xxx". On Windows cmd.exe, use set OUTRANK_API_KEY=outr_live_xxx.
Sign out / rotate:
outrank-cli auth logout # clears apiKey from the default profile in ~/.outrank/config.json
Profiles (one per organization)
API keys are scoped to one organization. Store one profile per organization and switch with --profile:
outrank-cli auth login outr_live_xxx --profile acme # the first stored key becomes the default profile
outrank-cli auth login outr_live_yyy --profile globex # a second profile; the default does not change
outrank-cli auth login outr_live_yyy --profile globex --default # ...unless you ask for it
outrank-cli auth profiles # lists profiles with redacted keys, marks the default
outrank-cli products list --profile globex # per call
export OUTRANK_PROFILE=globex # per shell
outrank-cli auth logout --profile globex # clears only that profile's key
auth login and auth logout without --profile act on the default profile. auth login verifies against and stores the base URL it resolves with the same precedence as every other command: --base-url, else OUTRANK_BASE_URL (ignored when a profile is selected), else the profile's stored value, else the default. Re-running auth login for a stored profile therefore keeps that profile's base URL. The config file keeps the default profile mirrored in the top-level apiKey / baseUrl keys, so an older outrank-cli (0.5.x) on the same machine keeps working; it only ever sees the default profile. A config file that cannot be parsed, or that contains a profile name the CLI does not accept, fails every command with CLI_CONFIG_UNREADABLE (the path is in error.details.config_path), and auth login / auth logout never overwrite it. A failed save is CLI_CONFIG_UNWRITABLE and nothing is stored. auth status and auth profiles still work when the selected profile does not exist, so you can always inspect what is stored.
MCP server
outrank-cli mcp starts a Model Context Protocol server on stdio, so Claude Code, Cursor and other MCP clients can call Outrank directly. The server runs on the same command layer as the CLI: every command except auth login, auth logout and auth profiles is a tool, named after the command with underscores (products integrations list → products_integrations_list), and sends exactly the same request.
Requirements: Node.js 18+ (check with node --version), an Outrank API key from https://www.outrank.so/dashboard/settings/api-keys, and an organization on the current Outrank app version. The same guide is on the web at https://www.outrank.so/docs/mcp.
Remote server
Outrank also hosts the same tools at https://www.outrank.so/api/mcp (Streamable HTTP), for clients that connect to a URL instead of starting a command, such as Claude, ChatGPT or Cursor. Sign in with OAuth when the client asks, or send an API key as Authorization: Bearer outr_live_....
- Claude Code plugin:
/plugin marketplace add Outrank-SAS/outrank-cli, then/plugin install outrank@outrank. - Gemini CLI:
gemini extensions install https://github.com/Outrank-SAS/outrank-cli. - Other clients: see llms-install.md. The hosted server always uses the
autotoolsets, has no read-only switch and takes images as base64 only: it never reads a file. It is built fromcreateRemoteMcpServerinsrc/adapters/mcp/remote.js, which takes the key, the Outrank origin and, optionally, the organization'sauth whoamienvelope so it does not ask for it again.
Claude Code
Run this in the project folder (macOS, Linux, WSL, or the Windows Command Prompt):
claude mcp add outrank --env OUTRANK_API_KEY=outr_live_xxx -- npx -y outrank-cli@latest mcp
If the server does not start on native Windows, use the cmd /c form:
claude mcp add outrank --env OUTRANK_API_KEY=outr_live_xxx -- cmd /c npx -y outrank-cli@latest mcp
In PowerShell, call claude.exe instead of claude (claude.cmd when Claude Code was installed with npm), so that the -- separator is kept.
Check the connection with claude mcp get outrank, then start a new Claude Code session. That command prints the stored key, so do not paste its output anywhere.
To share the server with a team, commit a .mcp.json that takes the key from each developer's environment, so no key lands in git:
{
"mcpServers": {
"outrank": {
"command": "npx",
"args": ["-y", "outrank-cli@latest", "mcp"],
"env": { "OUTRANK_API_KEY": "${OUTRANK_API_KEY}" }
}
}
}
Each developer then sets the variable once:
# macOS, Linux: add this line to ~/.zshrc or ~/.bashrc
export OUTRANK_API_KEY=outr_live_xxx
# Windows, from the Command Prompt or PowerShell
setx OUTRANK_API_KEY outr_live_xxx
The variable reaches new terminals only, so open a new one before starting Claude Code.
Cursor
Add the server to ~/.cursor/mcp.json, the file for all projects (on Windows: %USERPROFILE%\.cursor\mcp.json). It is in your home folder, outside any repository, so the key in it cannot be committed by accident:
{
"mcpServers": {
"outrank": {
"command": "npx",
"args": ["-y", "outrank-cli@latest", "mcp"],
"env": { "OUTRANK_API_KEY": "outr_live_xxx" }
}
}
}
If the server does not start on native Windows, use "command": "cmd" and "args": ["/c", "npx", "-y", "outrank-cli@latest", "mcp"].
For one project or a team, put the server in .cursor/mcp.json inside the project and take the key from the environment, so the file can be committed without it:
{
"mcpServers": {
"outrank": {
"command": "npx",
"args": ["-y", "outrank-cli@latest", "mcp"],
"env": { "OUTRANK_API_KEY": "${env:OUTRANK_API_KEY}" }
}
}
}
Set OUTRANK_API_KEY as shown in the Claude Code section, then quit and reopen Cursor. A project server may first have to be switched on in the MCP section of the Cursor settings; a server in the all-projects file starts on its own.
Never commit a file that contains the key. A key written into a project file can end up in git with the next commit: keep the key in the all-projects file or in the environment. If a key was committed, revoke it at https://www.outrank.so/dashboard/settings/api-keys and create a new one. If Cursor does not see the variable, which can happen on macOS when it is started from the Dock, every call returns CLI_AUTH_REQUIRED: use the all-projects file instead.
Other MCP clients
Any client that can start a local MCP server (the stdio transport) works. Give it these three values; many clients read the same JSON as the Cursor example above.
- Command:
npx - Arguments:
-y outrank-cli@latest mcp - Environment variable:
OUTRANK_API_KEYset to your API key
The examples use the latest tag, so the server picks up each new release the next time the client starts it. To stay on one version, replace latest with an exact version number from the npm page. If you install the package globally (npm install -g outrank-cli), the command is outrank-cli mcp, or the outrank-mcp binary.
Options
| Option | Environment variable | Meaning |
|---|---|---|
--toolsets <names|all|auto> | OUTRANK_MCP_TOOLSETS | Which toolsets to expose. Default auto. |
--read-only | OUTRANK_MCP_READ_ONLY=1 | Expose only tools that change nothing. |
--profile <name> | OUTRANK_PROFILE | Use a stored profile instead of OUTRANK_API_KEY. |
--upload-dir <directory> | OUTRANK_MCP_UPLOAD_DIR | Directory image uploads may be read from. Default: the directory the server starts in. A filesystem root or your home directory is refused: uploads by path are then switched off until you name a narrower directory. |
OUTRANK_MCP_DEBUG=1 | Log each tool call to stderr. Headers are never logged and secrets are redacted. |
--api-key, --base-url and --allow-custom-base-url are not accepted by mcp. A command line the server cannot use (an unknown option, a mistyped toolset name) does not stop it and does not quietly change what it does: it starts, and every tool call returns the problem so the assistant can tell you what to fix.
Toolsets
Tools are grouped into toolsets: core, integrations, gsc, linking, backlinks, keywords, articles, improvements, marketplace-seller, marketplace-buyer, billing, blog, ai-cited-lists.
With the default auto, the server asks Outrank at startup which toolsets the organization can use (entitlements in auth whoami) and lists only those, so a marketplace buyer without an Articles subscription does not see dozens of tools that would only return errors. A toolset the organization can only read (for example after a subscription ended) lists its read tools only. A toolset Outrank could not verify (unverified_toolsets) stays listed. The tools that start a new area (marketplace seller and buyer setup, backlink subscription quotes, the billing portal link, the product-slot quote and the AI-Cited Lists status) are always listed. Typical sizes: 33 tools for a new organization, 245 with everything enabled. ai-cited-lists is listed only for organizations with a product on the Backlinks Enterprise plan.
auto is a noise filter, not a permission system: Outrank checks access on every request whatever the tool list says. If the lookup fails or takes longer than three seconds, the server starts with core plus the setup tools, says so in its instructions, and refreshes the list as soon as a lookup succeeds. After a tool that changes what the organization can use succeeds (products_create, products_pause, products_resume, billing_purchase_products_buy, marketplace_buyer_checkout, marketplace_buyer_change_plan and the seller onboarding tools), the server re-reads the organization in the background and tells the client when the tool list changed; auth_whoami refreshes it on demand. A service the human buys in the dashboard shows up on the next auth_whoami or restart.
When a tool you need is missing, either the organization does not have that service yet, or the list was narrowed by configuration. --toolsets all lists everything; --toolsets core,keywords,articles lists exactly those toolsets and nothing else, so include core unless you already know your product ids. --read-only and an explicit --toolsets list are enforced when a tool is called, not only when tools are listed.
--read-only means nothing in Outrank or on your site changes. A few read tools still send data to Outrank to get an answer: price quotes, checks of third-party credentials (products_integrations_validate, the Webflow and Framer discovery tools) and keyword metric lookups.
Organizations and profiles
An API key belongs to one organization, and one server instance works on one organization. Every tool result repeats it under organization (id, user_email, profile, base_url), so the assistant cannot mix organizations up silently.
Besides tools, the server offers five prompts for clients that support them — onboard_product, plan_keywords (product_id, optional days), improve_declining_articles (product_id), setup_ai_cited_lists (product_id) and setup_publishing_integration (product_id, optional provider) — each a step-by-step brief naming the tools to call, listed only while its toolset is on and never in read-only mode; and one resource, outrank://whoami, a JSON document with the organization, the known entitlements and the toolsets in use, which a client can read without spending a request.
Outrank writes its agent_guidance for the HTTP API, naming endpoints such as GET /api/agent/v1/products/<id>. The server rewrites those references into tool references the assistant can call — products_get {"product_id":"<id>"} — using the registry that maps every tool to its endpoint. Query values become typed arguments (?limit=5 → {"limit":5}). An endpoint it cannot map is passed through unchanged, and so is one whose values the tool would refuse (an unknown filter, a provider that tool does not take) or whose query or path continues with text the rewrite cannot read (?email=a@b.com, ?q=%ZZ). The purchase endpoint is named as its two steps in order: billing_purchase_products_quote, then billing_purchase_products_buy. A rewritten reference can name a tool the server configuration leaves out; calling it returns an error saying which toolset to add. The guidance written by the CLI itself already names tools on this surface.
For several organizations, store one profile per organization with the CLI and register one server per profile:
outrank-cli auth login outr_live_xxx --profile acme
outrank-cli auth login outr_live_yyy --profile globex
claude mcp add outrank-acme -- npx -y outrank-cli@latest mcp --profile acme
claude mcp add outrank-globex -- npx -y outrank-cli@latest mcp --profile globex
A selected profile ignores OUTRANK_API_KEY, so both servers stay on their own organization even when that variable is exported in your shell. In PowerShell, call claude.exe in the last two commands, as described under Claude Code.
Security
- The key never passes through the assistant. No tool takes a key, a base URL or a profile as an argument,
auth loginis not a tool, andauth_statusshows neither the key nor the config path. Set the key in the client configuration, in the environment or withoutrank-cli auth loginin a terminal; do not paste it into a chat and do not put it in a file that is committed. - The key is only sent to Outrank. The server accepts
www.outrank.soandoutrank.so. Any other base URL is accepted only when the key and the URL come from the same stored profile, which you create yourself in a terminal (outrank-cli auth login <key> --profile staging --base-url <url> --allow-custom-base-url, thenmcp --profile staging). Environment variables cannot unlock another host, so a.mcp.jsonfrom a repository you do not control cannot redirect your key by settingOUTRANK_BASE_URL. Redirects are never followed. - Tools that cost money or cannot be undone are flagged (
destructiveHint), so the client asks before running them. A client set to approve tools automatically removes that safeguard. - Purchases take two deliberate steps.
billing_purchase_products_buycharges the stored card: it requires the amount from a precedingbilling_purchase_products_quoteand anidempotency_key. If that call times out, it must be retried with the same key and arguments: Outrank records the outcome per key and returns it again (data.replayedistrue), while a new key can charge twice.marketplace_buyer_change_plancancels immediately forcancel_subscriptionandcancel_scheduled, and is refused without aconfirm_subscription_id, which the assistant is told to read frommarketplace_buyer_subscription. These fields stop a single careless call; they are values the assistant can obtain itself, so they do not replace the approval prompt of your client. - Uploads are restricted. An image must be inside the upload directory (symlinks are resolved first), at most 5 MB, and its bytes must match its
.jpg,.jpeg,.png,.webpor.gifextension. A path outside the directory is refused before the file system is touched, so nothing else on disk can be sent or probed. Point--upload-dirat a folder that holds only the images you want to publish. - A write that did not get an answer is never reported as safe to repeat. When a timeout or a dropped connection hits a tool that changes something, the result says the outcome is unknown and to check first; for publishing and generation tools it names the tool to poll.
- Only register this server from a configuration you trust. Whoever controls the server's command line and environment controls the process: the checks above protect your key against a redirected base URL, not against a configuration that replaces the program or its runtime options.
- Third-party tokens are visible in the conversation. Connecting Webflow, Framer, Ghost, Shopify, Wix or a webhook means passing that platform's token as a tool argument. Use a scoped token you can rotate.
- Marketplace text is untrusted. Notifications, placement briefs and placement articles are written by other organizations. The MCP server returns each such field as
{ "untrusted_counterparty_text": "…" }instead of a plain string (notification titles and bodies; the keyword, anchor text, target URL, article title and publish error of a hosted placement; the title, keyword, meta description, slug, instructions, publish error and summary of the articles inmarketplace_seller_content_history; the article title, URL, image URL and seller site of a bought placement; the seller site and article title in the credit history; and the placement article itself: title, content, image URL, meta description, slug, keyword, section heading and seller site), so an assistant can tell it apart from Outrank's own fields, and tells the assistant to treat it as data, not instructions. The same wrapping covers the AI-Cited Lists tools: list titles, URLs and hosts, entry names, owner contacts and replies, ChatGPT answer excerpts and source URLs, and cited page titles, URLs and domains inai_cited_lists_overview,ai_cited_lists_lists_list,ai_cited_lists_outreach,ai_cited_lists_offers_get,ai_cited_lists_wins_getandai_cited_lists_citations_summary. The CLI returns the plain strings. Thearticles_*tools return a hosted marketplace article next to the organization's own articles: each article carriesis_marketplace_placement, and when it is notfalseits title, keyword, meta description, slug, instructions, publish error, image URL, summary, body and replace excerpts are wrapped the same way, while the organization's own articles stay plain. This covers everyarticles_*tool that returns article text,articles_deleteincluded. Forarticles_retry_publish,articles_generate,articles_precreate,articles_upload_imageandarticles_upload_featured_imagethe flag sits at the top of the result and also decides the fields beside the article: the publish error of a failed retry, the keyword, and the alt text, file name and address of an uploaded image. A result without the flag is wrapped. When a tool takes such text back (articles_update,articles_update_content), pass the plain string, not the wrapped object; the tool names the field if it gets the object. - Rate limits are shared. The server uses the same per-minute and per-day budget as every other client of that key. It paces its own requests to Outrank's limit of 120 per minute, lowers that budget when a response reports fewer remaining requests, and waits out a
Retry-After, so a client that fans out many tool calls at once gets them queued instead of rejected; a queued call still counts against the client's own tool timeout.
Troubleshooting
- The server does not start. Run the same command in a terminal:
npx -y outrank-cli@latest mcp --helpmust print usage. Check that Node.js 18 or newer is installed (node --version). On native Windows, if the client cannot startnpxdirectly, use thecmd /c npx …form. - The command works in a terminal, but the client cannot find
npxornode(macOS, Linux). A client started from the Dock or a desktop menu does not always get thePATHof your shell, so a Node.js installed with nvm, fnm or volta can be invisible to it. Runwhich npxin a terminal, use that full path as the command, and add its folder toPATHin theenvblock of the server entry, for example"PATH": "/home/you/.nvm/versions/node/v22.0.0/bin:/usr/bin:/bin". The full path alone is not enough:npxstartsnodethroughPATH. - PowerShell reports
unknown option '-y'onclaude mcp add. PowerShell drops the--separator whenclaudeis a script or a function instead of the program itself (an npm-installed Claude Code, or a wrapper in your profile). Callclaude.exe mcp add …(claude.cmdwhen Claude Code was installed with npm) or run the command from the Command Prompt. - The first start is slow, or the server fails to connect.
npxdownloads the package the first time and contacts the npm registry on every start, so an empty cache or a slow registry can push startup past the client's limit. In Claude Code, run/mcp reconnect allto try again;MCP_TIMEOUT(milliseconds) raises the startup limit. To take the registry out of the startup path, install the package globally (npm install -g outrank-cli@latest) and useoutrank-cli mcpas the command. - Every call returns
CLI_AUTH_REQUIRED. The server has no key. AddOUTRANK_API_KEYto the server entry, or select a stored profile with--profile. - Only a few tools are listed. Read the server instructions in the client: they name the toolsets that are off and why. See Toolsets.
- A long call times out.
improvements_analyze,improvements_candidates_brief,improvements_tasks_execute,improvements_executions_push,articles_generate,articles_precreate,articles_retry_publish,keywords_generateandai_cited_lists_entry_generatecan run for minutes. When the call does not finish, the result isCLI_OPERATION_MAY_STILL_BE_RUNNINGand names the tool to poll: the work continues on the server, so poll instead of repeating the call. The server sends progress notifications while such a call runs, but clients do not have to extend their own limit because of them. Claude Code does not cut a tool call off by default:MCP_TOOL_TIMEOUT(milliseconds) is about 28 hours when unset, and atimeoutfield on the server's.mcp.jsonentry sets a hard limit for that server which progress notifications do not extend. Cursor (measured on 3.22) stops a call after 120 seconds without a progress notification and keeps waiting while they arrive, so long calls get through there. Other clients may stop after a fixed time whatever the server does; the poll tools are the way through. - The client warns about too many tools. Some clients cap or warn above a few dozen tools. Narrow the list with
--toolsets, for example--toolsets core,keywords,articles. - Staging or a local deployment. Store a profile for it in a terminal (see Security) and start the server with
--profile <name>. - See what the server does. Set
OUTRANK_MCP_DEBUG=1; one line per tool call is written to stderr, which the client shows in its MCP logs.
Tools
Tools that take a JSON body describe its fields in their description; products_create, products_update, products_output_settings_update, keywords_add, articles_update, articles_update_content, improvements_settings_update and ai_cited_lists_settings_update also declare them in the input schema (types, allowed values, and for products_create the required fields), so a body with a missing required field or a wrong type is refused before any request. Unknown keys are passed through; Outrank decides about them. The same checks apply to --json on the CLI.
Generated from the command registry with npm run docs:tools. The registry is checked against the Outrank server's route list in tests/fixtures/agentApiSurface.json, refreshed from a checkout of the Outrank app with npm run surface:extract -- <path-to-outrank-repo>: a server route without a tool, a tool without a server route, a guidance sentence naming an endpoint the server cannot map to a tool, or a rewritten argument the named tool would refuse fails the tests. The fixture records the server commit and, as sourceDirty, whether that checkout had uncommitted changes in the files it reads; extract again from a clean checkout before a release. To see whether the fixture is stale, run node scripts/extractAgentApiSurface.js --check <path-to-outrank-repo>, or run the tests with OUTRANK_SERVER_DIR=<path-to-outrank-repo>: both list the routes and guidance mentions that differ, and without the variable that one test is skipped. Kinds: read changes nothing; write changes Outrank or the connected site; destructive deletes or cannot be undone; money changes what the organization pays; local makes no request. Tools marked ★ are always listed in auto mode.
246 tools.
| Tool | CLI command | Kind | Toolset | What it does |
|---|---|---|---|---|
auth_whoami | auth whoami | read | core | Verify auth and return the current user and organization details. |
auth_status | auth status | local | core | Show the resolved profile, auth source and base-url configuration (the key itself is never shown). |
usage_stats | usage stats | read | core | Return current usage and quota metrics for articles, backlinks, free tools, and product slots. |
subscription_status | subscription status | read | core | Return the current subscription, plan, trial, quota, and add-on status. |
billing_portal_url ★ | billing portal-url | read | billing | Return a Stripe customer-portal link for the human to open in a browser. |
billing_purchase_products_quote ★ | billing purchase-products quote | read | billing | Request pricing for additional product slots without authorizing the charge. |
billing_purchase_products_buy | billing purchase-products buy | money | billing | Buy additional product slots at the quoted recurring total. |
keywords_list | keywords list | read | keywords | List keywords for a product with optional filters and pagination. |
keywords_get | keywords get | read | keywords | Get one keyword by id. |
keywords_export | keywords export | read | keywords | Export the keyword plan for a product. |
keywords_generation_status | keywords generation-status | read | keywords | Show keyword generation status and scheduler slot capacity for a product. |
keywords_add | keywords add | write | keywords | Add a keyword to a product from a JSON body. |
keywords_update | keywords update | write | keywords | Update a keyword (instructions, schedule, quality questions) from a JSON body. |
keywords_suggest | keywords suggest | read | keywords | Suggest keywords for a product from a seed keyword or a theme. |
keywords_generate | keywords generate | write | keywords | Generate keywords for a product from competitors and/or target audiences. |
keywords_bulk_process | keywords bulk-process | read | keywords | Bulk-process a list of keywords for a product from a JSON body. |
keywords_bulk_reschedule | keywords bulk-reschedule | write | keywords | Reschedule several keywords from a JSON body. |
keywords_delete | keywords delete | destructive | keywords | Delete one keyword. |
keywords_bulk_delete | keywords bulk-delete | destructive | keywords | Delete several keywords from a JSON body of ids. |
articles_list | articles list | read | articles | List articles with optional filters, sorting and pagination. |
articles_create | articles create | write | articles | Create an article from your own content and optionally publish it to the connected CMS. |
articles_get | articles get | read | articles | Get article metadata by id. |
articles_get_content | articles get-content | read | articles | Get the article body as markdown or HTML. |
articles_update | articles update | write | articles | Update article metadata from a JSON body. |
articles_update_content | articles update-content | write | articles | Replace the article body from a JSON body. |
articles_replace | articles replace | write | articles | Find and replace text inside one article. |
articles_bulk_replace | articles bulk-replace | write | articles | Find and replace text across several articles from a JSON body. |
articles_upload_image | articles upload-image | write | articles | Upload an image for an article or a keyword. |
articles_upload_featured_image | articles upload-featured-image | write | articles | Upload the featured image of an article. |
articles_publish | articles publish | write | articles | Publish an article to the product's connected CMS for the first time. |
articles_sync | articles sync | write | articles | Push the edits of a published article to the post already in the connected CMS. |
articles_retry_publish | articles retry-publish | write | articles | Retry publishing an article to its integration. |
articles_delete | articles delete | destructive | articles | Delete an article. |
articles_precreate | articles precreate | write | articles | Pre-create the article for an eligible future scheduled keyword. |
articles_generate | articles generate | write | articles | Generate the article for a keyword scheduled for today. |
improvements_settings_get | improvements settings get | read | improvements | Get the article improvement settings of a product. |
improvements_settings_update | improvements settings update | write | improvements | Update the article improvement settings of a product from a JSON body. |
improvements_analyze | improvements analyze | write | improvements | Run improvement opportunity discovery for a product (multi-minute). |
improvements_candidates_list | improvements candidates list | read | improvements | List improvement candidates for a product. |
improvements_candidates_brief | improvements candidates brief | write | improvements | Generate the improvement brief for a candidate (multi-minute). |
improvements_candidates_edit_brief | improvements candidates edit-brief | write | improvements | Edit the improvement brief of a candidate from a JSON body. |
improvements_candidates_schedule | improvements candidates schedule | write | improvements | Schedule an improvement task for a candidate. |
improvements_tasks_list | improvements tasks list | read | improvements | List scheduled improvement tasks for a product. |
improvements_tasks_reschedule | improvements tasks reschedule | write | improvements | Reschedule an improvement task. |
improvements_tasks_cancel | improvements tasks cancel | destructive | improvements | Cancel an improvement task. |
improvements_tasks_edit_brief | improvements tasks edit-brief | write | improvements | Edit the brief of an improvement task from a JSON body. |
improvements_tasks_execute | improvements tasks execute | write | improvements | Execute an improvement task now (multi-minute). |
improvements_executions_list | improvements executions list | read | improvements | List improvement executions for a product. |
improvements_executions_get | improvements executions get | read | improvements | Get one improvement execution with its proposed changes. |
improvements_executions_decisions | improvements executions decisions | write | improvements | Record review decisions for an execution from a JSON body. |
improvements_executions_push | improvements executions push | write | improvements | Push an execution to the CMS, optionally with decisions in a JSON body. |
products_list | products list | read | core | List products with optional status filter and cursor pagination. |
products_get | products get | read | core | Get one product. |
products_create | products create | write | core | Create a product from a JSON body. The server queues an initial keyword plan. |
products_update | products update | write | core | Update a product from a JSON body. |
products_pause | products pause | destructive | core | Pause a product and free its slot. |
products_resume | products resume | write | core | Resume a paused product. |
products_integrations_providers | products integrations providers | read | integrations | List known integration providers with their auth method and required fields. |
products_integrations_prepare | products integrations prepare | write | integrations | Prepare a provider integration for a product (e.g. generate the WordPress plugin token). |
products_integrations_connect | products integrations connect | write | integrations | Start an OAuth connect flow for a provider and return the connect URL. |
products_integrations_poll | products integrations poll | read | integrations | Poll an OAuth connect attempt until the handoff completes. |
products_integrations_notion_databases | products integrations notion databases | read | integrations | List the Notion databases accessible to a connected integration. |
products_integrations_notion_schema | products integrations notion schema | read | integrations | Inspect the schema of one Notion database. |
products_integrations_webflow_sites | products integrations webflow sites | read | integrations | Discover webflow sites with the credentials in the JSON body. |
products_integrations_webflow_collections | products integrations webflow collections | read | integrations | Discover webflow collections with the credentials in the JSON body. |
products_integrations_webflow_fields | products integrations webflow fields | read | integrations | Discover webflow fields with the credentials in the JSON body. |
products_integrations_webflow_items | products integrations webflow items | read | integrations | Discover webflow items with the credentials in the JSON body. |
products_integrations_framer_collections | products integrations framer collections | read | integrations | Discover framer collections with the credentials in the JSON body. |
products_integrations_framer_fields | products integrations framer fields | read | integrations | Discover framer fields with the credentials in the JSON body. |
products_integrations_validate | products integrations validate | read | integrations | Validate provider credentials from a JSON body without saving them. |
products_integrations_list | products integrations list | read | integrations | List the publishing integrations of a product. |
products_integrations_create | products integrations create | write | integrations | Create a publishing integration for a product from a JSON body. |
products_integrations_get | products integrations get | read | integrations | Get one integration of a product. |
products_integrations_update | products integrations update | write | integrations | Update one integrati |
Documentation truncated — see the full README on GitHub.
Reviews
No reviews yet
Be the first to review this server!
More Developer Tools MCP Servers
Rea
Freeby Morluto · Developer Tools
Reverse engineer anything from your terminal or agent with one CLI and MCP server.
Paperclip
Freeby Paperclipai · Developer Tools
Trending hip-hop artist momentum scores across four cultural dimensions.
Fetch
Freeby Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
Git
Freeby Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
Toleno
Freeby Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
MCP Marketplace
Freeby mcp-marketplace · Developer Tools
Search and install MCP servers from inside your AI client.
