Skip to content

Push new and changed listings to search engines, and add a sitemap - #46

Merged
lbesecker195 merged 1 commit into
mainfrom
feat/discovery-sitemap-indexnow-websub
Sep 22, 2026
Merged

lbesecker195 merged 1 commit into
mainfrom
feat/discovery-sitemap-indexnow-websub

Conversation

@lbesecker195

@lbesecker195 lbesecker195 commented Sep 22, 2026

Copy link
Copy Markdown
Owner

About 34,000 server pages had no sitemap and no feed. /sitemap.xml 301'd to the home page and robots.txt named nothing, so new listings from each six-hourly sync waited for a crawler to stumble on them. This pushes every change to the discovery channels search engines listen to, and gives crawlers a map of the rest.

  • Sitemap: /sitemap.xml indexes /sitemaps/pages.xml and /sitemaps/servers-N.xml, 10,000 active listings each with lastmod. robots.txt is now rendered so it can name the sitemap.
  • WebSub: /feed.xml is an Atom feed of the newest 50 listings that declares Google's hub. Pinging the hub is how Google's Feedfetcher hears about a new listing, since Google takes neither IndexNow nor sitemap pings.
  • IndexNow: after each sync, new, removed and changed URLs go to api.indexnow.org, which shares them with Bing, Yandex, Naver, Seznam and Yep. Approvals, API publishes and saved articles are batched into one request a minute. A 429 is never retried.
  • Zero config: the key is derived from SECRET_KEY_BASE and served at /<key>.txt. Pushing is on in prod (DISCOVERY_PUSH=false turns it off) and off in dev and test.

After deploy, run bin/announce once to backfill all listings.

The 17 new tests pass. The 3 failures in mix test also fail on main: the local test database holds leftover seed rows.

Closes #45


Pages affected:

🤖 Generated with Claude Code

The registry's 34,000 server pages had no sitemap and no feed, so crawlers
found them by chance. Search engines now hear about each change as it lands.

- Serve a sitemap index, 10,000 listings per file, named in a rendered robots.txt
- Publish an Atom feed of the newest listings that declares Google's WebSub hub
- After each sync, send new, removed and changed URLs to IndexNow, which shares
  them with Bing, Yandex, Naver, Seznam and Yep, and ping the hub on additions
- Batch approvals, API publishes and saved articles into one push a minute
- Serve the IndexNow key, derived from SECRET_KEY_BASE so deploys need no new
  setting, and add bin/announce for a one-off backfill

Closes #45

---

Pages affected:

- [MCP Registry](https://ai.mcpharbor.dev/) — directory home, now advertising the new-servers feed.
- [MCP server directory](https://ai.mcpharbor.dev/servers) — every listing reachable through the sitemap.
- [Context7 MCP server](https://ai.mcpharbor.dev/servers/io.github.upstash/context7) — a listing page pushed on change.
- [XML sitemap](https://ai.mcpharbor.dev/sitemap.xml) — index of all active MCP servers.
- [MCP servers Atom feed](https://ai.mcpharbor.dev/feed.xml) — newest listings, pushed through WebSub.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@lbesecker195
lbesecker195 merged commit b48801e into main Sep 22, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Server pages are undiscoverable: no sitemap, no feed, no push to IndexNow or WebSub

1 participant