Repository navigation
v0.17.0
AI assistants can read a private deployment as the person who connected
them, through an MCP server the site's Worker serves; it is off unless a
project turns it on. Search returns the passages that match, and the content
health page names documents too long for an assistant to read whole. See
ADR-041,
ADR-042
and
ADR-043;
the last two are proposed, and their numbers are starting points, each a
setting.
Breaking
- The
syncsection ofsite.config.jsonrefuses a setting it does not
know, asmcpdoes, so a misspelled line fails instead of falling back to
its default. Remove any stray key from it.
Added
- An MCP server, with
"mcp": { "enabled": true }insite.config.json,
on a deployment whose every environment is private and hassignIn.- Any assistant connects at
https://<host>/mcp— claude.ai, ChatGPT,
Claude Code, Cursor — by CIMD or dynamic registration, through one
consent page and the site's own Google sign-in. The grant keeps the
person's Google ID only, and every request needs thekb:readscope. searchandfetchread the person's groups from the directory snapshot
on every request, so an assistant sees exactly what its person may open
on the site, and a stale snapshot opens only what every member reads. A
document is judged by the build's own list, never by the bucket.searchreturns up to ten documents, each with up to three passages that
matched, its folders and when it changed. A passage counts only when the
reader may read the class it came from.fetchreturns a document's
Markdown, cut atmcp.fetchCharacters.- Every five minutes the Worker publishes the build's Markdown to an R2
bucket and asks AI Search to index it; a rollback publishes its own build. mcp.searchandmcp.fetchCharacterstune the search per project, each
optional and checked against the range AI Search accepts.ctcdocs-sync validaterequires, with the server on, each environment's
ownOAUTH_KVnamespace,KB_DOCUMENTSbucket andKB_SEARCHinstance,
theglobal_fetch_strictly_publicflag and the five-minute cron. With it
off, the bindings may stay.- The access smoke test checks that
/mcpasks for a token after a deploy;
after a rollback, which may restore a version without the server, it does
not require it. - The denial suite publishes the fixture build and asks both tools for
every document as each reader.
- Any assistant connects at
- Long documents on the content health page. The sync measures every
page's Markdown version, the textfetchreturns, and notes a Google Doc
oversync.largeDocumentCharacters(40,000 characters unless the project
sets it) under Improve, as worth splitting, and one over
mcp.fetchCharacters(100,000 with the server off) under Fix next, since
assistants read only its beginning. A long PDF is noted, not told to split.
The sync report records the lines it measured against, and the denial suite
requires the documentsfetchcuts to be the ones the report names. @ctcstack/ctcdocs-core/published-markdown, the one serializer of a
page's Markdown version, which the site serves and the sync measures.
Changed
- The Pagefind check searches for the first document of each format before
the rest, so a PDF's page is always among its cases. - The rollback workflow tells the smoke test that it restores an older
version.
Upgrade note
Bump the packages and the workflow pins. Check that the sync section holds
only generatedBy, commitBotName, defaultLocale, largeImageMegabytes
and largeDocumentCharacters. The next sync writes the length notes.
To turn the MCP server on, follow
Step 16
and Cloudflare setup: per
environment, an OAuth namespace, a documents bucket and an AI Search instance,
and the account's AI Search token once.