# Twist > Twist (https://twist.tools) hosts the small web tools people make. A tool is a folder of static files with index.html at the top. It gets a page at https://twist.tools// where people use it live, plus a spot on its creator's profile. Tools are private until their creator makes them public. ## Connect - Claude Code: claude mcp add --scope user --transport http twist https://twist.tools/mcp - Claude (web, desktop and phone; Claude Code signed in with the same account gets it too): open claude.ai/customize/connectors/yours, click Add, then Add custom connector. Name it Twist, URL https://twist.tools/mcp, then Connect and Allow. - ChatGPT (paid plans): open chatgpt.com/plugins, click Add, then Add custom MCP server. Name it Twist, server URL https://twist.tools/mcp, keep OAuth, create it, then Connect and Allow. - Cursor (~/.cursor/mcp.json): { "mcpServers": { "twist": { "url": "https://twist.tools/mcp" } } } - VS Code (.vscode/mcp.json): { "servers": { "twist": { "type": "http", "url": "https://twist.tools/mcp" } } } - Anything else: a remote MCP server at https://twist.tools/mcp (streamable HTTP, OAuth). Clients without browser sign-in can send a token from https://twist.tools/connections as "Authorization: Bearer twist_...". In Claude Code, two prompts become slash commands: /mcp__twist__publish (get the current folder ready and publish it) and /mcp__twist__new_tool (build a tool from an idea and publish it). ## Commands - publish_tool: publish a folder inline. Every file with its path; text in "content", binary in "base64". Best for small folders of text files. Pass "tool" (its slug, URL or id) to publish a new version. - get_upload_link: publish a zip instead, for images, fonts, wasm, media, or anything over about 1 MB. Returns a one-time link; PUT the zip to it with curl. - update_tool: name, tagline, about, source link, visibility (private or public), and remixable (on by default). Only make a tool public, or change remixing, when the person asks. Going public needs a tagline and a version that passed its checks. - list_my_tools: the person's tools with slugs and links. Check it before publishing so updates go to the right tool. - get_versions: version history with notes and checks. - get_tool_source: the files of a tool, to edit it when the folder isn't on this machine. Text comes back up to about 400 KB in all; binary files are only listed. - There's no delete command: the person deletes a tool in its editor. ## The folder - index.html at the top. Built output only: for Vite, React or Svelte, build first and publish dist/ (Vite: base: './'). - Relative paths everywhere: ./app.js, assets/photo.png. Paths starting with / don't load, because each tool is served from its own sub-path. - twist.json: { "name": "Dither", "description": "Ordered and error diffusion dithering for any image", "network": ["fonts.googleapis.com", "fonts.gstatic.com"], "permissions": ["camera"] } - name: up to 40 characters. description: the one-line tagline, up to 80. - network: every other host the tool loads from or calls, or the browser blocks it. That includes a library from a CDN (a script tag or an import map), web fonts (Google Fonts needs both fonts.googleapis.com and fonts.gstatic.com), images, APIs and WebSockets, the hosts a library downloads from on its own (wasm, models, decoders, map tiles), and wherever a download redirects. Leave it out if the tool touches nothing. Bundling the files into the folder is better: nothing to list, and nothing to break if a CDN changes. three.js 0.171 and later needs both three.module.min.js and three.core.min.js. Only APIs that work without a secret key: Twist doesn't hold keys, and tools can't ask people for theirs. - Not possible even when listed: other sites in a frame (YouTube embeds and the like), forms that send to another site (use fetch to a listed host instead), and SharedArrayBuffer (so no multithreaded wasm). - permissions, only if used: camera, microphone, midi, clipboard-read, screen-capture, autoplay. Copying to the clipboard, downloads, full screen, pointer lock and dialogs work without asking. - README.md becomes the About section: a short paragraph on what the tool is, then numbered steps on how to use it. - twist.json and README.md are the source of truth: each publish that includes them replaces the name, tagline and about. Changes made with update_tool or in the studio last until the next such publish. ## The frame - On laptops the tool sits under a 40px header, with a small pull tab over its left edge. On phones it gets the whole screen except a 34px tab at the bottom. Fill the frame (100% width and height) and respond to resizing. - A layout that works well: the canvas or preview on one side, a compact controls panel on the other, stacking on phones. - Add an export where it makes sense: download PNG or SVG, or copy to clipboard. - Don't scroll the page itself; panels inside the tool can scroll. - Work at phone width. - Load with a good default so the tool looks alive before anyone touches it. Each new version gets a fresh screenshot as its cover, until the person adds their own image. ## Saving data - Each tool runs on its own address, so localStorage and IndexedDB work like on any site. What it saves stays in each person's browser, separate from other tools, and carries over to new versions. There's no server storage. ## Checks on every version - Blocked: no index.html at the top, API keys in the code, apps or installers, an invalid twist.json or more than 20 hosts, going over the limits. - Held for the safety check: password fields. Tools can't ask for passwords or keys. - Warned: hosts the code loads from that "network" doesn't list (script and link tags, import maps, CSS, imports, fetch, WebSockets, workers, library loaders, and the second host some need, like fonts.gstatic.com), frames and forms pointing at other sites, paths starting with /, unbuilt source files. - After publishing, a browser opens the page and get_versions shows what it found: errors, and anything the browser blocked when the page ran, which catches what reading the code can't. When the creator opens their own tool, Twist tells them about anything blocked and adds it there too. ## The safety check Before anyone else sees a version (when a tool goes public, and each new version of a public tool), an automatic check looks at its screenshot, text and code for phishing, scams, wallet drainers and anything collecting passwords, keys or card details. It takes about a minute; visitors keep the previous version until the new one passes, and get_versions shows where it stands (checking, live, held or blocked). Private versions aren't checked. Ordinary creative tools pass. A mockup of a login screen is fine as long as it doesn't send what people type anywhere. ## Limits 500 files, 25 MB in total, 10 MB per file. Static files only, no server code. Each account has 500 MB across its tools and media, and every kept version counts; a tool keeps the files of its newest 10 versions.