add_site_roles
Delegate site access to users in Bing Webmaster Tools by assigning administrator or read-only roles with authentication codes.
Instructions
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
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| self | Yes | ||
| site_url | Yes | ||
| delegated_url | Yes | ||
| user_email | Yes | ||
| authentication_code | Yes | ||
| is_administrator | Yes | ||
| is_read_only | Yes |
Implementation Reference
- Generic handler factory for MCP tools. Creates an @mcp.tool()-decorated wrapper function that preserves the original service method's signature and docstring (used as schema), enters the service context, retrieves the named service object (e.g., 'sites'), and invokes its method (e.g., 'add_site_roles') with user arguments.def wrap_service_method( mcp: FastMCP, service: BingWebmasterService, service_attr: str, method_name: str ) -> Callable[..., Any]: """Helper function to wrap a service method with mcp.tool() while preserving its signature and docstring. Args: mcp: The MCP server instance service: The BingWebmasterService instance service_attr: The service attribute name (e.g., 'sites', 'submission') method_name: The method name to wrap Returns: The wrapped method as an MCP tool """ # Get the service class from our mapping service_class = SERVICE_CLASSES[service_attr] # Get the original method original_method = getattr(service_class, method_name) # Get the signature sig = inspect.signature(original_method) # Remove 'self' parameter from signature parameters = list(sig.parameters.values())[1:] # Skip 'self' # Create new signature without 'self' new_sig = sig.replace(parameters=parameters) # Create wrapper function with same signature @mcp.tool() @wraps(original_method) async def wrapper(*args: Any, **kwargs: Any) -> Any: # Filter out any 'self' arguments that might be passed by the MCP client kwargs = {k: v for k, v in kwargs.items() if k != "self"} async with service as s: service_obj = getattr(s, service_attr) # Get the method from the instance method = getattr(service_obj, method_name) # Call the method directly - it's already bound to the instance return await method(*args, **kwargs) # Copy signature and docstring wrapper.__signature__ = new_sig # type: ignore wrapper.__doc__ = original_method.__doc__ return wrapper
- mcp_server_bwt/tools/bing_webmaster.py:90-90 (registration)Registers the 'add_site_roles' tool by invoking the handler factory with parameters targeting the SiteManagementService.add_site_roles method.add_site_roles = wrap_service_method(mcp, service, "sites", "add_site_roles") # noqa: F841
- mcp_server_bwt/main.py:17-17 (registration)Invokes the tool registration function to add all Bing Webmaster Tools to the MCP server, including 'add_site_roles'.add_bing_webmaster_tools(mcp, bing_service)
- Mapping used by the handler to resolve service attribute ("sites") to class for signature extraction.SERVICE_CLASSES = { "sites": site_management.SiteManagementService, "submission": submission.SubmissionService, "traffic": traffic_analysis.TrafficAnalysisService, "crawling": crawling.CrawlingService, "keywords": keyword_analysis.KeywordAnalysisService, "links": link_analysis.LinkAnalysisService, "content": content_management.ContentManagementService, "blocking": content_blocking.ContentBlockingService, "regional": regional_settings.RegionalSettingsService, "urls": url_management.UrlManagementService, }
- BingWebmasterService context manager entry point, instantiates and exposes the 'sites' service instance used by the tool handler.async def __aenter__(self) -> "BingWebmasterService": self.client = BingWebmasterClient(self.settings) await self.client.__aenter__() # Expose all services directly self.sites = site_management.SiteManagementService(self.client) self.submission = submission.SubmissionService(self.client) self.traffic = traffic_analysis.TrafficAnalysisService(self.client) self.crawling = crawling.CrawlingService(self.client) self.keywords = keyword_analysis.KeywordAnalysisService(self.client) self.links = link_analysis.LinkAnalysisService(self.client) self.content = content_management.ContentManagementService(self.client) self.blocking = content_blocking.ContentBlockingService(self.client) self.regional = regional_settings.RegionalSettingsService(self.client) self.urls = url_management.UrlManagementService(self.client) return self