#Getting Started
uldl.sh is a text and file upload service optimized for terminal usage. Upload files via curl, get a shareable URL back. No browser required.
#Uploading
There are three ways to upload content to uldl.sh. All methods POST to your username endpoint.
Method 1: Pipe from stdin
Pipe any command output directly to uldl.sh.
Method 2: Multipart file upload
Upload a file with its original filename preserved.
Method 3: Raw body upload
Upload file contents directly as the request body.
#Downloading
Access your blobs via GET request to the returned URL.
#Listing Blobs
List all your blobs via an authenticated GET request to your username endpoint. Returns a JSON array of blob metadata.
Query Parameters
| Parameter | Description | Example |
|---|---|---|
| search | Search in title, filename, description | "config" |
| visibility | Filter by public or private | "private" |
| language | Filter by programming language | "python" |
| category | Filter by category | "config" |
| tags | Comma-separated tags | "docker,prod" |
Response Format
Returns a JSON array of blob objects. Each object contains metadata only — no file content.
[
{
"slug": "abc123",
"title": "My Config",
"filename": "config.yaml",
"mimeType": "text/yaml",
"sizeBytes": 1234,
"language": "yaml",
"visibility": "private",
"tags": ["config", "production"],
"createdAt": "2026-03-28T12:00:00.000Z",
"updatedAt": "2026-03-28T12:00:00.000Z"
}
]#Request Headers
Customize your uploads with these optional headers.
| Header | Description | Example |
|---|---|---|
| X-Title | Set blob title | "My Config File" |
| X-Description | Set description | "Production settings" |
| X-Visibility | public or private | "private" |
| X-Language | Force syntax highlighting | "python" |
| X-Category | Set category | "config" |
| X-Tags | Comma-separated tags | "docker,config" |
| X-Filename | Override filename (raw uploads) | "script.sh" |
| X-Message | Version commit message (PUT only) | "Fix typo" |
#Visibility & Privacy
Blobs are private by default. Public blobs can be accessed by anyone with the URL. Private blobs require your authentication key.
#Authentication
Your access key is a unique 24-character token generated when you sign up. Find it in your dashboard by clicking the curl command button. Use it to access private blobs and delete blobs.
#Versioning
Every blob maintains a version history. Update a blob via PUT to create a new version. The latest version is always served by default.
Via MCP, pass the slug parameter to the upload tool to update an existing blob instead of creating a new one.
Version history can be viewed and managed from your dashboard.
#Deleting Blobs
Delete blobs via DELETE request with your authentication key.
This removes the blob and all its versions. The storage space is immediately freed.
#Response Headers
uldl.sh returns useful metadata in response headers.
| Header | Description |
|---|---|
| X-Blob-Id | Unique blob identifier |
| X-Slug | URL slug |
| X-Storage-Used | Current storage usage (bytes) |
| X-Storage-Remaining | Remaining quota (bytes) |
| X-Version | Version number (on PUT update) |
| X-Storage-Freed | Bytes freed on delete |
| X-Blob-Title | Blob title (on download) |
#Error Handling
uldl.sh uses standard HTTP status codes.
| Status | Message | Cause |
|---|---|---|
| 400 | No file provided | Multipart request missing file |
| 400 | Empty file | Zero-byte upload |
| 401 | Unauthorized | Missing/invalid key for private blob |
| 404 | User not found | Invalid username |
| 404 | Not found | Invalid slug |
| 413 | File too large | Exceeds 4.5MB limit |
| 507 | Storage quota exceeded | User quota full |
#Limits & Quotas
Current service limits:
#MCP Integration
uldl.sh supports the Model Context Protocol (MCP) — an open standard for connecting AI agents to external tools and data sources. Connect your AI coding assistant to uldl and it can upload, download, search, and manage files on your behalf.
Why give your AI agent blob storage?
Agents can save work products — code, configs, notes, outputs — that survive after the session ends. No more losing everything when the context window resets.
One agent uploads a file, another retrieves it. Bridges the gap between different AI tools and workflows — your coding agent can hand off data to your research agent.
Agent on your laptop uploads, agent on your server downloads. No manual scp or rsync needed — just ask your AI to "save this to uldl" and pull it from anywhere.
Agents can organize files with tags, categories, and descriptions, then search and retrieve them later. Acts as a lightweight external memory that any agent can tap into.
Share snippets, configs, or outputs with teammates by making blobs public. Your agent can publish results to a URL anyone can curl.
Connecting
You need your username and access key (available in the dashboard). Then pick your client:
Claude Code
Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"uldl": {
"type": "http",
"url": "https://uldl.sh/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_ACCESS_KEY",
"x-uldl-username": "YOUR_USERNAME"
}
}
}
}Claude Desktop
Add to your Claude Desktop config:
{
"mcpServers": {
"uldl": {
"type": "http",
"url": "https://uldl.sh/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_ACCESS_KEY",
"x-uldl-username": "YOUR_USERNAME"
}
}
}
}Available Tools
Once connected, your AI agent has access to these tools:
| Tool | Description | Key Parameters |
|---|---|---|
| upload | Upload new or update existing content | content, slug, message, title, filename, visibility, tags |
| download | Download a blob by slug | slug |
| list | Search and list blobs | search, language, category, visibility, tags |
| delete | Delete a blob by slug | slug |
| get_storage_info | Check storage usage and quota | — |
Example Usage
Once connected, just ask your AI agent in natural language:
"Save this deployment config to uldl so I can pull it on the server"
"Upload the test results and tag them with ci and staging"
"Find the Python script I uploaded last week about data migration"
"Download the config from uldl slug abc123 and apply it here"
"How much storage do I have left on uldl?"
#Real-World Examples
Common use cases and shell integrations.