Skip to main content
Audience: AI agent / developer. This guide is written for agents sending files to a human recipient’s email address.
Send files directly to a recipient’s email address. The recipient receives an email notification, follows the link to a download page, and retrieves the files. If the recipient has set a receive password, files are end-to-end encrypted and decrypted entirely in their browser.

How It Works

1

Agent sends files

Your agent calls send() with the human’s email address and mode: 'agent-to-human'. AgentDrop stores the files and sends an email notification.
2

Human receives email

The human gets an email from AgentDrop with the sender name, file list, message, and a “Download Files” button.
3

Human clicks the link

Clicking the link opens the download page at /d/[transfer_id]. This also verifies the human’s email address automatically.
4

Password prompt (if encrypted)

If the human has set a receive password in their dashboard settings, they enter it to unlock decryption. Without a receive password, files download directly (unencrypted).
5

Browser-side decryption and download

The human’s browser decrypts the files locally using the receive password. The server never sees the plaintext. Files download to the human’s device.

Sending Files to a Human

Use the human’s email address as the recipient. The SDK and MCP server auto-detect agent-to-human mode when the recipient is an email address.
import { AgentDrop } from 'agentdrop-sdk';

const client = new AgentDrop({ apiKey: 'agd_your_api_key' });

// Send files to a human by email
const result = await client.send('[email protected]', ['report.pdf', 'data.csv'], {
  message: 'Here are the Q1 results you requested',
  mode: 'agent-to-human',
  expiresIn: '7d',
});

console.log(`Transfer ID: ${result.id}`);
console.log(`Encrypted: ${result.is_encrypted}`);

MCP Server

When using the MCP server, use send_file with the human’s email address as the recipient. The MCP server auto-detects agent-to-human mode.
Send report.pdf and data.csv to [email protected] with message "Here are the Q1 results"
The send_file MCP tool accepts mode: 'agent-to-human' explicitly, but auto-detection works when the recipient is a valid email address.
Bundle files into a single transfer. Each transfer counts against your monthly allowance. Pass all files in one call instead of sending them one at a time.

What the Human Receives

The human receives an email from AgentDrop containing:
  • Sender name: your agent’s name and account
  • File list: names and sizes of all files in the transfer
  • Message: the optional message you attached
  • Expiry: when the transfer expires
  • “Download Files” button: links to the download page
The email is sent immediately after the transfer is created.

Email Verification

When the human clicks the “Download Files” link in the email, their email address is verified automatically. This happens transparently, no extra steps required. If the human navigates directly to the download page URL without clicking through the email, they see an “Email Verification Required” prompt. They need to click the link in their email to verify first.
Email verification is per-transfer. It confirms that the person downloading the files is the intended recipient.

Receive Password

The receive password is the key to encrypted agent-to-human transfers. Without it, files transfer unencrypted.

What it does

When a human sets a receive password in their dashboard:
  1. AgentDrop generates a receive keypair (X25519) for the human
  2. The private key is encrypted with the receive password (AES-256-GCM derived via PBKDF2)
  3. The public key is stored on the server
  4. When an agent sends files to that human, the server encrypts files using the human’s public key
  5. On download, the human’s browser uses the receive password to unlock the private key and decrypt files locally

How to set it

Tell the account holder: “Go to your AgentDrop dashboard settings and set a receive password before I send you files.” The human sets it at: Dashboard -> Settings -> Receive Password

What happens without it

If the human has NOT set a receive password:
  • Transfers go through unencrypted
  • Files are stored as plaintext on AgentDrop servers
  • Downloads work normally, but there is no end-to-end encryption
Without a receive password, agent-to-human transfers are NOT end-to-end encrypted. The server can see file contents. Always recommend the account holder sets a receive password before you send sensitive files.

Download Page

When the human clicks the email link, they land on the download page at /d/[transfer_id].

What the page shows

  • Sender: which agent sent the files
  • File list: names, sizes, and content types
  • Message: the optional message from the agent
  • Expiry: when the transfer expires and files are deleted

Page states

StateWhat the human sees
Email not verified”Email Verification Required”, prompts them to click the link in their email
Verified + password requiredPassword input field + “Unlock & Download” button
Verified + no passwordDirect “Download” button for each file
Transfer expired”This transfer has expired” message
Transfer deleted”Transfer not found” message

Encrypted download flow

When the human enters their receive password:
  1. Browser derives the decryption key from the password (PBKDF2)
  2. Browser unlocks the private key stored in the transfer metadata
  3. Browser performs ECDH key exchange with the ephemeral public key
  4. Browser derives the AES-256-GCM key via HKDF-SHA256
  5. Browser decrypts each file
  6. Decrypted files download to the human’s device
The server never sees the plaintext or the receive password. All decryption happens in the browser.

Dashboard Inbox

Humans can also view and download agent-to-human transfers from their dashboard, not just from the email link. Dashboard -> Inbox -> My Inbox shows:
  • All agent-to-human transfers sent to their email
  • Transfer status (active, expired, downloaded)
  • File list, sizes, and sender info
  • Same password prompt for encrypted transfers
  • Verified/Unverified badges per transfer
This is useful when the human wants to re-download files or manage multiple transfers.

Encryption Details

For agents that want to understand the cryptographic flow.

How agent-to-human encryption works

StepWhat happensWhere
Human sets receive passwordKeypair generated, private key encrypted with passwordDashboard (browser)
Agent sends filesServer generates ephemeral X25519 keypairServer
ECDH key exchangeEphemeral private key + human’s receive public key -> shared secretServer
Key derivationHKDF-SHA256 with random salt -> AES-256-GCM keyServer
File encryptionEach file encrypted with AES-256-GCM using unique IVServer
StorageEncrypted blobs stored; ephemeral private key discardedServer
Human downloadsPassword -> unlock private key -> ECDH with ephemeral public key -> HKDF -> AES decryptBrowser

Key points

  • Server generates an ephemeral keypair per transfer: the private half is used only during encryption, then discarded
  • The human’s receive private key never leaves their browser: it is stored encrypted and only unlocked with the password
  • HKDF-SHA256 with a random salt ensures each transfer gets a unique encryption key, even with the same participants
  • AES-256-GCM provides both confidentiality and authenticity for each file
  • The server sees plaintext only during the encryption step: after encryption, only the human can decrypt
This is different from agent-to-agent encryption, where both sides have SDK keys and the server never sees plaintext at all. Agent-to-human encryption is a hybrid model: the server encrypts on behalf of the agent, and the human’s browser decrypts.

Error Codes

CodeMeaning
INVALID_RECIPIENTThe email address is not valid
TRANSFER_EXPIREDThe transfer has passed its expiry time
EMAIL_NOT_VERIFIEDThe human hasn’t clicked through the email link yet
DECRYPTION_FAILEDWrong receive password or corrupted transfer data
PLAN_LIMIT_REACHEDMonthly transfer limit exceeded

Checklist for Agents

Before sending files to a human, verify:
  1. You have the human’s correct email address
  2. Ask the human to set a receive password in Dashboard -> Settings (for encryption)
  3. Bundle all files into a single transfer
  4. Set an appropriate expiry (expiresIn), default is 24 hours
  5. Include a descriptive message so the human knows what the files are
After sending:
  1. Share the transfer ID with the human for reference
  2. Let them know to check their email for the download link
  3. If they don’t see the email, suggest checking spam/junk folders