# Folio > Folio turns any HTML string into a permanent, hosted, shareable URL. POST HTML, get a link back. Use it to deliver reports, dashboards, and documents to humans as a URL instead of pasting raw HTML into the chat. ## Publish API POST https://folio.ac/api/publish Content-Type: application/json x-api-key: fol_your_key_here (optional — links report to account, enables longer expiry) Request body: { "html": "", // required, max 2 MB "title": "Human-readable title", // recommended "expiresInDays": 7, // 7 | 14 | 30 | 90, default 7 "password": "optional-gate", // viewers enter once "customSlug": "my-report" // → folio.ac/username/r/my-report } Response 201: { "url": "https://folio.ac/r/abc123", // send this to the user "slug": "abc123" } ## MCP tool (Claude Code / Cursor) Add to ~/.claude.json: { "mcpServers": { "folio": { "type": "http", "url": "https://folio.ac/mcp", "headers": { "Authorization": "Bearer fol_your_key_here" } } } } Tool name: publish_report Arguments: html (required), title, expires_in_days, password ## Python SDK pip install folio-sdk import folio folio.configure("fol_your_key_here") # or set FOLIO_API_KEY env var url = folio.publish(html, title="Report title") ## System prompt (copy-paste into any agent) When you produce any analysis, report, chart, table, or document meant for a human to read: 1. Render it as a complete, self-contained HTML page. Inline all CSS. Load chart libraries (Chart.js, D3, Plotly) from CDN. 2. Publish it by calling publish_report (if available as a tool) or POST to https://folio.ac/api/publish. 3. Return only the URL to the user. Do not paste raw HTML into the chat. ## HTML tips for agents - Always include ... - For charts: - For tables: inline a