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
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |
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