01Markdown on request
Middleware I wrote inspects the Accept header on an allowlist of page routes and rewrites matching requests to a markdown renderer, returning text/markdown with Vary: Accept and an x-markdown-tokens length header. The homepage answers in 573 words of structured markdown instead of 158 KB of HTML. I have not finished per-page negotiation: the rewrite loses its __pathname parameter at runtime, so every route currently returns the site-overview document, even though my renderer produces the correct page when called directly.
02The MCP endpoint
On /mcp I implemented initialize, ping, tools/list, tools/call, resources/list and resources/read over JSON-RPC, with notification handling, an origin allowlist and CORS. Tools carry input schemas and return both text content and structuredContent. An unauthenticated call gets a 401 whose WWW-Authenticate header names the authorization server and the protected-resource metadata, so an agent can bootstrap itself from a single failed request.
03OAuth by hand
No auth library. I wrote lib/oauth.ts to build and verify RS256 JWTs on Node crypto directly: base64url header and payload, RSA-SHA256 signing, a public JWK exported for /.well-known/jwks.json, issuer, audience and expiry all checked on the way back in, scopes intersected against the configured allowlist. With no signing key configured the token endpoint returns 503 with a stated reason rather than minting unsigned tokens, and the server card reports its own status as pending_credentials.
04In-browser tools
A client component I wrote declares navigation tools on navigator.modelContext, so an agent already driving the browser can jump to a service or case study without guessing URLs. I generate the service and case-study enums from the same data module the pages render from, which means a route that does not exist cannot be offered as a tool argument. The industry enum is still a list I typed by hand and does not carry that guarantee.
05Removing the numbers
The audit found that the per-industry metrics across thirty pages were literally `42 + offset`%, where offset was the industry's position in an alphabetical list. Rather than sourcing better numbers I deleted them; my builder now returns words such as "Less manual workload" behind an explicit illustrative-outcomes disclaimer. The fix is half done. Eight case-study figures I wrote by hand are still on the site, and they are the next thing to go.