Add a landing page for the book at /book - #42
Merged
Merged
Conversation
The sidebar slot sent visitors from a 250px tile straight to a product page,
which is a cold click with no context. It now lands here, and the affiliate
link and its disclosure move to this page.
- Lead with the reader's symptom, not the cover: a server that runs but never
gets connected to
- Set out the ten problem areas and a thirty-day playbook, so the scope is
legible before anyone spends $29.99
- Offer proof that can be checked on this site -- llms.txt, the JSON API and a
listing's metadata are what the book describes
- Mark it up as schema.org/Book with both editions, and deliberately no
aggregateRating: the book has no ratings, and inventing one is a lie a
reader can check in a single click
Two bugs found while building it. Inside ~H, `@asin` reads assigns rather than
the module attribute, so every fact was an assign that did not exist. And HEEx
does not interpolate curly braces inside a <script> body, so the JSON-LD was
shipping the literal text `{raw(@structured_data)}` to crawlers; it uses EEx
and html_safe encoding now.
---
Pages affected:
- [MCP Server Optimization](https://ai.mcpharbor.dev/book) — the new landing page for the book.
- [MCP Registry](https://ai.mcpharbor.dev/) — home page of the server directory.
- [Browse MCP servers](https://ai.mcpharbor.dev/servers) — catalogue whose sidebar carries the slot.
- [Agent instructions](https://ai.mcpharbor.dev/llms.txt) — one of the proof links the page offers.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Drop the two GitHub links, source and wiki - Put the book in their place, so the Project column is not a single item - Tie the DB-IP credit to whether the geo database is actually loaded The DB-IP credit is a CC BY 4.0 licence condition on using the data, not a recommendation, so deleting it outright would have been wrong the moment geo blocking came back. Geo blocking is currently off, nothing loads that database, and the credit is therefore not shown -- and it reappears by itself if GEO_BLOCK_ENABLED is ever set, rather than depending on someone remembering. A test pins both directions, and another fails if any host other than the analytics one appears in the footer. --- Pages affected: - [MCP Registry](https://ai.mcpharbor.dev/) — home page carrying the revised footer. - [Browse MCP servers](https://ai.mcpharbor.dev/servers) — the catalogue of Model Context Protocol servers. - [MCP Server Optimization](https://ai.mcpharbor.dev/book) — the book, now linked from the footer. - [Submit a server](https://ai.mcpharbor.dev/submit) — add your own MCP server listing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
gateway.mcpharbor.dev is a sister property on the same root domain -- one Model Context Protocol endpoint covering 139 tools across 16 servers -- so it belongs beside the registry's own agent-facing entrypoints rather than being treated as an outbound link. - Add "gateway" to the header nav, next to llms.txt - Add "MCP Gateway" to the footer's For agents column, beside the MCP endpoint - Vary the anchor text between the two placements - Widen the footer's allowed-host list to cover it, and assert the header carries it too --- Pages affected: - [MCP Registry](https://ai.mcpharbor.dev/) — home page carrying the revised navigation. - [Browse MCP servers](https://ai.mcpharbor.dev/servers) — searchable catalogue of MCP servers. - [MCP endpoint](https://ai.mcpharbor.dev/mcp) — the registry's own MCP server, linked beside the gateway. - [Agent instructions](https://ai.mcpharbor.dev/llms.txt) — plain-text guide for agents. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #41.
The sidebar slot sent visitors from a 250px tile straight to a product page — a cold click with no context. It now lands on
/book, and the affiliate link and its disclosure move there.The page
tools: [], installed-then-removed, a README serving nobody, measuring traffic instead of connects)./llms.txt, the JSON API and a listing's metadata and invites the reader to audit the advice before buying. That is a stronger and more honest credibility lever than a review score.schema.org/Bookwith both editions, for a rich result.Facts and honesty
Every fact comes from the product listing: 244 pages, ISBN 979-8174638471, published 15 September 2026, paperback $29.99, hardcover $49.99, Logan R Besecker. The prose is written for this page rather than lifted from Amazon.
No rating or bestseller claim appears anywhere, and there is deliberately no
aggregateRatingin the structured data — the book has no ratings yet, and marking one up is both a lie a reader can check in one click and a structured-data manual-action risk. A test asserts their absence.Both disclosures are on the page: the link earns a commission, and the author maintains this registry.
Two bugs found while building it
~H,@asinreadsassigns.asin— never the module attribute. Every fact in the template was reading an assign that did not exist, and the page would have raised at render.{...}inside a<script>body. The JSON-LD was shipping the literal string{raw(@structured_data)}to crawlers. It uses EEx now, withJason.encode!(escape: :html_safe)so nothing in the data can close the element early.92 tests pass, including one that parses the JSON-LD and one that pins the absence of rating claims.
Pages affected:
🤖 Generated with Claude Code