# 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