Use CurlyFlies with Claude

Your agent makes the file.
This MCP serves it.

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.

Two-minute setup.

One JSON block, one restart. Works in Claude Desktop and Claude Code.

STEP 01

Get an API key

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).

STEP 02

Add the MCP server to your config

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"
    }
  }
}
STEP 03

Restart Claude

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.

The four tools.

Mirrors of the REST API — every upload returns url, expires_at, file_id, and a delete_token.

upload_file

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.

upload_from_url

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.

get_file_info

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_file

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.

Free plan, honestly: 100 uploads/month, 5MB max per file, and a fixed 24-hour TTL — plenty for trying the MCP server and same-day posts. If your agent schedules content further out, you’ll need a paid plan: Builder gives TTLs up to 30 days, Pro 60, Scale 90. Plans →

What it looks like in practice.

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.

You Generate a product teaser image for the spring launch and post it to our Instagram.
Claude I’ll generate the image first, then re-host it on a public URL Instagram’s crawler can fetch, then create the post.
Tool call · image generation generate_image(prompt: "spring launch product teaser…") → https://oaidalle...blob.core.windows.net/...?se=2026-06-12T10:41Z (signed, expires ~1h)
Tool call · curlyflies upload_from_url(url: "https://oaidalle...", ttl_seconds: 604800) → { url: "https://curlyflies.com/f/x7k2p9.png", expires_at: "2026-06-19T09:41:00Z" }
Tool call · instagram create_media(image_url: "https://curlyflies.com/f/x7k2p9.png", caption: "…") → container created — crawler validation passed
Claude Posted. The image is hosted at a public URL valid until June 19 — comfortably past the publish — and will delete itself afterward.

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 →

Frequently asked questions.

How do I connect CurlyFlies to Claude Desktop or Claude Code?

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.

Why does my agent’s Instagram post fail with error 9004?

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 →

What TTL should the agent set?

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).

Can the agent get its own API key?

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.

Is there agent-readable documentation?

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.

One config block. Four tools. Zero babysitting.

Paste, restart, and your agent stops shipping URLs that die.

{
  "mcpServers": {
    "curlyflies": {
      "url": "https://mcp.curlyflies.com/mcp",
      "apiKey": "your_key_here"
    }
  }
}