{"name":"page.anew/anew","title":"anew","description":"Encode self-contained HTML pages into shareable URLs.","version":"1.0.0","websiteUrl":"https://anew.page","repository":{"url":"https://github.com/round/anew.page","source":"github"},"icons":[{"src":"https://anew.page/anew.png","mimeType":"image/png","sizes":["any"]},{"src":"https://anew.page/anew.svg","mimeType":"image/svg+xml","sizes":["any"]}],"remotes":[{"type":"streamable-http","url":"https://anew.page/mcp"}],"serverInfo":{"name":"anew","version":"1.0.0"},"transport":{"type":"streamable-http","endpoint":"https://anew.page/mcp"},"capabilities":["tools","prompts","resources"],"extensions":{"io.modelcontextprotocol/ui":{"mimeTypes":["text/html;profile=mcp-app"]}},"protocolVersions":["2026-07-28","2025-11-25"],"serverUrl":"https://anew.page/mcp","tools":[{"name":"anew_write","description":"Put markup and inline CSS in html. For calculations, inputs, buttons, or other interactivity, put raw JavaScript in javascript. Never put <script> tags or inline event handlers in html, and never wrap javascript in <script> tags; the server inserts it before </body>. Encode a self-contained HTML document (or fragment, or plain text) into an anew.page URL and return that URL. Each encoding path is deterministic: the same input through the same path always produces the same URL. Different paths use different Brotli encoders, though, so the same HTML may mint different — equally valid — URLs; compare pages by their decoded HTML, never by slug. Inline all CSS, JS, and images (data: URIs, inline SVG, CSS gradients, or emoji) — the page should render alone forever, and each external reference gambles it on someone else's host staying up. One accepted exception: a webfont is far too large to inline, so a font may load from a durable CDN with a system-stack fallback; do not fight a user who asks for one. The HTML should stay ≤ 160000 UTF-8 bytes and the encoded URL ≤ 4000 bytes — the recommended share-safe budgets, not walls: a page past either still mints, renders and serves, up to the physical ceilings (65000 URL bytes, where the edge severs the request line; 163839 decoded bytes, the server's decode cap), it may just break in some apps — the response says so with a warning. Past a ceiling the endpoint refuses with an actionable error (code url_over_budget or content_too_large). Brotli slugs (the endpoint, or a local brotli mint) put a typical page in a few hundred URL bytes; raw base64 fits only ~2900 HTML bytes share-safe — know which budget you are drafting to, and never cut page content to fit before checking the brotli path. Returns the URL as plain text — return it to the user verbatim. To revise an existing anew page, its URL is its source: read it, edit that HTML, write it again. The new URL is a separate page and the original keeps working. Read it with anew_read first, then call this with the edited HTML.","inputSchema":{"type":"object","properties":{"html":{"type":"string","minLength":1,"description":"Self-contained HTML markup and inline CSS only; no script elements, inline event handlers, or executable JavaScript. Encoded into the returned URL."},"javascript":{"type":"string","minLength":1,"description":"Optional raw client-side JavaScript. Populate for any interactive behavior. Source only — no script tags. The server inserts it immediately before </body> (or at the end when there is no body)."}},"required":["html"],"additionalProperties":false},"_meta":{"ui":{"resourceUri":"ui://anew/page-view"},"ui/resourceUri":"ui://anew/page-view","openai/toolInvocation/invoking":"Minting page…","openai/toolInvocation/invoked":"Page minted"}},{"name":"anew_read","description":"Pass an anew.page URL, get back the HTML document encoded in it, plus its canonical URL and byte size. (Two in-page tools share this name and take no arguments: the editor's reads the document open in the editor, and a rendered page's reads the page being viewed. This one takes a url and reads that page.) To revise an existing anew page, its URL is its source: read it, edit that HTML, write it again. The new URL is a separate page and the original keeps working. Read returns the author's exact bytes — no anew-injected tags, no proxied image srcs — so it re-encodes byte-for-byte. Never re-author from a rendered page, a scraped DOM, or a screenshot: each loses the author's markup, and none is faster than reading the slug. Decoding is local and exact, so any anew URL reads — the page needs no prior visit and no fetch.","inputSchema":{"type":"object","properties":{"url":{"type":"string","minLength":1,"description":"An anew.page URL, or a bare slug. Subdomain, cosmetic-prefix and #hash forms all resolve."},"format":{"type":"string","enum":["text","resource"],"default":"text","description":"How the document rides back. \"text\" (default) is one plain text block. \"resource\" is one embedded-resource block ({type:\"resource\"}, mimeType text/html) — the typed MCP form for callers that want the page tagged as HTML rather than loose text. Same bytes both ways."}},"required":["url"],"additionalProperties":false}}],"resources":[{"uri":"ui://anew/page-view","name":"anew-page-view","title":"anew page view","description":"Interactive card rendered after anew_write: the minted URL with a copy button and its size against the share budget.","mimeType":"text/html;profile=mcp-app","annotations":{"audience":["user"]},"_meta":{"ui":{"permissions":{"clipboardWrite":{}},"prefersBorder":true},"openai/widgetDescription":"Interactive card rendered after anew_write: the minted URL with a copy button and its size against the share budget."}}],"prompts":[{"name":"anew","title":"Compose an anew.page URL","description":"Compose content and turn it into a self-contained anew.page URL. Handles fresh single-page sites, meta-refresh redirects, and converting supplied text into a page.","arguments":[{"name":"request","description":"What to build. Examples: \"a one-pager about Brutalist architecture\", \"redirect to https://example.com\", \"turn this text into a page: ...\".","required":true}]}]}