RankCLI
The only SEO tool with GEO (AI Search Optimization) and MCP for AI assistants.
Developer-first SEO. CLI-native. Optimizes for Google and ChatGPT, Perplexity, Claude.
Why RankCLI?
| GEO (AI Search) | ✅ Check if GPTBot/ClaudeBot can crawl | ❌ |
| MCP Server | ✅ AI assistants can run audits | ❌ |
| Framework Fixes | ✅ 25+ frameworks | ❌ |
| CLI/CI Native | ✅ Built for developers | ❌ |
| Price | From $9/mo | $99-500/mo |
Installation
Standalone binary, no Node required:
brew install integrallis/tap/rankcli
scoop bucket add integrallis https://github.com/integrallis/scoop-bucket
scoop install rankcli
Or via npm (requires Node 20.19+ or 22.12+ - see Node versions):
npm install -g @rankcli/cli
pnpm add -g @rankcli/cli
Verify:
rankcli --version
Quick Start
rankcli audit --url https://yoursite.com
rankcli login
rankcli audit --url https://yoursite.com --max-pages 5
Core Features
🤖 GEO (Generative Engine Optimization)
Check if AI crawlers can access your site:
rankcli geo --url https://yoursite.com
Analyzes:
- AI crawler access: GPTBot, ClaudeBot, PerplexityBot, Google-Extended
- JS rendering: Can AI crawlers see your content?
- LLM signals: Content structure, citations, FAQ extraction
- robots.txt: Are you blocking AI search?
🔌 MCP Server (For AI Assistants)
Let Claude, Cursor, or any MCP-compatible AI run SEO audits for you. Free, local, no signup:
Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"rankcli": {
"command": "npx",
"args": ["@rankcli/mcp-server"]
}
}
}
Nothing is sent to RankCLI's servers — see @rankcli/mcp-server.
A hosted endpoint (with your API key) is also available for teams that want dashboard sync.
Available tools:
seo_audit — Full 280+ check audit on any URL
seo_geo_check — AI search visibility analysis
seo_robots_check — AI crawler permissions in robots.txt
seo_compare — Compare SEO metrics between two URLs
Now just ask Claude: "Run an SEO audit on example.com" ✨
🔧 Framework-Specific Fixes
Auto-generate fixes for 25+ frameworks:
rankcli apply --url https://mysite.com
Supported frameworks:
- JS/TS: React, Next.js (App/Pages), Vue, Nuxt, Angular, Svelte, SvelteKit, Astro, Remix, Gatsby, Solid.js, Qwik
- Backend: Rails, Django, Laravel, Spring Boot, ASP.NET Core, Phoenix, Go (Gin/Echo/Fiber)
- SSG: Hugo, Jekyll, Eleventy, Pelican
- Hypermedia: HTMX, Hotwire/Turbo
📊 7 Deep Analyzers
| GEO | AI crawler access, LLM signals, citation readiness |
| Core Web Vitals | LCP, CLS, INP, TTFB estimation |
| Security Headers | HTTPS, HSTS, CSP (A+ to F grading) |
| Structured Data | JSON-LD validation, rich results |
| Images | Alt text, dimensions, modern formats |
| Internal Links | Anchor text, orphan detection |
| Mobile SEO | Viewport, touch targets, PWA |
Commands
rankcli audit
Run comprehensive SEO audit (280+ checks).
rankcli audit [options]
Options:
-u, --url <url> URL to audit
-o, --output <format> Output: json, console (default: console)
--max-pages <n> Max pages to crawl (default: 5)
--check-links Check broken links
--fail-on <level> CI gate: exit 1 on any issue at/above error | warning | notice
--min-score <n> CI gate: exit 1 if the overall score is below n (0-100)
--ai AI-powered analysis (your own key, or a local model)
--ai-provider <p> See "AI analysis" below (auto-detected if omitted)
--ai-key <key> Provider API key (or the provider's env var)
--ai-model <model> Override the provider's default model
--ai-base-url <url> Any OpenAI-compatible server (implies --ai-provider custom)
Exit codes
0 | Audit completed; no --fail-on / --min-score gate tripped |
1 | A --fail-on or --min-score gate tripped |
2 | Bad invocation: missing/invalid --url, invalid flag value |
3 | No real audit: the site was unreachable, the URL answered 4xx/5xx, no page could be analyzed, or an internal error |
The gates are opt-in: without them, a completed audit exits 0 however many issues it finds. An unreachable site or an error status always exits 3 - it scores 0, not a passing grade. With -o json, stdout is always one JSON document (on failure too) carrying exitCode and, when gates are set, a gate object with the reasons.
AI analysis (--ai)
AI analysis runs on your own provider - nothing goes through RankCLI.
On a Mac with Apple Intelligence, it's the default. On macOS 26 or later on Apple silicon with Apple Intelligence turned on, --ai uses Apple's on-device model: free, private, no key and no network round trip. The first run builds a small Swift helper with the Xcode command-line tools (a few seconds, cached in ~/Library/Caches/rankcli). The on-device model has a small context window, so it sees the 25 most severe issues. To use another provider, pass --ai-provider, or set it once with RANKCLI_AI_PROVIDER=openrouter (any provider id below).
Otherwise, with no --ai-provider, the first key found wins, in this order (OpenRouter first):
openrouter | OPENROUTER_API_KEY | https://openrouter.ai/api/v1 | openrouter/free |
groq | GROQ_API_KEY | https://api.groq.com/openai/v1 | llama-3.3-70b-versatile |
gemini | GEMINI_API_KEY / GOOGLE_API_KEY | https://generativelanguage.googleapis.com/v1beta/openai | gemini-3.7-flash |
deepseek | DEEPSEEK_API_KEY | https://api.deepseek.com | deepseek-flash |
cerebras | CEREBRAS_API_KEY | https://api.cerebras.ai/v1 | gpt-oss-120b |
mistral | MISTRAL_API_KEY | https://api.mistral.ai/v1 | mistral-small-latest |
together | TOGETHER_API_KEY | https://api.together.xyz/v1 | openai/gpt-oss-120b |
fireworks | FIREWORKS_API_KEY | https://api.fireworks.ai/inference/v1 | accounts/fireworks/models/gpt-oss-120b |
anthropic | ANTHROPIC_API_KEY | https://api.anthropic.com/v1 | claude-haiku-4-5-20251001 |
openai | OPENAI_API_KEY | https://api.openai.com/v1 | gpt-5.6-luna |
Local models, no key. If no key is set at all and Ollama is running, --ai uses it automatically (with a one-line notice) and picks its first installed model:
ollama pull qwen3:8b
rankcli audit --url https://yoursite.com --ai
rankcli audit --url https://yoursite.com --ai --ai-provider ollama --ai-model qwen3:8b
ollama | http://localhost:11434/v1 (honours OLLAMA_HOST) |
lmstudio | http://localhost:1234/v1 |
llamacpp | http://localhost:8080/v1 (llama-server) |
vllm | http://localhost:8000/v1 |
custom | whatever --ai-base-url says |
Local providers need no key and no model name: without --ai-model the CLI asks the server (/api/tags for Ollama, /v1/models otherwise) and uses the first loaded model. Any other OpenAI-compatible server works too:
rankcli audit --url https://yoursite.com --ai --ai-base-url http://gpu-box:8080/v1 --ai-model my-model
Local and small models often ignore "JSON only" instructions, so the reply is parsed defensively (code fences, <think> blocks and surrounding prose are stripped). response_format: json_object is only sent to providers known to support it. An AI failure is reported but never changes the exit code.
rankcli apply
Generate and apply framework-specific fixes.
rankcli apply --url https://mysite.com --dry-run
rankcli apply --url https://mysite.com --auto
rankcli keywords
AI-powered keyword research. --ai runs on the same provider as audit --ai (Apple Intelligence on a Mac that has it, else your key, else a local Ollama) and takes the same --ai-provider / --ai-key / --ai-model / --ai-base-url flags. Keyword clustering uses embeddings on OpenAI and term vectors everywhere else; local models judge 5 tool ideas instead of 15.
rankcli keywords --url https://mysite.com --ai
rankcli keywords --competitor -c 'competitor.com' -s 'target keyword'
rankcli content
Content analysis for readability and snippets.
rankcli content --url https://mysite.com/blog --keyword 'seo tips'
Authentication
rankcli login
rankcli login --token rankcli_your_api_key
export RANKCLI_API_KEY=rankcli_your_api_key
rankcli login
CI/CD Integration
GitHub Actions
name: SEO Audit
on: [push, pull_request]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v4
with:
node-version: '22'
- run: npm install -g @rankcli/cli
- run: rankcli audit --url "$SITE_URL" --fail-on error --min-score 80 -o json > "$RUNNER_TEMP/audit.json"
env:
SITE_URL: ${{ vars.SITE_URL }}
RANKCLI_API_KEY: ${{ secrets.RANKCLI_API_KEY }}
rankcli setup --github-action --url https://yoursite.com [--sync] writes a scheduled workflow that files the report as an issue (and, with --sync and a RankCLI API key, opens auto-fix PRs - 3 a month on Free).
Environment Variables
RANKCLI_API_KEY | API key for authentication (plan resolved automatically) |
RANKCLI_CONFIG_DIR | Store login/config here instead of the per-user config dir |
OPENROUTER_API_KEY, GROQ_API_KEY, GEMINI_API_KEY, DEEPSEEK_API_KEY, CEREBRAS_API_KEY, MISTRAL_API_KEY, TOGETHER_API_KEY, FIREWORKS_API_KEY, ANTHROPIC_API_KEY, OPENAI_API_KEY | AI analysis keys (see "AI analysis") |
OLLAMA_HOST | Where a local Ollama listens (default localhost:11434) |
Node versions
The npm package needs Node 20.19+ or 22.12+ (any 23+ works). The CLI is a CommonJS bundle that require()s ESM-only dependencies (chalk, conf, inquirer, open), and those are the first releases that load ES modules through require() without a flag. Every Node line still in support (22, 24) qualifies. On an older Node, rankcli / npx @rankcli/cli stops with a message saying so instead of an ERR_REQUIRE_ESM stack trace. The Homebrew/Scoop binaries bundle their own Node and have no requirement.
Pricing
| SEO + GEO checks | All 280+ | All 280+ |
Local fixes (rankcli fix, 25+ frameworks) | ✅ | ✅ |
| Auto-fix PRs (GitHub App) | 3 a month | ✅ |
| Hosted sites | 1, audited weekly | 3+, weekly or daily |
| Slack & Discord alerts | - | ✅ |
See rankcli.dev/pricing.
Links
License
MIT