MCP server that provides integration with Bing Webmaster Tools, enabling site management and analytics through AI assistants
This server has fundamental gaps in definition quality that would make it risky for production use. While tool naming follows verb_noun conventions (get_sites, add_site, etc.), parameter descriptions are minimal or absent, schemas lack detail, and error handling is not visible in the provided code. The sample main.py is incomplete (cuts off mid-function), preventing full assessment of error handling and output schemas. All 13 tools have non-empty descriptions, which is positive, but descriptions are generic and lack specificity (e.g., 'Get detailed traffic statistics for top queries' does not explain WHEN to use this vs other stats tools, what data structure is returned, or what happens on error). Input schemas are present but minimalist: most parameters are single strings with one-line descriptions. No parameter constraints (enums, ranges, patterns), no pagination support visible, no output schema documentation, and no error guidance. The server accepts API credentials via environment variable (good), but tool definitions lack the specificity required for reliable LLM reasoning.
Add a new site to Bing Webmaster Tools
Get crawl issues and errors for a site.
Retrieve crawl statistics for a specific site.
Get traffic statistics for top pages.
Get detailed traffic statistics for top queries.
Get overall ranking and traffic statistics.
Retrieve all sites in the user's Bing Webmaster Tools account
Generic, uninformative descriptions lack LLM-optimization guidance. Examples: 'Get detailed traffic statistics for top queries' (52 chars) does not explain WHEN to select this tool vs get_page_stats or get_rank_and_traffic_stats, what the returned structure is, or failure modes. Descriptions should be 50-200 chars and answer: What? When? What does it return? What can go wrong?
No input parameter constraints (enums, ranges, patterns) or detailed descriptions. The 'site_url' parameter appears in 10+ tools but lacks guidance on format (http vs https vs domain-only?), whether it must be already registered, or error conditions if invalid. LLMs cannot infer format requirements from bare parameter names.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 29 | - | v1 |
Get information about URL submission quota and usage.
Remove a site from Bing Webmaster Tools
Submit a sitemap to Bing.
Submit a single URL for indexing.
Submit multiple URLs for indexing.
Attempt to verify ownership of a site
Output schemas are not documented. The provided code is incomplete (cuts off mid-function in main.py), so actual response structures cannot be verified. Without documented output schemas, LLMs cannot plan downstream tool calls or extract needed fields. Example: does get_sites return [{site_url, verified, last_crawled}] or a paginated {data: [...], next_cursor}?
No pagination support visible for list/query tools. get_sites, get_query_stats, get_page_stats, etc. likely return large result sets, but no limit, offset, page, or cursor parameters are defined. LLMs cannot request partial results or iterate safely, risking context window exhaustion.
No error handling guidance visible. The incomplete main.py does not show how API errors (404 site not found, 403 permission denied, 500 server error) are caught and communicated. Error responses must guide the LLM: 'Site not found. Try add_site() first.' vs a bare exception or status code.
'get_rank_and_traffic_stats' combines two concepts (rank + traffic) in one tool name, violating single-responsibility principle. This should either be split into get_rank_stats and get_traffic_stats, or the description should explicitly clarify what 'rank' means in this context (search ranking? competitor ranking?).
Destructive tools (remove_site) lack idempotency or confirmation pattern. The tool can delete a site, a call should support a dry_run parameter or explicit confirmation to prevent accidental deletion.