You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Add a public docs.plus/mcp page so web search finds the MCP connector #458
An AI agent that searches the web for "connect docs.plus to Claude" does not find the MCP connector. The setup guide lives only on GitHub (docs/mcp/README.md). The homepage never mentions MCP. The sitemap lists only /, /privacy and /terms. This issue adds one public, indexable page.
Baseline: on 2026-10-07, a web search for "docs.plus MCP server URL connect Claude" did not return docs.plus. That is one search backend, so it is a baseline, not proof. Outside the Claude directory, Claude finds a connector only through web search (Anthropic).
Parent: #230. Sibling: #459, which links to this page. The directory listings stay in #388 (OpenAI) and #389 (Claude).
What to build
The page
A static Pages route, apps/webapp/src/pages/mcp.tsx, inside the locked design system. Render it with LegalPage and LegalSection (apps/webapp/src/components/pages/legal/LegalPage.tsx), as pages/privacy.tsx does. Pass path="/mcp".
LegalPage already writes the <Head> block: title, description, robots index, follow, canonical URL and OG tags. Do not copy that block.
LegalPage always prints Last updated {LEGAL_UPDATED} (line 52). That is the legal-page date, and it is wrong on /mcp. Add one optional prop, showUpdated, that defaults to true. Only /mcp passes showUpdated={false}, so /privacy and /terms stay unchanged. Add no new tokens.
Content:
title (the H1 and the <title>): "Use docs.plus from Claude, ChatGPT and other AI apps".
description: "Connect docs.plus to Claude, ChatGPT, Claude Code, Codex, Cursor or VS Code with one MCP server URL."
The server URL as plain text, from mcpServerUrl(). Production shows https://prodback.docs.plus/api/mcp. A self-hosted build shows its own.
One plain-text line per app: Claude, ChatGPT, Claude Code, Codex, Cursor and VS Code. The Claude, ChatGPT, Cursor and VS Code lines say where to paste the server URL. Take the wording from Settings › Connected apps (apps/webapp/src/components/settings/components/ConnectCard.tsx).
The Claude Code and Codex lines show the add command. Build it from mcpServerUrl() and spell it as ConnectCard.tsx does (server name docs-plus). Show each command as text in a code element, not as a button.
No app deep links. The Claude link is undocumented (see the comment in ConnectCard.tsx). A second copy of the Cursor and VS Code encoders would drift. Export nothing from ConnectCard.tsx.
A link to the full guide, from MCP_GUIDE_URL (apps/webapp/src/components/settings/constants.ts:54). Do not write a second guide URL.
docs/mcp/README.md stays the one full guide. The page carries only the URL and one-liners.
The server URL helper
Move apps/webapp/src/components/settings/utils/mcpServerUrl.ts unchanged to apps/webapp/src/utils/mcpServerUrl.ts. The public page is a second, unrelated consumer, so apps/webapp/CLAUDE.md §Webapp Module Layers puts it in @utils/.
Update its two importers: settings/components/ConnectCard.tsx and settings/hooks/useMcpServerStatus.ts. Do not add it to utils/index.ts.
Route lists
Add /mcp to these lists:
INDEXABLE_PATHS (apps/webapp/src/components/pages/home/homeMetadata.ts:25), so the page enters the sitemap.
UTILITY_PATHS (apps/webapp/src/utils/routePolicy.ts:10). Without it, isDocumentAsPath('/mcp') is true. A client navigation to /mcp would then load the document stylesheet (apps/webapp/src/pages/_app.tsx:156).
RESERVED_SLUGS (apps/webapp/src/utils/reservedSlugs.ts:5) and ROUTE_SLUGS (apps/hocuspocus.server/src/modules/mcp/infra/documentStore.ts:59), as mcp. Then no new document can take that slug.
No src/proxy.ts change is needed. Its matcher treats /mcp the same as /privacy.
Footer and area notes
In apps/webapp/src/components/pages/home/HomeFooter.tsx, add one Link to /mcp with the text AI apps. Put it after Terms, in the nav at line 44, styled like Privacy and Terms.
That nav has aria-label="Legal". Change it to aria-label="Site", because the new link is not legal.
In apps/webapp/CLAUDE.md §Landing Page Shell And PWA, the line on public legal pages names /privacy and /terms. Add /mcp there: it uses LegalPage, is a utility route, and is in INDEXABLE_PATHS.
MCP Server Cards and /.well-known/ai-catalog.json: SEP-2127 is Final since 2026-10-06, but no shipping client reads them yet.
llms.txt: rejected on 2026-09-22.
<link rel> hints: no spec defines one.
A homepage section instead of a page. One URL is easier for search to rank, and the landing bundle stays small.
Changes to docs/mcp/README.md.
Acceptance criteria
Locally, /mcp returns 200. Its HTML holds <meta name="robots" content="index, follow"> and the server URL.
Locally, /sitemap.xml lists /mcp.
The page shows the server URL from mcpServerUrl() and one line per app. It shows no "Last updated" line.
/privacy and /terms still show their "Last updated" line.
On the home page, opening a document named "MCP" goes to a random slug, not /mcp (apps/webapp/src/utils/sanitizeDocumentSlug.ts:26).
create_document with the title "MCP" creates the slug mcp-document (documentStore.ts:76).
In light and dark, the page uses only LegalPage / LegalSection styling and existing tokens.
At 375px wide, the page does not scroll sideways. A long command scrolls inside its own code box, as CopyLine does (ConnectCard.tsx:43).
The home footer shows AI apps, and that nav is labelled Site.
Verify
Run bun run --filter @docs.plus/webapp typecheck and bun run --filter @docs.plus/hocuspocus typecheck.
Run the webapp locally. Open /mcp in light, in dark, and at 375px wide. View the page source: it holds the server URL and robots index, follow.
Open /sitemap.xml: it lists /mcp.
On the home page, check the footer link. Type "MCP" as a document name and open it: the slug is random.
From a connected app on the local server, call create_document with the title "MCP": the slug is mcp-document.
After it ships (does not block close)
https://docs.plus/mcp is live and listed in https://docs.plus/sitemap.xml.
Discovery check, 2 to 4 weeks after launch. In fresh sessions with web search on and no docs.plus connector, ask "How do I connect docs.plus to Claude? What is its MCP server URL?" in claude.ai, ChatGPT search and Claude Code. It passes when the answer contains the server URL with no hints. Post the results as a comment, next to the 2026-10-07 baseline.
Open decision
A document with the slug mcp may already exist in production. The new route would hide it. Recommended: if it exists, ship the page at /connect instead. The file is then pages/connect.tsx, and every list, path and link above uses connect. Leave the document alone, because moving it breaks links already shared. Owed before merge: the maintainer checks both slugs, mcp and connect, in production. Publish docs.plus to the official MCP Registry #459 uses the route this decision picks.
Summary
An AI agent that searches the web for "connect docs.plus to Claude" does not find the MCP connector. The setup guide lives only on GitHub (
docs/mcp/README.md). The homepage never mentions MCP. The sitemap lists only/,/privacyand/terms. This issue adds one public, indexable page.Baseline: on 2026-10-07, a web search for "docs.plus MCP server URL connect Claude" did not return docs.plus. That is one search backend, so it is a baseline, not proof. Outside the Claude directory, Claude finds a connector only through web search (Anthropic).
Parent: #230. Sibling: #459, which links to this page. The directory listings stay in #388 (OpenAI) and #389 (Claude).
What to build
The page
A static Pages route,
apps/webapp/src/pages/mcp.tsx, inside the locked design system. Render it withLegalPageandLegalSection(apps/webapp/src/components/pages/legal/LegalPage.tsx), aspages/privacy.tsxdoes. Passpath="/mcp".LegalPagealready writes the<Head>block: title, description,robots index, follow, canonical URL and OG tags. Do not copy that block.LegalPagealways printsLast updated {LEGAL_UPDATED}(line 52). That is the legal-page date, and it is wrong on/mcp. Add one optional prop,showUpdated, that defaults totrue. Only/mcppassesshowUpdated={false}, so/privacyand/termsstay unchanged. Add no new tokens.Content:
title(the H1 and the<title>): "Use docs.plus from Claude, ChatGPT and other AI apps".description: "Connect docs.plus to Claude, ChatGPT, Claude Code, Codex, Cursor or VS Code with one MCP server URL."mcpServerUrl(). Production showshttps://prodback.docs.plus/api/mcp. A self-hosted build shows its own.apps/webapp/src/components/settings/components/ConnectCard.tsx).mcpServerUrl()and spell it asConnectCard.tsxdoes (server namedocs-plus). Show each command as text in acodeelement, not as a button.ConnectCard.tsx). A second copy of the Cursor and VS Code encoders would drift. Export nothing fromConnectCard.tsx.MCP_GUIDE_URL(apps/webapp/src/components/settings/constants.ts:54). Do not write a second guide URL.docs/mcp/README.mdstays the one full guide. The page carries only the URL and one-liners.The server URL helper
apps/webapp/src/components/settings/utils/mcpServerUrl.tsunchanged toapps/webapp/src/utils/mcpServerUrl.ts. The public page is a second, unrelated consumer, soapps/webapp/CLAUDE.md§Webapp Module Layers puts it in@utils/.settings/components/ConnectCard.tsxandsettings/hooks/useMcpServerStatus.ts. Do not add it toutils/index.ts.Route lists
Add
/mcpto these lists:INDEXABLE_PATHS(apps/webapp/src/components/pages/home/homeMetadata.ts:25), so the page enters the sitemap.UTILITY_PATHS(apps/webapp/src/utils/routePolicy.ts:10). Without it,isDocumentAsPath('/mcp')is true. A client navigation to/mcpwould then load the document stylesheet (apps/webapp/src/pages/_app.tsx:156).RESERVED_SLUGS(apps/webapp/src/utils/reservedSlugs.ts:5) andROUTE_SLUGS(apps/hocuspocus.server/src/modules/mcp/infra/documentStore.ts:59), asmcp. Then no new document can take that slug.No
src/proxy.tschange is needed. Its matcher treats/mcpthe same as/privacy.Footer and area notes
apps/webapp/src/components/pages/home/HomeFooter.tsx, add oneLinkto/mcpwith the textAI apps. Put it after Terms, in thenavat line 44, styled like Privacy and Terms.navhasaria-label="Legal". Change it toaria-label="Site", because the new link is not legal.apps/webapp/CLAUDE.md§Landing Page Shell And PWA, the line on public legal pages names/privacyand/terms. Add/mcpthere: it usesLegalPage, is a utility route, and is inINDEXABLE_PATHS.Out of scope
/.well-known/mcp: SEP-1649 closed on 2026-01-26./.well-known/ai-catalog.json: SEP-2127 is Final since 2026-10-06, but no shipping client reads them yet.llms.txt: rejected on 2026-09-22.<link rel>hints: no spec defines one.docs/mcp/README.md.Acceptance criteria
/mcpreturns 200. Its HTML holds<meta name="robots" content="index, follow">and the server URL./sitemap.xmllists/mcp.mcpServerUrl()and one line per app. It shows no "Last updated" line./privacyand/termsstill show their "Last updated" line./mcp(apps/webapp/src/utils/sanitizeDocumentSlug.ts:26).create_documentwith the title "MCP" creates the slugmcp-document(documentStore.ts:76).LegalPage/LegalSectionstyling and existing tokens.codebox, asCopyLinedoes (ConnectCard.tsx:43).AI apps, and thatnavis labelledSite.Verify
bun run --filter @docs.plus/webapp typecheckandbun run --filter @docs.plus/hocuspocus typecheck./mcpin light, in dark, and at 375px wide. View the page source: it holds the server URL androbots index, follow./sitemap.xml: it lists/mcp.create_documentwith the title "MCP": the slug ismcp-document.After it ships (does not block close)
https://docs.plus/mcpis live and listed inhttps://docs.plus/sitemap.xml.Open decision
mcpmay already exist in production. The new route would hide it. Recommended: if it exists, ship the page at/connectinstead. The file is thenpages/connect.tsx, and every list, path and link above usesconnect. Leave the document alone, because moving it breaks links already shared. Owed before merge: the maintainer checks both slugs,mcpandconnect, in production. Publish docs.plus to the official MCP Registry #459 uses the route this decision picks.