Convert DocSend documents to PDF directly from Claude, Cursor, or any other MCP-compatible application. One config block, then just ask in plain English.
The recommended setup runs the server with uv's uvx runner. It is machine-independent (no usernames or install paths in the config) and picks up new server releases automatically. If your system lacks Python 3.11, uvx downloads a managed copy on first run.
brew install uv # macOS
# or: curl -LsSf https://astral.sh/uv/install.sh | shClaude Desktop
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json · Windows: %APPDATA%\Claude\claude_desktop_config.json
Add the docsend2pdf entry inside your existing mcpServers object (create the object if the file is new; do not replace other servers you already have):
{
"mcpServers": {
"docsend2pdf": {
"command": "uvx",
"args": ["--python", "3.11", "docsend2pdf-mcp@latest"]
}
}
}Claude Code (CLI)
claude mcp add --scope user docsend2pdf -- uvx --python 3.11 docsend2pdf-mcp@latestCursor
Add the same JSON block to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json inside a project.
Other MCP clients
Any client that supports stdio MCP servers works: configure command uvx with args ["--python", "3.11", "docsend2pdf-mcp@latest"] wherever the client defines servers.
docsend2pdf: convert_docsend, submit_verification_link and fetch_conversion. Fewer means an older version is running (see Troubleshooting)."Convert this DocSend to PDF: https://docsend.com/view/..." with any public DocSend link. The first run takes a few extra seconds while uvx downloads the package; later starts are instant.Ask your AI assistant naturally:
"Convert this DocSend to PDF: https://docsend.com/view/abc123""Convert https://docsend.com/view/xyz789 (password: mypass)""Convert https://docsend.com/view/abc123 using the email me@example.com""Save https://docsend.com/view/doc789 as report.pdf""Fetch that conversion again" (after a timeout; uses the reported task ID)Most decks ask viewers for an email address. If you have not given one, the assistant is told to ask for an address you can read before converting; the deck owner will see it. Public decks convert without an email.
docsend.com/view/... and docsend.com/v/... document links, the /view/<space>/d/<doc> links a Space uses for its documents, and docsend.com subdomains all work. A Space link (docsend.com/view/s/...) is forwarded to the service, which converts it when the Space holds a single document. A gated Space takes the same email, passcode and email-verification steps as a document. A Space that holds several documents, or that asks for something the service cannot answer, is reported back with a request for the individual document's link: open the Space in DocSend and copy that link.
Converted PDFs are saved to a docsend_pdfs folder inside your account's Downloads folder by default; the assistant replies with the exact file path.
The server exposes three tools. Your assistant fills the parameters in from your request, so you rarely need them directly.
convert_docsend
| Parameter | Required | Description |
|---|---|---|
url | Yes | The DocSend link: /view/, /v/, a Space document's /view/<space>/d/<doc> link, or a Space link (/view/s/) |
email | No | An email address you can read; the deck owner will see it. Needed for most decks, optional for public ones |
passcode | No | Password, for password-protected documents |
filename | No | Custom filename for the saved PDF (always saved inside the download folder) |
submit_verification_link
| Parameter | Required | Description |
|---|---|---|
session_id | Yes | The session ID returned by convert_docsend when verification is required |
verification_url | Yes | The unopened link behind the "Verify email address" button in the DocSend email |
fetch_conversion (new in 0.3.0)
| Parameter | Required | Description |
|---|---|---|
task_id | Yes | The task ID reported by an earlier conversion that timed out before the PDF arrived |
filename | No | Custom filename for the saved PDF (always saved inside the download folder) |
Every reply ends with a small JSON block (status, error_code, retryable, recovery_action, task_id, session_id, saved_path, plus expires_at and the copying instruction on a verification handoff). You can ignore it; it lets the assistant recover without guessing, for example by asking for a document link when a Space holds several documents, by restarting verification, or by fetching a timed-out conversion instead of starting it again.
If you wire the server into your own agent, branch on the JSON block rather than on the prose. error_code and retryable follow the API error contract; recovery_action is one of:
provide_document_link - the link was not a DocSend document link, the Space holds several documents or asks for something the service cannot answer, or the document has been removed; ask for the individual document's /view/, /v/ or /view/<space>/d/<doc> linkprovide_email - the deck asks for an email and none was given; ask the user for one and call convert_docsend againreview_credentials - the passcode or email was rejectedsubmit_verification_link - a verification email is on its way (or the document or Space URL was pasted instead of the emailed link, which is refused without spending anything); collect the unopened button link and call submit_verification_link with the session_idrestart_verification - the session expired or the link was opened; call convert_docsend again for a fresh emailA retryable timeout that carries a task_id means the conversion may still finish; call fetch_conversion with that ID instead of converting again. A 429 with a short Retry-After is waited out by the server; longer delays come back as rate_limited with a retry_after value.
DOCSEND2PDF_DOWNLOAD_DIR controls where PDFs are saved. By default they go to a docsend_pdfs folder inside the Downloads folder your account actually uses (the registry known folder on Windows, XDG_DOWNLOAD_DIR on Linux, ~/Downloads on macOS), created on first save. To change it, add an env block to the server entry, using an absolute path; a blank value is ignored and a relative one is taken from your home directory:
"docsend2pdf": {
"command": "uvx",
"args": ["--python", "3.11", "docsend2pdf-mcp@latest"],
"env": { "DOCSEND2PDF_DOWNLOAD_DIR": "/absolute/path/to/folder" }
}A download never replaces an existing file unless you asked for that filename: a second deck.pdf is saved as deck (2).pdf. If the folder cannot be written to, the PDF is saved to a fresh private temporary folder and the reply says so, rather than the conversion being lost.
Pending verification sessions are kept in a private file under %LOCALAPPDATA%, ~/Library/Application Support or $XDG_STATE_HOME. Set DOCSEND2PDF_STATE_DIR to an absolute path to move it.
If you prefer a pinned installation (no automatic updates), install with pipx (requires Python 3.10+):
pipx install docsend2pdf-mcpThen use the absolute path from which docsend2pdf-mcp as the command (no args). Upgrade manually with pipx upgrade docsend2pdf-mcp, remove with pipx uninstall docsend2pdf-mcp.
pipx installs stay on the version you installed. Run pipx upgrade docsend2pdf-mcp to get 0.3.0, which adds Space link support, verification sessions that survive a restart, and fetch_conversion. If your Downloads folder is not at ~/Downloads, PDFs now arrive in the real one; set DOCSEND2PDF_DOWNLOAD_DIR to keep the old location.
The server is a thin client for the same public API that powers this website (API documentation). Your document is converted by docsend2pdf.com and the PDF is saved to your local disk.
email; the assistant reports that verification is required and gives you a session ID. Copy the link behind the Verify email address button in that email without opening it (the link is single-use) and paste it to the assistant. The assistant submits it with submit_verification_link and saves the PDF. The session lasts until it expires (normally 24 hours) and is kept in a private file, so restarting the client does not waste the email. Pasting the document or Space link instead of the emailed link is refused without spending anything; the session keeps waiting. If you opened the link or the session expired, ask for the deck again to receive a fresh email, or convert the document on this website instead (a new verification email is sent). Documents that merely ask for an email address convert in one step via the email parameter; without an email, verification-gated documents fail.docsend.com/view/s/...) converts only when the Space holds a single document. A Space with several documents, or one that asks for something the service cannot answer, is reported with a request for the individual document's link; open the Space in DocSend and copy the /view/<space>/d/<doc> link.searchable option is no longer part of the tool and is ignored if sent.Retry-After delays are waited out automatically; longer ones are reported as a retryable error.spawn ... ENOENT or "command not found": the config points at a command that is not on the GUI application's PATH. Replace it with the absolute path from which uvx, which docsend2pdf-mcp, or which python3.@latest config, fully quit and relaunch the client. With pipx, run pipx upgrade docsend2pdf-mcp. Older versions had other problems too: 0.1.0 saved the server's verification reply with a .pdf name, 0.1.x rejected /v/ short links, and 0.2.0 rejected Space links and the /view/<space>/d/<doc> links a Space uses for its documents.docsend.com link with a /view/ or /v/ path, for example a tracking or redirect wrapper from an email. Open it in the browser and copy the address from the address bar.No module named docsend2pdf_mcp: the package was installed into a different Python than the one the config launches. Reinstall with that exact interpreter: /path/to/python3 -m pip install docsend2pdf-mcp.--python 3.11; for other installs check python3 --version.~/Library/Logs/Claude/mcp*.log (macOS) or %APPDATA%\Claude\logs (Windows). Paste errors from mcp-server-docsend2pdf.log into your assistant for help.