Before you connect
No account, no API key, no signup. The endpoint is public, streamable HTTP, and takes anonymous calls by default —sandbox: true works on the very
first call from a fresh install. An optional developer API key
(Authorization: Bearer pp_live_… or pp_test_… for sandbox-only) narrows
what a credential can do (spend caps, scoped tools) if you want that; it is
never required. A key that’s sent and doesn’t verify is refused outright,
not silently downgraded to anonymous — so a typo fails loudly instead of
quietly widening access.
Connect
Every client speaks to the same URL above. Pick yours below for the exact config — the shapes differ more than you’d expect (aurl field here, an
httpUrl there, a whole different top-level key in VS Code), which is
exactly the kind of thing worth copy-pasting rather than guessing.
Claude Code
Claude Code
--scope user to make it available across all your projects instead of
just this one, or --scope project to share it with teammates via a
committed .mcp.json. With an optional API key:Claude Desktop
Claude Desktop
Remote MCP servers connect through Settings → Connectors → Add custom
connector — not by hand-editing
claude_desktop_config.json, which only
recognizes locally-spawned servers.- Settings → Connectors → Add custom connector
- Paste
https://sendpaperplane.com/api/mcp - Add
Cursor
Cursor
One-click install (officially documented at cursor.com/docs/mcp/install-links), or add to
~/.cursor/mcp.json (or a project-local .cursor/mcp.json) by hand:VS Code / GitHub Copilot
VS Code / GitHub Copilot
.vscode/mcp.json, or via the MCP: Open User Configuration command for a
user-wide install. Note the top-level key is servers, not mcpServers —
VS Code’s own file, not the community convention most other clients share:Windsurf
Windsurf
~/.codeium/windsurf/mcp_config.json — the field is serverUrl, not url:Cline
Cline
Via Cline’s MCP settings UI, or the underlying JSON.
type must be the exact
string streamableHttp (camelCase) — http or a missing type falls back
to legacy SSE and gets a 405 against this endpoint:Continue.dev
Continue.dev
.continue/config.yaml — note the hyphenated streamable-http, the opposite
convention from Cline’s camelCase:Gemini CLI
Gemini CLI
settings.json entry uses httpUrl, not url — Gemini
CLI reserves url for its older SSE transport, so if you’re editing the
file directly rather than using the CLI, use httpUrl:OpenAI Codex CLI
OpenAI Codex CLI
~/.codex/config.toml (shared with the Codex IDE extension and desktop app):url-only entry, either upgrade or add the feature flag
above the server table:Amp
Amp
url:GitHub Copilot CLI
GitHub Copilot CLI
Distinct from VS Code’s Copilot integration above — this is the standalone
Config lives at
copilot terminal tool.~/.copilot/mcp-config.json:Devin CLI
Devin CLI
Factory CLI (droid)
Factory CLI (droid)
Grok Build CLI
Grok Build CLI
xAI’s Grok Build CLI reuses Claude Code’s config format directly rather than
its own schema — same
.mcp.json/claude_desktop_config.json shape as the
Claude Code and Claude Desktop entries above. This is a new (2026) product;
treat the format as provisional and re-check if it stops working.JetBrains AI Assistant
JetBrains AI Assistant
Settings → Tools → AI Assistant → Model Context Protocol, or add directly:
Junie
Junie
A separate JetBrains product from AI Assistant above, with its own config
path — easy to conflate, but
.junie/mcp/mcp.json (project) or
~/.junie/mcp.json (global):Kiro
Kiro
.kiro/settings/mcp.json (workspace) or ~/.kiro/settings/mcp.json (user):Mistral Vibe
Mistral Vibe
~/.vibe/config.toml — note this is the one TOML-based config on this list
besides Codex CLI, and the key names don’t match it either:OpenCode
OpenCode
opencode.json — the only client on this list using "type": "remote"
rather than "http"/"streamableHttp":Visual Studio
Visual Studio
Distinct from VS Code above — same Files:
"type": "http" shape, but the
top-level key is servers, matching VS Code rather than the community
mcpServers convention:%USERPROFILE%\.mcp.json (global) or <SolutionDir>\.mcp.json.Warp
Warp
Zed
Zed
Native support as of current Zed docs — no local proxy needed (older
tutorials describing an
mcp-remote stdio-bridge workaround are outdated):Other MCP clients
Other MCP clients
Any client that speaks the streamable HTTP MCP transport can point directly
at the endpoint — most use a
url key under mcpServers (occasionally
httpUrl or serverUrl instead, as above; check your client’s docs for
which). If your client only supports locally-spawned (stdio) servers, use
the REST fallback further down this page instead —
it’s the same tools and the same guarantees, over plain HTTP calls.Using the paperplane tools, quote a 1-page certified letter to Property LLC, 1 Main St, Richmond VA 23220, then send it in sandbox mode.
The tools
quote_letter/send_letter mail a letter by default, but both take an
optional format argument for every other piece in the catalogue —
notecard (1.99, postcard_6x9 3.49 — open-face). All four are message-only: text prints on the piece
itself, and there’s no pdf_url/upload_key path for them. Pass the same
format to both calls — the confirmation_token quote_letter mints is
bound to it, so a token quoted for one physical piece is refused if
send_letter is called with a different one, even at an identical price.
See Mail formats.The required flow
1
1. Quote
quote_letter with the recipient, content, and class. Free. It returns the all-in price plus a single-use confirmation_token (30-min TTL) bound to those exact parameters.2
2. Confirm with the user
Show the human the recipient and total. This is the confirmation step assistant platforms require before a purchase.
3
3. Send
send_letter with the SAME parameters and the confirmation_token. Any change invalidates it. Returns a payment_url for the human to approve (or a completed sandbox order). Pass a prepaid credit_code instead and the letter moves immediately, with no human payment step.4
4. Track
get_letter_status until terminal.A send is never the first call. If
confirmation_token is missing, send_letter refuses — the quote→confirm→send discipline is enforced server-side.Sandbox
Passsandbox: true to run the whole flow — rendering, screening, simulated fulfillment with a mock tracking number — instantly and free, still requiring a token. An agent’s first call can succeed before any human signs up.
Capability tokens
send_letter returns capability.cancel_token and capability.review_token, required to cancel the order or review it once delivered. Bound to the order id + action, 7-day TTL. See Core concepts.
When a call fails
A tool failure is the same envelope the REST API returns —status, a stable
code, a human reason, and a next array of concrete steps — plus one field
only the tool surface carries:
retryable is the bit a tool-calling loop needs and cannot get from prose: it
is true only for rate limits and our own 5xx, never for anything the caller
has to change first. Both surfaces answer from the same mapping in
lib/http.ts, so a failure cannot be permanent over one wire and transient over
the other. Every code is listed in the error contract.
Content rules
Every letter is screened (fraud/threats only — lawful demand letters are fine).refused releases the payment.