Skip to main content
Glama
mcp-server-bwt

mcp-server-bwt

by agalliani

mcp-server-bwt

MCP server for Bing Webmaster Tools (Fixed & Compatible Edition for Claude Desktop and Antigravity)

This MCP (Model Context Protocol) server provides a bridge between AI assistants (such as Claude Desktop, Antigravity, Cursor, etc.) and the Bing Webmaster Tools API. It exposes all Bing Webmaster Tools functionality available via bing-webmaster-tools as MCP tools.

Key Fixes in this Fork

  • Fixed Date Serialization Error (Issue #6): Resolved the bug where get_query_stats, get_page_stats, get_rank_and_traffic_stats, and get_page_query_stats failed with Date must match format "date-time". All date objects are normalized to UTC timezone-aware datetimes producing RFC 3339 compliant ISO strings with 'Z' suffix.

  • Fixed FastMCP / MCP SDK Pinning: Standardized dependencies to mcp[cli]>=1.2.0,<2.0.0 ensuring seamless fastmcp stdio transport operation across all client applications.


Installation & Configuration

1. Configuration for Antigravity

Add the following entry to your Antigravity MCP configuration (or mcpServers settings):

{
  "mcpServers": {
    "bing_webmaster": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/agalliani/mcp-server-bwt.git",
        "mcp_server_bwt"
      ],
      "env": {
        "BING_WEBMASTER_API_KEY": "YOUR_BING_API_KEY_HERE"
      }
    }
  }
}

Or for local development:

{
  "mcpServers": {
    "bing_webmaster": {
      "command": "/PATH/TO/mcp-bing-webmaster/.venv/bin/mcp-server-bwt",
      "env": {
        "BING_WEBMASTER_API_KEY": "YOUR_BING_API_KEY_HERE"
      }
    }
  }
}

2. Configuration for Claude Desktop

In your claude_desktop_config.json (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "mcp_server_bwt": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/agalliani/mcp-server-bwt.git",
        "mcp_server_bwt"
      ],
      "env": {
        "BING_WEBMASTER_API_KEY": "YOUR_BING_API_KEY_HERE"
      }
    }
  }
}

Related MCP server: mcp-server-gsc

Example Prompts

Once configured in Antigravity or Claude Desktop, you can ask your AI assistant:


Available Tools

  • Site Management: get_sites, add_site, verify_site, remove_site, get_site_roles, add_site_roles, remove_site_role, get_site_moves, submit_site_move

  • URL Submission: submit_url, submit_url_batch, submit_content, submit_feed, get_feeds, get_feed_details, remove_feed, get_url_submission_quota, get_content_submission_quota, fetch_url, get_fetched_urls, get_fetched_url_details

  • Traffic Analysis: get_query_stats, get_query_traffic_stats, get_query_page_stats, get_query_page_detail_stats, get_page_stats, get_page_query_stats, get_rank_and_traffic_stats

  • Crawling: get_crawl_stats, get_crawl_settings, save_crawl_settings, get_crawl_issues

  • Keyword Analysis: get_keyword, get_keyword_stats, get_related_keywords

  • Link Analysis: get_link_counts, get_url_links, get_deep_link, get_deep_link_blocks, add_deep_link_block, remove_deep_link_block, update_deep_link, get_deep_link_algo_urls, get_connected_pages, add_connected_page

  • Content Management: get_url_info, get_url_traffic_info, get_children_url_info, get_children_url_traffic_info

  • Content Blocking: get_blocked_urls, add_blocked_url, remove_blocked_url, get_active_page_preview_blocks, add_page_preview_block, remove_page_preview_block

  • Regional Settings: get_country_region_settings, add_country_region_settings, remove_country_region_settings

  • URL Management: get_query_parameters, add_query_parameter, remove_query_parameter, enable_disable_query_parameter


Development & Testing

Run all unit tests and quality checks:

uv run pytest
uv run ruff check .
uv run mypy mcp_server_bwt

License

mcp-server-bwt is licensed under the MIT License.

Available Tools

62 tools
add_blocked_urlB

Add a blocked URL to a site.

Args: site_url: The URL of the site blocked_url: The URL to be blocked entity_type: The type of entity to block (Page or Directory) request_type: The type of request (CacheOnly or FullRemoval) date: The date the URL was blocked (default: minimum datetime)

Raises: BingWebmasterError: If URL cannot be blocked

Inputs: site_url (required), blocked_url (required), date, entity_type, +1 more. Returns: result

add_connected_pageC

Add a page which has a link to your website.

Args: site_url: The URL of your site master_url: The URL of the page to be connected

Raises: BingWebmasterError: If page cannot be connected

Inputs: site_url (required), master_url (required). Returns: result

add_country_region_settingsC

Add country/region settings for a specific site.

Args: site_url: The URL of the site settings: The country/region settings to add

Raises: BingWebmasterError: If settings cannot be added

Inputs: settings (required), site_url (required). Returns: result

add_page_preview_blockC

Add a page preview block.

Args: site_url: The URL of the site url: The URL to block from page preview reason: The reason for blocking the page preview

Raises: BingWebmasterError: If preview block cannot be added

Inputs: url (required), reason (required), site_url (required). Returns: result

add_query_parameterC

Add a URL normalization parameter for a site.

Args: site_url: The URL of the site query_parameter: The query parameter to add

Raises: BingWebmasterError: If parameter cannot be added

Inputs: site_url (required), query_parameter (required). Returns: result

add_siteC

Add a new site to Bing Webmaster Tools.

Args: site_url: The URL of the site to add

Raises: BingWebmasterError: If the site cannot be added

Inputs: site_url (required). Returns: result

add_site_rolesC

Delegate site access to a user.

Args: site_url: The URL of your site delegated_url: The URL being delegated user_email: The email of the user to delegate access to authentication_code: The authentication code is_administrator: Whether the user should have administrator privileges is_read_only: Whether the user should have read-only access

Raises: BingWebmasterError: If the role assignment fails

Inputs: site_url (required), user_email (required), is_read_only (required), delegated_url (required), +2 more. Returns: result

enable_disable_query_parameterA

Enable or disable a URL normalization parameter for a site.

Args: site_url: The URL of the site query_parameter: The query parameter to enable/disable is_enabled: True to enable, False to disable

Raises: BingWebmasterError: If parameter state cannot be updated

Inputs: site_url (required), is_enabled (required), query_parameter (required). Returns: result

fetch_urlC

Request Bing to fetch a specific URL immediately.

Args: site_url: The URL of the site url: The URL to fetch

Raises: BingWebmasterError: If URL cannot be fetched

Inputs: url (required), site_url (required). Returns: result

get_active_page_preview_blocksA

Get active page preview blocks for a site.

Args: site_url: The URL of the site

Returns: List[PagePreview]: List of active page preview blocks

Raises: BingWebmasterError: If preview blocks cannot be retrieved

Inputs: site_url (required). Returns: result

get_blocked_urlsA

Get a list of blocked pages/directories for a site.

Args: site_url: The URL of the site

Returns: List[BlockedUrl]: List of blocked URLs and their settings

Raises: BingWebmasterError: If blocked URLs cannot be retrieved

Inputs: site_url (required). Returns: result

get_children_url_infoB

Retrieve information for child URLs of a specific URL.

Args: site_url: The URL of the site url: The parent URL to get child URL information for page: The page number of results to retrieve filter_properties: Properties to filter the results

Returns: List[UrlInfo]: List of URL information for child URLs

Raises: BingWebmasterError: If child URL information cannot be retrieved

Inputs: url (required), site_url (required), page, filter_properties. Returns: result

get_children_url_traffic_infoC

Get traffic details for child URLs of a directory.

Args: site_url: The URL of the site url: The URL of the directory page: The page number of results to retrieve

Returns: List[UrlTrafficInfo]: List of traffic information for child URLs

Raises: BingWebmasterError: If child traffic information cannot be retrieved

Inputs: url (required), site_url (required), page. Returns: result

get_connected_pagesB

Get a list of pages connected to the site.

Args: site_url: The URL of the site

Returns: List[ConnectedSite]: List of connected sites

Raises: BingWebmasterError: If connected pages cannot be retrieved

Inputs: site_url (required). Returns: result

get_content_submission_quotaC

Get information about content submission quota and usage.

Args: site_url: The URL of the site

Returns: ContentSubmissionQuota: Current quota information

Raises: BingWebmasterError: If quota information cannot be retrieved

Inputs: site_url (required). Returns: __type, DailyQuota, MonthlyQuota

get_country_region_settingsA

Retrieve country/region settings for a specific site.

Args: site_url: The URL of the site to get settings for

Returns: List[CountryRegionSettings]: List of country/region settings

Raises: BingWebmasterError: If settings cannot be retrieved

Inputs: site_url (required). Returns: result

get_crawl_issuesA

Get a list of URLs with crawl issues for a specific site.

This helps identify pages that Bing's crawler had trouble accessing or processing.

Args: site_url: The URL of the site

Returns: List[UrlWithCrawlIssues]: List of URLs with their associated crawl issues

Raises: BingWebmasterError: If issues cannot be retrieved

Inputs: site_url (required). Returns: result

get_crawl_settingsB

Retrieve crawl settings for a specific site.

Args: site_url: The URL of the site to get crawl settings for

Returns: CrawlSettings: The current crawl settings for the site

Raises: BingWebmasterError: If settings cannot be retrieved

Inputs: site_url (required). Returns: __type, CrawlRate, CrawlBoostEnabled, CrawlBoostAvailable

get_crawl_statsC

Retrieve crawl statistics for a specific site within a date range.

Args: site_url: The URL of the site

Returns: List[CrawlStats]: List of daily crawl statistics

Raises: BingWebmasterError: If statistics cannot be retrieved

Inputs: site_url (required). Returns: result

get_feed_detailsC

Get detailed information about a specific feed.

Args: site_url: The URL of the site feed_url: The URL of the feed

Returns: List[Feed]: Detailed feed information

Raises: BingWebmasterError: If feed details cannot be retrieved

Inputs: feed_url (required), site_url (required). Returns: result

get_feedsA

Get all sitemap feeds for a site.

Args: site_url: The URL of the site

Returns: List[Feed]: List of feed information

Raises: BingWebmasterError: If feeds cannot be retrieved

Inputs: site_url (required). Returns: result

get_fetched_url_detailsB

Get detailed information about a specific fetched URL.

Args: site_url: The URL of the site url: The specific URL to get details for

Returns: FetchedUrlDetails: Detailed information about the fetch status

Raises: BingWebmasterError: If URL details cannot be retrieved

Inputs: url (required), site_url (required). Returns: Url, Date, Status, __type, +2 more

get_fetched_urlsA

Get a list of URLs that have been submitted for fetching.

Args: site_url: The URL of the site

Returns: List[FetchedUrl]: List of fetched URLs and their status

Raises: BingWebmasterError: If fetched URLs cannot be retrieved

Inputs: site_url (required). Returns: result

get_keywordB

Get keyword impressions for a selected period.

Args: query: The keyword query country: The country code language: The language code start_date: The start date of the period end_date: The end date of the period

Returns: Optional[Keyword]: Keyword impression data, or None if no data available

Raises: BingWebmasterError: If keyword data cannot be retrieved

Inputs: query (required), country (required), end_date (required), language (required), +1 more. Returns: result

get_keyword_statsB

Retrieve keyword statistics for a specific query.

Args: query: The keyword query country: The country code (i.e. gb) language: The language and country code (i.e. en-GB)

Returns: List[KeywordStats]: List of keyword statistics

Raises: BingWebmasterError: If statistics cannot be retrieved

Inputs: query (required), country (required), language (required). Returns: result

get_page_query_statsB

Get detailed traffic statistics for a specific page.

Args: site_url: The URL of the site page: The specific page URL to get statistics for

Returns: List[QueryStats]: List of query statistics for the specified page

Raises: BingWebmasterError: If statistics cannot be retrieved

Inputs: page (required), site_url (required). Returns: result

get_page_statsC

Get detailed traffic statistics for top pages.

Args: site_url: The URL of the site

Returns: List[QueryStats]: List of query statistics for top pages

Raises: BingWebmasterError: If statistics cannot be retrieved

Inputs: site_url (required). Returns: result

get_query_page_detail_statsC

Get detailed statistics for a specific query and page combination.

Args: site_url: The URL of the site query: The search query page: The specific page URL

Returns: List[DetailedQueryStats]: List of detailed statistics

Raises: BingWebmasterError: If statistics cannot be retrieved

Inputs: page (required), query (required), site_url (required). Returns: result

get_query_page_statsC

Get detailed traffic statistics for pages matching a specific query.

Args: site_url: The URL of the site query: The search query to get statistics for

Returns: List[QueryStats]: List of page statistics for the query

Raises: BingWebmasterError: If statistics cannot be retrieved

Inputs: query (required), site_url (required). Returns: result

get_query_parametersB

Get a list of URL normalization parameters for a site.

URL parameters are used to identify which URL parameters should be considered for URL normalization (e.g., sorting, filtering parameters that don't change the content).

Args: site_url: The URL of the site

Returns: List[QueryParameter]: List of query parameters configuration

Raises: BingWebmasterError: If parameters cannot be retrieved

Inputs: site_url (required). Returns: result

get_query_statsC

Get detailed traffic statistics for top queries.

Args: site_url: The URL of the site

Returns: List[QueryStats]: List of statistics for top queries

Raises: BingWebmasterError: If statistics cannot be retrieved

Inputs: site_url (required). Returns: result

get_query_traffic_statsB

Get detailed traffic statistics for a specific query.

Args: site_url: The URL of the site query: The search query to get statistics for

Returns: List[RankAndTrafficStats]: List of traffic statistics for the query

Raises: BingWebmasterError: If statistics cannot be retrieved

Inputs: query (required), site_url (required). Returns: result

get_rank_and_traffic_statsB

Get ranking and traffic statistics for a site.

Args: site_url: The URL of the site

Returns: List[RankAndTrafficStats]: List of ranking and traffic statistics

Raises: BingWebmasterError: If statistics cannot be retrieved

Inputs: site_url (required). Returns: result

get_site_movesB

Get site move information for a specific site.

Args: site_url: The URL of the site

Returns: List[SiteMoveSettings]: List of site move settings

Raises: BingWebmasterError: If the site move information cannot be retrieved

Inputs: site_url (required). Returns: result

get_site_rolesA

Get all roles assigned for a specific site.

Args: site_url: The URL of the site include_all_subdomains: Whether to include roles for all subdomains

Returns: List[SiteRole]: List of role assignments for the site

Raises: BingWebmasterError: If the roles cannot be retrieved

Inputs: site_url (required), include_all_subdomains. Returns: result

get_sitesA

Retrieve all sites in the user's Bing Webmaster Tools account.

Returns: List[Site]: List of sites associated with the account

Raises: BingWebmasterError: If the API request fails

Inputs: no named parameters. Returns: result

get_url_infoB

Retrieve detailed information for a specific URL.

Args: site_url: The URL of the site url: The specific URL to get information for

Returns: UrlInfo: Detailed information about the URL

Raises: BingWebmasterError: If URL information cannot be retrieved

Inputs: url (required), site_url (required). Returns: Url, IsPage, __type, HttpStatus, +5 more

get_url_submission_quotaB

Get information about URL submission quota and usage.

Args: site_url: The URL of the site

Returns: UrlSubmissionQuota: Current quota information

Raises: BingWebmasterError: If quota information cannot be retrieved

Inputs: site_url (required). Returns: __type, DailyQuota, MonthlyQuota

get_url_traffic_infoC

Get traffic details for a single page.

Args: site_url: The URL of the site url: The specific URL to get traffic info for

Returns: UrlTrafficInfo: Traffic information for the URL

Raises: BingWebmasterError: If traffic information cannot be retrieved

Inputs: url (required), site_url (required). Returns: Url, Clicks, IsPage, __type, +1 more

remove_blocked_urlA

Remove a blocked URL from a site.

Args: site_url: The URL of the site blocked_url: The URL to be unblocked entity_type: The type of entity to unblock (Page or Directory) request_type: The type of request (CacheOnly or FullRemoval) date: The date the URL was blocked

Raises: BingWebmasterError: If URL cannot be unblocked

Inputs: site_url (required), blocked_url (required), date, entity_type, +1 more. Returns: result

remove_country_region_settingsB

Remove country/region settings from a specific site.

Args: site_url: The URL of the site settings: The country/region settings to remove

Raises: BingWebmasterError: If settings cannot be removed

Inputs: settings (required), site_url (required). Returns: result

remove_feedC

Remove a previously submitted sitemap feed.

Args: site_url: The URL of the site feed_url: The URL of the feed to remove

Raises: BingWebmasterError: If feed cannot be removed

Inputs: feed_url (required), site_url (required). Returns: result

remove_page_preview_blockB

Remove a page preview block.

Args: site_url: The URL of the site url: The URL to remove the page preview block from

Raises: BingWebmasterError: If preview block cannot be removed

Inputs: url (required), site_url (required). Returns: result

remove_query_parameterC

Remove a URL normalization parameter from a site.

Args: site_url: The URL of the site query_parameter: The query parameter to remove

Raises: BingWebmasterError: If parameter cannot be removed

Inputs: site_url (required), query_parameter (required). Returns: result

remove_siteA

Remove a site from Bing Webmaster Tools.

Args: site_url: The URL of the site to remove

Raises: BingWebmasterError: If the site cannot be removed

Inputs: site_url (required). Returns: result

remove_site_roleB

Remove a user's site access.

Args: site_url: The URL of the site site_role: The site role to remove

Raises: BingWebmasterError: If the role cannot be removed

Inputs: site_url (required), site_role (required). Returns: result

save_crawl_settingsC

Save new crawl settings for a specific site.

Args: site_url: The URL of the site crawl_settings: The new crawl settings to apply

Raises: BingWebmasterError: If settings cannot be saved

Inputs: site_url (required), crawl_settings (required). Returns: result

submit_contentB

Submit content for a specific URL.

Args: site_url: Site url E.g.: http://example.com url: Url to submit E.g.: http://example.com/url1.html http_message: HTTP message (base64 encoded) structured_data: Structured Data (base64 encoded) dynamic_serving: Device targeting (0-5). {none = 0, PC-laptop = 1, mobile = 2, AMP = 3, tablet = 4, non-visual browser = 5}

Raises: BingWebmasterError: If content cannot be submitted

Inputs: url (required), site_url (required), http_message (required), dynamic_serving (required), +1 more. Returns: result

submit_feedB

Submit a sitemap feed for indexing.

Args: site_url: The URL of the site feed_url: The URL of the sitemap feed

Raises: BingWebmasterError: If feed cannot be submitted

Inputs: feed_url (required), site_url (required). Returns: result

submit_site_moveC

Submit a site move request.

Args: site_url: The URL of the site settings: The site move settings containing move configuration

Raises: BingWebmasterError: If the site move submission fails

Inputs: settings (required), site_url (required). Returns: result

submit_urlA

Submit a single URL for indexing.

It is possible to submit only limited number of url. get_url_submission_quota should be called to determine how much urls can be submitted.

Args: site_url: The URL of the site url: The specific URL to submit

Raises: BingWebmasterError: If URL cannot be submitted

Inputs: url (required), site_url (required). Returns: result

submit_url_batchB

Submit multiple URLs for indexing in a single request.

The max number of urls that can be submitted in a batch is 500 unless it exceeds the available quota. get_url_submission_quota should be called to determine how much urls can be submitted.

Args: site_url: The URL of the site url_list: List of URLs to submit

Raises: BingWebmasterError: If URLs cannot be submitted

Inputs: site_url (required), url_list (required). Returns: result

verify_siteB

Attempt to verify ownership of a site.

Args: site_url: The URL of the site to verify

Returns: bool: True if verification was successful

Raises: BingWebmasterError: If verification fails

Inputs: site_url (required). Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.6/5.0

    Scored across 62 tools

    Disambiguation2/5

    The statistics group is especially problematic: get_query_stats, get_query_traffic_stats, get_query_page_stats, get_page_query_stats, and get_rank_and_traffic_stats all describe similar traffic breakdowns with boundary definitions that are hard to parse. The keyword tool pair get_keyword and get_keyword_stats also overlap, making misselection likely without deep context.

    Naming Consistency5/5

    Tool names follow a strict snake_case verb_noun pattern throughout, with consistent use of get_, add_, remove_, submit_, and update_. Even compound names like enable_disable_query_parameter are still predictable and the pattern makes tool behavior guessable from the name.

    Tool Count1/5

    62 tools is an excessive amount for a single MCP server, far beyond the recommended 3-15 range and even beyond the 25+ threshold for too many tools. While the Bing Webmaster Tools domain is broad, this server essentially exposes every API endpoint, creating a large selection burden and reducing coherence.

    Completeness4/5

    The server covers the major Bing Webmaster workflows thoroughly: site management, roles, URL and feed submission, crawl settings, stats, blocks, and keyword data. Minor gaps exist — there is no remove_connected_page and updates to certain role assignments are indirect — but these are easily worked around and do not create dead ends.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      C
      maintenance
      Provides AI agents full access to Bing Webmaster Tools API for site management, URL submission, sitemaps, traffic stats, keyword research, and URL blocking.
      24
      10 npm
      1
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables AI assistants to query and manage Google Search Console data, including search analytics, URL indexing status, and sitemap management, for SEO and LLMO analysis directly from a conversation.
      15
      6,678 npm
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Bing Webmaster Tools and IndexNow for AI agents: traffic, indexing, crawl issues, inbound links, keywords. Direct writes are off by default; changes go through a plan a person applies.
      63
      56 PyPI
      1
      MIT
    • A
      license
      C
      quality
      B
      maintenance
      Enables AI assistants to query Bing Webmaster Tools data such as site verification, traffic analytics, and search performance, with read-only defaults and configurable site access controls.
      34
      MIT