AI Search Operations MCP for Bing Webmaster
# AI Search Operations MCP for Bing Webmaster
An open-source, vendor-neutral MCP server that helps marketers improve pages for human readers and AI search. It combines Bing Webmaster data, GA4 AI-traffic opportunity matching, technical SEO scanning, AI-search content audits, approval-gated WordPress fix preparation, live verification, Bing URL submission, and a separate IndexNow integration.
It uses the standard MCP `stdio` transport, so the same server can run in Codex, Claude Code, Cursor, VS Code, and other compatible MCP clients. Each user supplies their own credentials.
No API key is stored in this repository.
## What marketers can do
- See the queries and pages already receiving Bing impressions and clicks.
- Find pages with high Bing impressions but little or no identifiable AI-referral traffic in an aggregated GA4 export.
- Review rankings, crawl activity, crawl issues, sitemaps, backlinks, keyword research data, URL details, and submission quota.
- Scan one page or up to 20 pages for common SEO/AEO problems.
- Find duplicate H1s, missing image alt text, metadata, canonical, robots, language, HTTP, and JSON-LD problems.
- Audit AI readability, entity coverage, citation readiness, intent coverage, schema fit, internal links, and freshness.
- Audit a site's proposed `llms.txt` file and compare it with important hub URLs.
- Find highly similar article bodies across a catalog before search systems choose the wrong page.
- Compare Article/FAQPage schema and `dateModified` freshness across translated pages.
- Compare heading topics with public competitor pages.
- Preview the answer that can be extracted using only the page's own words.
- Find concise passages that are easier to quote or paraphrase accurately.
- Turn every finding into a clear fix plan and exact before/after diff.
- Prepare corrected WordPress HTML without publishing it automatically.
- Prepare review-ready Article and BreadcrumbList JSON-LD, plus FAQPage or HowTo only when matching content is visible.
- Recheck the live page after a fix.
- Submit an approved URL, URL batch, or sitemap to Bing.
- Validate an IndexNow key file and notify IndexNow about added, updated, or deleted URLs.
## Example prompts for any MCP client
> List the websites connected to my Bing Webmaster account.
> Show my top Bing queries and pages.
> Using this GA4 CSV, find pages with at least 1,000 Bing impressions and no more than 5 AI-referral sessions.
> Scan these 10 URLs and group the AEO problems by priority.
> Audit this page for AI readability, citation readiness, missing entities, intent gaps, schema, and freshness.
> Compare this article with these three competitors and show only meaningful topic gaps.
> Find internal-link opportunities using this list of published pages. Do not invent URLs.
> Scan this WordPress article, prepare the safe fixes, show me the changes, update it after I approve, verify the live page, then submit it to Bing.
## How the automated workflow works
1. `aeo_audit_page` runs the full technical and AI-search audit.
2. `aeo_prepare_article_schema` can prepare complete JSON-LD from visible article content without publishing it.
3. Your AI client reads the latest post through a separate connected WordPress MCP.
4. `aeo_autofix_page` applies only exact proposed replacements in memory and returns a before/after diff.
5. The tool marks the package `approval_required: true` and does not publish.
6. Your AI client shows the changes and requests approval before a WordPress write.
7. After approval, the connected WordPress MCP updates the post.
8. `seo_recheck_page` and the AEO audits verify the public result.
9. `bing_submit_url` or `bing_submit_url_batch` requests a fresh Bing crawl when you ask for it.
The fixer will not invent image descriptions, internal destination URLs, facts, prices, or competitor claims. The calling AI must supply proposed wording from reviewed source material. It also requires confirmation that the WordPress theme already renders the post title as the page H1 before changing content-body H1s to H2s.
## Bundled Codex duplicate-content skill
`skills/bing-duplicate-content-fix` adds the editorial workflow around the MCP tools. It checks copied text, heavy templates, low-similarity search-intent overlap, and keyword cannibalization; prepares an exact approval package; applies only approved WordPress changes; verifies the saved and public result; and requests a Bing recrawl when authorized.
Invoke it in Codex with:
> Use $bing-duplicate-content-fix to check this category for duplicate content and search-intent overlap, fix the approved conflicts, verify the live pages, and request a Bing recrawl.
The skill treats similarity as a review signal, not an automatic instruction to merge, delete, canonicalize, or noindex a page.
## Find high-impression, low-AI-traffic pages
Use `aeo_find_ai_traffic_opportunities` with either an attached GA4 CSV or aggregated rows from a connected GA4 tool. The MCP pulls Bing's top-page statistics itself and matches the pages by URL.
The simplest GA4 CSV contains these three columns:
```csv
Page path + query string,Session source / medium,Sessions
/blog/example/,chatgpt.com / referral,3
/blog/another-page/,google / organic,120
```
Common GA4 page, source/referrer, and traffic column names are detected automatically. If the export is already filtered to AI referrals, a page column plus a traffic column is enough. Only aggregate page-level data should be supplied—never export user-level or event-level identifiers.
The result lists each opportunity URL, Bing impressions and clicks, Bing positions, identifiable GA4 AI traffic, the reason it was selected, and the recommended next audit. Normal search and referral traffic is ignored. You can add extra AI referral domains if your analytics uses a source that is not in the built-in list.
The raw CSV is not returned or sent to Google. The MCP returns only the aggregate comparison. Bing and GA4 may cover different reporting periods, and some AI visits appear as direct, organic, or unknown traffic, so the output is an opportunity list rather than proof of total AI usage.
## Choose only the modules you need
All 47 tools remain enabled by default. Set `MCP_MODULES` to load a smaller toolset:
| Module | What it provides |
| --- | --- |
| `bing` | Bing reporting, Bing submissions, and the Bing + GA4 opportunity finder |
| `seo` | Live page scanning, rechecking, fix plans, and WordPress-ready HTML preparation |
| `aeo` | AI readability, citation, entity, intent, schema, freshness, catalog, and multilingual audits |
| `indexnow` | IndexNow key validation and URL notifications |
Examples:
```bash
# Only Bing reporting and submission tools
MCP_MODULES=bing npm start
# Scanner and AEO audits without Bing credentials
MCP_MODULES=seo,aeo npm start
```
Use `all`, or leave `MCP_MODULES` unset, to enable everything. An unknown module name stops startup with a clear error instead of silently hiding tools.
## The 47 MCP tools
### Bing Webmaster data
- `bing_list_sites`
- `bing_get_query_stats`
- `bing_get_page_stats`
- `bing_get_rank_and_traffic_stats`
- `bing_get_crawl_stats`
- `bing_get_crawl_issues`
- `bing_get_sitemaps`
- `bing_get_fetched_url_details`
- `bing_get_url_traffic_info`
- `bing_get_page_query_stats`
- `bing_get_url_submission_quota`
- `bing_get_link_counts`
- `bing_get_url_links`
- `bing_get_keyword_stats`
- `bing_get_related_keywords`
- `bing_get_query_page_stats`
- `bing_get_query_page_detail_stats`
- `bing_get_url_info`
- `bing_get_children_url_traffic_info`
### Live SEO/AEO scanning and fixes
- `seo_scan_page`
- `seo_scan_pages`
- `seo_recheck_page`
- `aeo_plan_page_fixes`
- `aeo_prepare_wordpress_fixes`
- `aeo_prepare_article_schema` — prepare Article and BreadcrumbList JSON-LD, plus FAQPage or HowTo only when matching content is visible
- `aeo_audit_images` — audit image discoverability, alt quality signals, filenames, dimensions, responsive markup, nearby context, preferred-image metadata, ImageObject schema, response headers, and large-file risks
### Catalog and multilingual audits
- `aeo_llms_txt_audit` — inspect the root-level Markdown file, its heading, links, and supplied canonical pages
- `aeo_internal_duplicate_check` — compare 2 to 30 article bodies using transparent text similarity
- `aeo_multilang_schema_parity` — compare Article/FAQPage JSON-LD and freshness across translated versions
### Bing-to-AI traffic opportunities
- `aeo_find_ai_traffic_opportunities` — combine Bing `GetPageStats` with an aggregated GA4 CSV or rows to find high-impression pages with low identifiable AI-referral traffic
### AI-search operations
- `aeo_audit_page` — run all AI-search audits together
- `aeo_ai_readability_audit` — direct answers, definitions, headings, structure, and marketing language
- `aeo_entity_coverage` — check a primary entity and supplied related entities
- `aeo_citation_readiness` — score extractable, structured, supported passages
- `aeo_intent_coverage` — detect six common intent types and missing expected intents
- `aeo_compare_pages` — compare visible heading topics with up to five competitors
- `aeo_ai_overview_preview` — create a page-only extractive answer preview
- `aeo_extract_citable_chunks` — find concise standalone definitions and facts
- `aeo_internal_link_opportunities` — match content to a supplied inventory of real URLs
- `aeo_schema_recommendations` — validate JSON-LD and assess schema fit
- `aeo_freshness_audit` — flag dates, prices, limits, relative claims, and screenshots for review
- `aeo_autofix_page` — prepare an exact diff and require approval; never publish
### Bing submissions
- `bing_submit_url`
- `bing_submit_url_batch`
- `bing_submit_sitemap`
### IndexNow
- `indexnow_validate_key`
- `indexnow_submit_url`
- `indexnow_submit_urls`
IndexNow remains separate from the Bing Webmaster API client. Its tools support `added`, `updated`, and `deleted` workflow labels. The protocol sends the changed URL, not a separate change-type field, and an accepted submission never guarantees crawling or indexing.
Submission tools are marked as write actions. Audits and fix-preparation tools are read-only because they do not change the website.
## Official API mapping
The added Bing tools call these documented methods with their official parameters. Read tools return Bing's normalized response. The batch tool adds clearly labelled local validation, quota, success, failure, and skip results; it does not claim that Bing returned per-URL outcomes.
- `aeo_find_ai_traffic_opportunities` → [`GetPageStats(siteUrl)`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.bing.webmaster.api.interfaces.iwebmasterapi.getpagestats?view=bing-webmaster-dotnet) plus aggregate GA4 data supplied by the user. The matcher recognizes GA4 page-path and referrer/source columns described in Google's [Analytics dimensions and metrics reference](https://developers.google.com/analytics/devguides/reporting/data/v1/exploration-api-schema); it does not call the GA4 API.
- `bing_get_link_counts` → [`GetLinkCounts(siteUrl, page)`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.bing.webmaster.api.interfaces.iwebmasterapi.getlinkcounts?view=bing-webmaster-dotnet)
- `bing_get_url_links` → [`GetUrlLinks(siteUrl, link, page)`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.bing.webmaster.api.interfaces.iwebmasterapi.geturllinks?view=bing-webmaster-dotnet)
- `bing_get_keyword_stats` → [`GetKeywordStats(q, country, language)`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.bing.webmaster.api.interfaces.iwebmasterapi.getkeywordstats?view=bing-webmaster-dotnet)
- `bing_get_related_keywords` → [`GetRelatedKeywords(q, country, language, startDate, endDate)`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.bing.webmaster.api.interfaces.iwebmasterapi.getrelatedkeywords?view=bing-webmaster-dotnet)
- `bing_get_query_page_stats` → [`GetQueryPageStats(siteUrl, query)`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.bing.webmaster.api.interfaces.iwebmasterapi.getquerypagestats?view=bing-webmaster-dotnet)
- `bing_get_query_page_detail_stats` → [`GetQueryPageDetailStats(siteUrl, query, page)`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.bing.webmaster.api.interfaces.iwebmasterapi.getquerypagedetailstats?view=bing-webmaster-dotnet)
- `bing_get_url_info` → [`GetUrlInfo(siteUrl, url)`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.bing.webmaster.api.interfaces.iwebmasterapi.geturlinfo?view=bing-webmaster-dotnet)
- `bing_get_children_url_traffic_info` → [`GetChildrenUrlTrafficInfo(siteUrl, url, page)`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.bing.webmaster.api.interfaces.iwebmasterapi.getchildrenurltrafficinfo?view=bing-webmaster-dotnet)
- `bing_submit_url_batch` → [`SubmitUrlBatch(siteUrl, urlList)`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.bing.webmaster.api.interfaces.iwebmasterapi.submiturlbatch?view=bing-webmaster-dotnet)
IndexNow follows the separate [official IndexNow protocol](https://www.indexnow.org/documentation), including same-host key validation and the documented 10,000-URL POST limit.
## Honest scoring and limitations
The AI-search scores are transparent HTML and language-pattern heuristics. They are useful editorial signals, not secret access to an LLM or a guarantee that ChatGPT, Copilot, Google, or Bing will cite a page.
- Entity gaps are measured against related entities you supply. Heuristically detected entities are labelled as such.
- Internal-link suggestions come only from URLs you supply. The MCP does not invent destinations.
- The answer preview extracts existing page passages. It does not simulate a proprietary AI answer.
- Competitor gaps compare headings and topics. They are research leads, not instructions to copy text.
- Freshness findings mean “verify this,” not “this is false.”
- Schema suggestions must match visible content and current search-platform rules.
- `aeo_autofix_page` prepares changes only. A connected WordPress MCP is needed to publish after human approval.
- `llms.txt` is a community proposal. Having one does not guarantee discovery, ranking, crawling, or citation by an AI system.
- Near-duplicate similarity is a review signal, not proof that a search engine will deduplicate pages or a command to delete one.
- Multilingual parity compares only the URLs supplied. Different locales may legitimately need different visible content or schema.
- The AI-traffic opportunity tool does not connect to GA4 or require a Google key. It processes the aggregate CSV or rows supplied to the local MCP.
- GA4 referral data is incomplete because some AI visits appear as direct, organic, or unknown traffic.
- Bing says `GetPageStats` is updated weekly. Its period may not exactly match the date range of a GA4 export.
## Important Bing limitation
Bing's public Webmaster API does not expose the complete URL Inspection report shown in Bing Webmaster Tools. Dashboard warnings such as multiple H1 headings and missing image alt attributes are not returned by `GetCrawlIssues`.
The scanner therefore fetches and checks the public HTML independently. It does not claim to reproduce Bing's private dashboard logic, execute JavaScript, or access private/local network addresses.
## Install
You need Node.js 20 or newer and any MCP client that supports local `stdio` servers. A Bing Webmaster API key is needed only for the `bing` module; the webpage scanner and AEO audits work without it.
```bash
git clone https://github.com/TechDivar/bing-webmaster-aeo-mcp.git
cd bing-webmaster-aeo-mcp
npm install
npm run setup-key
```
The setup hides the key while you type and stores it outside the repository with owner-only permissions:
| Platform | Default private folder |
| --- | --- |
| macOS | `~/Library/Application Support/bing-webmaster-aeo-mcp/secrets/` |
| Linux | `~/.config/bing-webmaster-aeo-mcp/secrets/` |
| Windows | `%APPDATA%\bing-webmaster-aeo-mcp\secrets\` |
Existing macOS users do not need to move a key previously saved under the Codex secrets folder; v3 keeps that location as a read-only compatibility fallback.
You can also supply credentials through your MCP client's secret settings or environment:
```env
BING_WEBMASTER_API_KEY=
BING_WEBMASTER_API_KEY_FILE=/absolute/path/to/bing-key
INDEXNOW_KEY=
INDEXNOW_KEY_FILE=/absolute/path/to/indexnow-key
INDEXNOW_KEY_LOCATION=https://example.com/indexnow-key.txt
MCP_MODULES=bing,seo,aeo,indexnow
```
Prefer the setup scripts or private key files. Never commit a populated `.env` or client configuration containing a key. `BING_WEBMASTER_MCP_CONFIG_DIR` can move the private configuration folder when needed.
### Optional IndexNow setup
Create an IndexNow key, save it locally, and host a UTF-8 text file named `<key>.txt` at the root of the exact site host. The file must contain only the matching key.
```bash
npm run setup-indexnow-key
```
The key is stored in the same platform-specific private folder shown above. The default public key-file location is `https://your-host/<key>.txt`. If you intentionally host it elsewhere on the same host, set `INDEXNOW_KEY_LOCATION` before starting the MCP server. A custom location limits submissions to URLs under that file's directory, as required by IndexNow.
## Connect it to an MCP client
Use an absolute path to `src/server.mjs`. For Codex:
From the repository folder, run:
```bash
codex mcp add bing-webmaster -- node "$PWD/src/server.mjs"
```
Restart Codex, then ask it to list the Bing sites to confirm the connection.
See [Client setup examples](docs/CLIENTS.md) for Claude Code, Cursor, VS Code, generic MCP hosts, module selection, and safe credential options.
WordPress is intentionally not built into this server. Connect a separate WordPress MCP if you want an approved fix package to be published. This keeps website-writing credentials and write access separate from scanning and Bing reporting.
## Development
```bash
npm install
npm test
npm start
```
## Security
Never paste an API key into a prompt, issue, commit, or screenshot. See [SECURITY.md](SECURITY.md) for the security model and vulnerability-reporting guidance.
## Contributing
Marketers, SEO specialists, content teams, and developers are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).
## License
MIT
TDQS
Scored across 46 tools
Most tools have clearly distinct purposes: bing_* tools handle official Bing Webmaster API data retrieval, seo_* tools do independent page scanning, aeo_* tools handle AI/SEO analysis, and indexnow_* tools handle IndexNow notifications. A few could cause confusion (e.g., bing_get_url_traffic_info vs bing_get_url_info vs bing_get_fetched_url_details, and bing_get_page_stats vs bing_get_page_query_stats), though descriptions do clarify differences.
The tools follow a consistent verb_noun pattern with prefixes (bing_, seo_, aeo_, indexnow_) dividing responsibility domains. Within each prefix, verbs like get_, submit_, scan_, audit_, and prepare_ are used consistently. Minor deviation: verb ordering is not fully uniform (get_query_page_stats vs get_query_page_detail_stats), and bing_get_page_stats vs bing_get_page_query_stats invert the hierarchy between page and query.
At 46 tools this is on the heavy side, exceeding the 25+ threshold that signals high cognitive load. The breadth is justified by the combined scope (Bing Webmaster API, independent SEO scanning, AI visibility analysis, WordPress prep, and IndexNow), but an agent facing 46 tools with four distinct prefixes will have a large decision space. Still, the server has a genuinely broad purpose, so this is not extreme bloat.
The surface is notably comprehensive: it covers site listing, query/page/rank/crawl/keyword/link stats, sitemap management, URL submission (single, batch, sitemap, IndexNow), crawling issues, technical SEO scanning, AI-visibility analysis, and even fix preparation with WordPress integration. Minor gaps exist (e.g., no tool to remove or delete a sitemap, no tool to manage verification beyond listing, and the autofix flow depends on an externally connected WordPress MCP), but the main workflows are well covered.