MCP Server Documentation
Connect Better Search Console to AI assistants like Claude using the Model Context Protocol (MCP).
- 1. Introduction
- 2. Setup on Claude.ai
- 3. Setup on Claude Desktop
- 4. Setup on Cursor / Other Clients
- 5. Authentication
- 6. Tools Reference
- 6.1 Websites
- 6.2 URLs
- 6.3 Sitemaps
- 6.4 Indexation
- 6.5 Prompt Analysis
- 6.6 Settings
- 6.7 Dashboards
- 6.8 SEO Tools
- 6.9 User Profile
- 7. Usage Examples
- 8. Rate Limits
- 9. Troubleshooting
1. Introduction
The Better Search Console MCP server exposes 27 tools that give AI assistants full access to your SEO data and operations:
- List and manage your websites
- Browse, filter, and delete URLs
- Add, process, and delete sitemaps
- Queue URLs for Google/Bing indexation
- Check indexation status
- Create AI prompt analyses
- Configure website settings
- Manage custom dashboards
- Generate sitemaps and robots.txt files
MCP Endpoint
https://www.better-search-console.com/_mcp
2. Setup on Claude.ai
Connect Better Search Console to Claude.ai in 4 steps:
1Generate an API token
Go to Settings in Better Search Console and click Generate API Token. Copy the 64-character token.
2Add the connector
On Claude.ai, go to Settings > Connectors > Add custom connector
- Name: Better Search Console
- URL:
https://www.better-search-console.com/_mcp - Leave OAuth fields empty
3Connect
Click Connect. You'll see an authorization page — paste your API token and click Authorize.
4Start using
In any Claude conversation, the BSC tools are now available. Just ask Claude to manage your SEO:
"List all my websites and show me which URLs are not indexed"
"Submit my 5 newest blog posts to Google for indexation"
"Check the indexation status of all pages on example.com"
3. Setup on Claude Desktop
If you have the project running locally, you can use the STDIO transport for Claude Desktop.
Edit your Claude Desktop config
Open ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows) and add:
{
"mcpServers": {
"better-search-console": {
"command": "php",
"args": ["/path/to/BetterSearchConsole/bin/console", "app:mcp:serve"],
"env": {
"BSC_API_TOKEN": "YOUR_API_TOKEN_HERE"
}
}
}
}
Replace /path/to/BetterSearchConsole with the actual path and YOUR_API_TOKEN_HERE with your token.
Alternative: pass token as option
php bin/console app:mcp:serve --token=YOUR_API_TOKEN_HERE
4. Setup on Cursor / Other Clients
Any MCP-compatible client can connect. Use the HTTP transport:
| Setting | Value |
|---|---|
| URL | https://www.better-search-console.com/_mcp |
| Transport | Streamable HTTP |
| Authentication | Bearer token (your API token) |
The server accepts authentication via:
Authorization: Bearer YOUR_TOKENheaderX-API-TOKEN: YOUR_TOKENheader?token=YOUR_TOKENquery parameter
5. Authentication
The MCP server uses the same API token as the REST API. Generate it from Settings.
OAuth Flow (Claude.ai)
When connecting from Claude.ai, you'll be redirected to an authorization page where you paste your API token. This only happens once — Claude stores the token for future sessions.
Direct Token (Desktop/Cursor)
For desktop clients, pass the token via environment variable or header. The server validates it against your account on every request.
6. Tools Reference
The MCP server exposes 27 tools organized by category. Each tool has typed parameters that the AI assistant fills automatically based on your conversation.
6.1 Websites
No parameters required.
| Parameter | Type | Description |
|---|---|---|
| website_id | integer | The website ID |
6.2 URLs
| Parameter | Type | Required | Description |
|---|---|---|---|
| website_id | integer | Yes | The website ID |
| coverage_state | string | No | Filter by coverage state (e.g. "indexed") |
| url_contains | string | No | Filter URLs containing this string |
| indexing_state | string | No | Filter by indexing state |
| page | integer | No | Page number (default: 1) |
| limit | integer | No | Items per page (default: 30) |
| Parameter | Type | Description |
|---|---|---|
| url_id | integer | The URL ID to delete |
| Parameter | Type | Description |
|---|---|---|
| website_id | integer | The website ID |
| urls | array | Array of URL strings to delete |
6.3 Sitemaps
| Parameter | Type | Description |
|---|---|---|
| website_id | integer | The website ID |
| Parameter | Type | Description |
|---|---|---|
| website_id | integer | The website ID |
| sitemap_url | string | The sitemap URL (must be accessible via HTTP) |
| Parameter | Type | Description |
|---|---|---|
| sitemap_id | integer | The sitemap ID |
| Parameter | Type | Description |
|---|---|---|
| website_id | integer | The website ID |
| Parameter | Type | Description |
|---|---|---|
| sitemap_id | integer | The sitemap ID |
6.4 Indexation
| Parameter | Type | Description |
|---|---|---|
| url | string | The full URL to queue |
| Parameter | Type | Description |
|---|---|---|
| url | string | The full URL to queue |
| Parameter | Type | Required | Description |
|---|---|---|---|
| website_id | integer | Yes | The website ID |
| urls | array | Yes | Array of URL strings |
| boolean | No | Queue for Google (default: true) | |
| bing | boolean | No | Queue for Bing (default: false) |
| Parameter | Type | Description |
|---|---|---|
| url | string | The full URL to check |
| Parameter | Type | Description |
|---|---|---|
| website_id | integer | The website ID |
| urls | array | Array of URL strings to check |
| Parameter | Type | Description |
|---|---|---|
| website_id | integer | The website ID |
| urls | array | Array of URL strings to disable |
| Parameter | Type | Description |
|---|---|---|
| website_id | integer | The website ID |
| urls | array | Array of URL strings to re-enable |
| Parameter | Type | Description |
|---|---|---|
| url | string | The full URL |
| state | string | New coverage state (e.g. "Submitted and indexed") |
6.5 Prompt Analysis
| Parameter | Type | Description |
|---|---|---|
| website_id | integer | The website ID |
| Parameter | Type | Required | Description |
|---|---|---|---|
| website_id | integer | Yes | The website ID |
| prompt | string | Yes | The prompt to test |
| models | array | Yes | AI models to use (e.g. ["gpt-4", "claude-3-opus"]) |
| targeted_keywords | array | No | Keywords to track in responses |
| Parameter | Type | Description |
|---|---|---|
| analysis_id | integer | The analysis ID |
| targeted_keywords | array | New list of keywords |
6.6 Settings
| Parameter | Type | Required | Description |
|---|---|---|---|
| website_id | integer | Yes | The website ID |
| auto_indexing | boolean | No | Enable auto-indexing (premium) |
| auto_sitemap_refresh | boolean | No | Enable auto sitemap refresh (premium) |
| auto_update_status | boolean | No | Enable auto status update (premium) |
| recap_email | boolean | No | Enable recap emails |
| Parameter | Type | Description |
|---|---|---|
| website_id | integer | The website ID |
| Parameter | Type | Description |
|---|---|---|
| website_id | integer | The website ID |
| bing_api_key | string | The Bing API key |
6.7 Dashboards
| Parameter | Type | Description |
|---|---|---|
| website_id | integer | The website ID |
| name | string | Dashboard name |
| Parameter | Type | Required | Description |
|---|---|---|---|
| dashboard_id | integer | Yes | The dashboard ID |
| name | string | No | New name |
| is_default | boolean | No | Set as default dashboard |
| Parameter | Type | Description |
|---|---|---|
| dashboard_id | integer | The dashboard ID |
| Parameter | Type | Description |
|---|---|---|
| dashboard_id | integer | The dashboard ID |
| widgets | array | Array of widget objects: {type, title, span, config} |
6.8 SEO Tools
| Parameter | Type | Required | Description |
|---|---|---|---|
| website_url | string | Yes | The website URL to crawl |
| max_urls | integer | No | Maximum URLs to include (default: 500) |
| Parameter | Type | Required | Description |
|---|---|---|---|
| user_agents | array | Yes | Array of {name, disallow[], allow[], crawl_delay} |
| sitemaps | array | No | Array of sitemap URLs to include |
6.9 User Profile
No parameters required.
7. Usage Examples
Here are example prompts you can use with Claude once connected:
Check SEO status
"Show me all my websites and their indexation stats for today"
Find non-indexed pages
"List all URLs on my website that are not indexed by Google"
Submit new content
"Submit these URLs to Google for indexation: https://example.com/blog/post-1, https://example.com/blog/post-2"
Bulk indexation
"Queue all pages containing '/blog/' for Google and Bing indexation"
Sitemap management
"Add the sitemap https://example.com/sitemap-news.xml to my website and process it"
Status check
"Check the indexation status of my 10 most recently added URLs"
Clean up
"Find all URLs returning 404 and remove them from indexation"
Generate SEO files
"Generate a robots.txt that blocks /admin and /private, allows everything else, and includes my sitemap"
Prompt analysis
"Create a prompt analysis for 'best project management tools' targeting keywords 'project management' and 'productivity' using GPT-4 and Claude"
8. Rate Limits
Indexation and verification tools share the same daily limits as the web interface and REST API:
| Plan | Indexation Requests/day | Status Checks/day |
|---|---|---|
| Free | 10 | 50 |
| Starter | 100 | 200 |
| Pro | 200 | 500 |
| Master | Unlimited | Unlimited |
When a limit is reached, the tool returns an error with "limit_reached": true. Limits reset daily at midnight UTC.
You can check current usage via the list-websites tool (see indexationRequestToday and checkStatusRequestToday fields).
9. Troubleshooting
"This connector has no tools available"
This usually means the authentication failed or the server couldn't load tools. Try:
- Disconnect and reconnect the connector
- Re-enter your API token when prompted
- Verify your token is valid by testing the REST API:
curl -H "X-API-TOKEN: YOUR_TOKEN" https://www.better-search-console.com/api/websites
"Connection to server failed"
- Check that
https://www.better-search-console.com/_mcpis accessible - Ensure you're not behind a firewall blocking the connection
"Daily limit reached"
You've used all your daily indexation or verification requests. Upgrade your plan or wait until midnight UTC for the reset.
"URL not found or access denied"
The URL you're trying to operate on either doesn't exist in your database or belongs to a website you don't own. Make sure the URL has been imported via a sitemap first.
Token issues
- Tokens are 64 characters long (hexadecimal)
- You can regenerate your token at any time from Settings
- After regenerating, you'll need to reconnect any MCP clients
