One config block gives Claude Desktop and Claude Code four tools for publish-grade hosting. Ask for “generate an image and post it” and the agent re-hosts the file on a crawler-proof public URL by itself — no copy-pasting signed URLs that die in an hour.
One JSON block, one restart. Works in Claude Desktop and Claude Code.
From the dashboard — or let the agent provision its own key via POST /v1/agent/signup (no human required, rate-limited to 5 signups/hour per IP).
Claude Desktop: Settings → Developer → Edit Config (claude_desktop_config.json). Claude Code: add the same block to .mcp.json in your project (or ~/.claude.json for all projects).
{
"mcpServers": {
"curlyflies": {
"url": "https://mcp.curlyflies.com/mcp",
"apiKey": "your_key_here"
}
}
}
The four tools below appear in the agent’s toolbox. You don’t call them yourself — Claude reaches for them whenever a task needs a public URL.
Mirrors of the REST API — every upload returns url, expires_at, file_id, and a delete_token.
Upload a local file (or base64 content) and get back a public URL with the correct Content-Type. Accepts ttl_seconds or an absolute expires_at. Use when the agent has the bytes on disk — a render, a chart, a generated PDF.
Re-host a remote file server-side — the tool the agent reaches for after generating an image. Hands it the expiring signed URL from GPT Image, Nano Banana, Seedream, or Replicate; gets back a stable public URL. The bytes never pass through the conversation.
Check whether a hosted file is still live and fetch its metadata (url, expires_at, size_bytes, content_type). Agents call it before reusing a URL from earlier in a session — a 404 here saves a failed publish later.
Delete a file before its TTL expires — cleanup after a confirmed publish, or retracting something that shouldn’t have shipped. Works with the API key or the upload’s delete_token, so cleanup can be delegated to another agent.
You don’t orchestrate anything. The agent knows generation URLs expire and platform crawlers need raw bytes — so it inserts the re-host step itself.
Without the middle step, the agent would hand Instagram the raw generation URL — an expiring signed link that fails crawler validation with error 9004 whenever the run is slow or the post is scheduled. Why that happens →
Add the mcpServers block above to claude_desktop_config.json (Desktop) or .mcp.json (Claude Code), with your API key, and restart. The server lives at https://mcp.curlyflies.com/mcp — it’s a remote MCP server, so there’s nothing to install or run locally.
The agent passed Instagram a URL its crawler can’t fetch — usually an expiring signed URL from the generation API, or a share link that serves an HTML page. The crawler needs 200 + raw bytes + a real Content-Type, anonymously. Re-hosting with upload_from_url fixes it. Troubleshooting guide →
Longer than the schedule, plus margin — ttl_seconds: 604800 (7 days) covers a weekly calendar. The tools also accept an absolute expires_at datetime (“keep until June 30”), which matches how scheduling prompts are phrased. Free plan TTL is fixed at 24h; longer TTLs need Builder (30d), Pro (60d), or Scale (90d).
Yes. POST /v1/agent/signup with an email and agent name returns a key — shown once — on the free plan. Self-provisioning is rate-limited to 5 signups/hour per IP. From there the agent can poll /v1/usage to know when it’s near quota.
Yes — /llms.txt for the short version and llms-full.txt for everything, plus an OpenAPI spec at /v1/openapi.json. If you prefer plain REST over MCP, the API reference covers the same four operations — or see how CurlyFlies compares to Drive, Dropbox, S3 and the temp-file hosts.
Paste, restart, and your agent stops shipping URLs that die.
{
"mcpServers": {
"curlyflies": {
"url": "https://mcp.curlyflies.com/mcp",
"apiKey": "your_key_here"
}
}
}