get_sites
Retrieve all websites from your Bing Webmaster Tools account to manage and monitor site performance.
Instructions
Retrieve all sites in the user's Bing Webmaster Tools account
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- mcp_server_bwt/main.py:128-142 (handler)The get_sites tool handler: decorated function that retrieves all sites from the Bing Webmaster Tools API using GetUserSites endpoint, processes the response with type fields, and returns a list of site dictionaries.@mcp.tool( name="get_sites", description="Retrieve all sites in the user's Bing Webmaster Tools account", ) async def get_sites() -> List[Dict[str, Any]]: """ Retrieve all sites in the user's Bing Webmaster Tools account. Returns: List of sites with their details including URL, verification status, etc. """ async with api: sites = await api._make_request("GetUserSites") return api._ensure_type_field(sites, "Site")
- mcp_server_bwt/main.py:128-131 (registration)Registration of the get_sites tool via @mcp.tool decorator specifying name and description.@mcp.tool( name="get_sites", description="Retrieve all sites in the user's Bing Webmaster Tools account", )
- mcp_server_bwt/main.py:112-121 (helper)Helper method _ensure_type_field used by get_sites to add MCP-compatible __type fields to the API response data.def _ensure_type_field(self, data: Any, type_name: str) -> Any: """Ensure __type field is present for MCP compatibility.""" if isinstance(data, list): for item in data: if isinstance(item, dict) and "__type" not in item: item["__type"] = f"{type_name}:#Microsoft.Bing.Webmaster.Api" elif isinstance(data, dict) and "__type" not in data: data["__type"] = f"{type_name}:#Microsoft.Bing.Webmaster.Api" return data
- mcp_server_bwt/main.py:59-111 (helper)Core helper method _make_request used by get_sites to perform the HTTP request to the Bing Webmaster API, handle OData responses, and manage errors.async def _make_request( self, endpoint: str, method: str = "GET", json_data: Optional[Dict[str, Any]] = None, params: Optional[Dict[str, Any]] = None, ) -> Any: """Make a request to the Bing API and handle OData responses.""" if not self.client: raise RuntimeError( "API client not initialized. Use 'async with api:' context manager." ) headers = {"Content-Type": "application/json; charset=utf-8"} # Build URL with API key if "?" in endpoint: url = f"{self.base_url}/{endpoint}&apikey={self.api_key}" else: url = f"{self.base_url}/{endpoint}?apikey={self.api_key}" # Add additional parameters if provided if params: for key, value in params.items(): url += f"&{key}={value}" try: if method == "GET": response = await self.client.get(url, headers=headers) else: response = await self.client.request( method, url, headers=headers, json=json_data ) if response.status_code != 200: error_text = response.text logger.error(f"API error {response.status_code}: {error_text}") raise Exception(f"API error {response.status_code}: {error_text}") data = response.json() # Handle OData response format if "d" in data: return data["d"] return data except httpx.TimeoutException: logger.error(f"Request timeout for {endpoint}") raise Exception("Request timed out") except Exception as e: logger.error(f"Request failed: {str(e)}") raise