feat(docs): document the MCP server and list GitHub releases - #24
Merged
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
There are a couple of user-facing robustness/docs issues (clipboard copy failure handling and self-host vs hosted MCP URL clarity) that should be addressed before approval.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Adds first-class documentation for the docs site’s MCP endpoint and introduces a Releases page that renders GitHub releases at request time (with server-side caching) so the docs don’t lag behind published versions.
Changes:
- Add
/releasespage backed by a cached Nitro API endpoint that fetches and parses GitHub releases. - Add “Doc MCP server” getting-started page plus an install UI component with IDE-specific deeplinks.
- Configure MCP handshake metadata and disable prerendering for the MCP + releases routes to avoid freezing build-time origins/data.
File summaries
| File | Description |
|---|---|
| apps/docs/server/api/releases.get.ts | New cached API endpoint to fetch GitHub releases and parse bodies into an MDC AST. |
| apps/docs/nuxt.config.ts | Sets MCP server name/description and adds routeRules to disable prerender for /releases and /getting-started/mcp. |
| apps/docs/content/4.releases.md | New top-level Releases page that embeds the GitHub releases component. |
| apps/docs/content/1.getting-started/2.mcp.md | New MCP documentation page describing endpoint, tools, and install instructions. |
| apps/docs/app/components/mdc/McpInstall.vue | New UI component that builds origin-based MCP URLs and provides install/copy actions. |
| apps/docs/app/components/mdc/GithubReleases.vue | New UI component to fetch and render the releases list (loading + error states). |
Review details
- Files reviewed: 6/6 changed files
- Comments generated: 2
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
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.
What this changes
Closes #23
Two pages on the documentation site: Doc MCP server, under Getting Started, and Releases, a
top-level entry that reads the GitHub releases API at request time.
Why
The MCP server has been live on
/mcpsince Docus started serving it, complete with a deeplink routefor Cursor and VS Code, and nothing on the site pointed at it. The releases only existed on GitHub,
so the docs stopped at "install it" and never said what had changed since.
What's in it
mcp.nameandmcp.descriptioninnuxt.config.ts. The handshake advertised"name": "". Clients list the server by that name, and/mcp/deeplinkputs it in the installpayload, so it was worth fixing before pointing readers at it.
The install buttons (
McpInstall.vue). Cursor and VS Code go through the module's own/mcp/deeplink?ide=…route. Claude usesclaude.ai/customize/connectors?modal=add-custom-connector&connectorName=…&connectorUrl=…, whichAnthropic added in May — it pre-fills the
dialog and claude.ai then asks the user to confirm the URL, since the link comes from outside.
ChatGPT has no equivalent deeplink, so it is documented by hand instead of given a button that would
not do what the others do.
Every URL is built from the request origin, so a self-hosted docs instance hands out its own endpoint
rather than
shhh-docs.thoda.dev.The releases page (
server/api/releases.get.ts+GithubReleases.vue). The handler caches for30 minutes: unauthenticated GitHub allows 60 calls an hour per IP, and that budget is shared by every
visitor of the instance, so a per-hit fetch would get a busy instance rate-limited.
Two
routeRuleswithprerender: false.crawlLinksis on, so both pages would otherwise bebaked at build time — freezing the release list, and worse, freezing the MCP URLs to the
prerenderer's
http://localhost. Vue does not correct that kind of attribute mismatch on hydrationin a production build, so the Claude button would have shipped pointing at localhost. Verified on a
production build behind a
Host:header that both pages now render the right origin.Checks
pnpm lint,pnpm typecheckandpnpm testpass (119 tests) — though all three are scoped toapps/app, which this branch does not touch. The check that matters here ispnpm --filter docs exec nuxt buildfollowed by serving.output, which is what I ran.closer read:
parseMarkdownand rendered throughthe docs' prose components — no
v-htmlanywhere. Butremark-mdcis enabled, so a::componentwritten into a GitHub release body would resolve against the site's global components. Only a
maintainer can publish a release, so the input is trusted, but it is worth knowing that the trust
boundary is "whoever can publish a release", not "nothing".
docus/server/mcp/tools/rather than taking the page's word for it.AI assistance
handler, and verified them against a dev and a production build. I reviewed the result and
retitled the MCP page to make clear it is the documentation's server, not the tool's.
🤖 Generated with Claude Code