Lets an AI client list mailings, download scanned letter files, and manage physical mail actions like forwarding or destroying letters.
Also known as bitterdev/dropscan-mcp
- Stars
- 1
- Tools
- 1
- Downloads, 30 days
- 70
- Latest version
- 0.1.1
- Last commit
- Oct 19, 2026
- License
- MIT
What is Dropscan MCP?
Dropscan lets an AI client list mailings, download scanned letter files, and manage physical mail actions like forwarding or destroying letters. It exposes 1 tool, such as list_scanboxes.
Summary generated from the project's README
About Dropscan MCP server
Managing physical mail through digital interfaces is what dropscan-mcp enables for users of the Dropscan postal service. This MCP server connects an AI client to your production postal account via a personal access token, allowing you to interact with scanned mailings directly from your chat interface. You can list scanboxes, view mailing details, and download various file formats including PDFs, ZIP files, envelope images, and OCR plaintext.
Security is a primary focus because actions like destroying a letter or forwarding mail are irreversible and involve real-world costs. To prevent accidental changes, all write tools are disabled by default and require both the DROPSCAN_ALLOW_WRITES environment variable to be set to 1 and an explicit confirm parameter set to true within the tool call. Read-only tools remain available at all times for inspecting mailings, recipients, forwarding addresses, and webhook rules.
What you can do with it
- 1Retrieve scanned mail documentsAn AI client can download a specific letter as a PDF or ZIP file to your local machine.
- 2Execute physical mail actionsYou can instruct an AI to physically shred a letter or mail it to a new address.
- 3Audit mailing historyAn AI can list all mailings within a specific scanbox to provide a summary of recent correspondence.
Written from the project's README. Every use case is checked against a quote from it.
How to install Dropscan MCP
Formats verified 10 Nov 2026Install Dropscan MCP in Claude Code
$ claude mcp add --env DROPSCAN_API_TOKEN=<YOUR_DROPSCAN_API_TOKEN> dropscan-mcp -- uvx dropscan-mcpInstall Dropscan MCP in Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"dropscan-mcp": {
"command": "uvx",
"args": [
"dropscan-mcp"
],
"env": {
"DROPSCAN_API_TOKEN": "<YOUR_DROPSCAN_API_TOKEN>"
}
}
}
}Install Dropscan MCP in VS Code
.vscode/mcp.json
{
"servers": {
"dropscan-mcp": {
"type": "stdio",
"command": "uvx",
"args": [
"dropscan-mcp"
],
"env": {
"DROPSCAN_API_TOKEN": "<YOUR_DROPSCAN_API_TOKEN>"
}
}
}
}Install Dropscan MCP in Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"dropscan-mcp": {
"command": "uvx",
"args": [
"dropscan-mcp"
],
"env": {
"DROPSCAN_API_TOKEN": "<YOUR_DROPSCAN_API_TOKEN>"
}
}
}
}Install Dropscan MCP in Codex
~/.codex/config.toml
[mcp_servers.dropscan-mcp] command = "uvx" args = ["dropscan-mcp"] [mcp_servers.dropscan-mcp.env] DROPSCAN_API_TOKEN = "<YOUR_DROPSCAN_API_TOKEN>"
Install Dropscan MCP in Gemini CLI
~/.gemini/settings.json
{
"mcpServers": {
"dropscan-mcp": {
"command": "uvx",
"args": [
"dropscan-mcp"
],
"env": {
"DROPSCAN_API_TOKEN": "<YOUR_DROPSCAN_API_TOKEN>"
}
}
}
}Dropscan MCP tools 1
Detected from the READMElist_scanboxes
| list_scanboxes | — |
Configuration
DROPSCAN_API_TOKENRequiredSecretPersonal access token for the Dropscan REST API
DROPSCAN_ALLOW_WRITESSet to 1 to unlock the write and action tools, which also require confirm=true on every call
DROPSCAN_TOKEN
| Name | Description | |
|---|---|---|
| DROPSCAN_API_TOKEN | Personal access token for the Dropscan REST API | RequiredSecret |
| DROPSCAN_ALLOW_WRITES | Set to 1 to unlock the write and action tools, which also require confirm=true on every call | |
| DROPSCAN_TOKEN | — |
Automated checks
Ran Nov 12, 2026Full report →Passed our automated checks. That is not a security audit: read the code and give the server the narrowest access it needs. How checks work
- Source repository linked and reachablePass
- Open source license (OSI)Pass
- Commit or release in the last yearPass
- Package name not close to a popular packagePass
- Remote endpoint uses HTTPSNot checked
- Destructive tools are labelledPass
- No hidden instructions to the modelPass
- No critical advisory in the package or its dependenciesPass
README
View on GitHubdropscan-mcp
MCP (Model Context Protocol) server for the Dropscan postal-mail-to-email API. Dropscan receives your physical letters at a scanbox; this server lets your MCP client list mailings, download the scans (PDF / ZIP / envelope image / OCR text), and, when explicitly enabled, request actions (scan / forward / destroy) and manage recipients, forwarding addresses and webhook rules.
mcp-name: io.github.bitterdev/dropscan-mcp
Safety first: Dropscan has no sandbox
Every request hits the real production account. Actions are irreversible: a destroyed letter is physically shredded and gone, a forward physically mails the letter and costs money.
Because of that, all write/action tools are gated twice:
DROPSCAN_ALLOW_WRITESenvironment flag. Unless it is set to1/true/yes, every non-GET tool refuses to run. It is disabled by default.confirm: trueparameter. Each write/action tool takes an explicitconfirmargument (defaultfalse) and refuses unless it istrue.
Read-only GET tools are always available and never change state.
Tools
Read-only (always available)
| Tool | Endpoint |
|---|---|
list_scanboxes |
GET /scanboxes |
list_mailings(scanbox_id, current_status?, older_than?) |
GET /scanboxes/{id}/mailings |
get_mailing(scanbox_id, uuid) |
GET /scanboxes/{id}/mailings/{uuid} |
get_mailing_pdf(scanbox_id, uuid, save_path?) |
GET .../{uuid}/pdf |
get_mailing_zip(scanbox_id, uuid, save_path?) |
GET .../{uuid}/zip |
get_mailing_envelope(scanbox_id, uuid, save_path?) |
GET .../{uuid}/envelope |
get_mailing_plaintext(scanbox_id, uuid) |
GET .../{uuid}/plaintext |
list_recipients(scanbox_id) |
GET /scanboxes/{id}/recipients |
get_recipient(scanbox_id, recipient_id) |
GET /scanboxes/{id}/recipients/{id} |
get_forwarding_address(address_id) |
GET /forwarding_addresses/{id} |
get_shipment(shipment_id) |
GET /shipments/{id} |
list_webhook_rules() |
GET /webhook_rules |
get_webhook_rule(rule_id) |
GET /webhook_rules/{id} |
The download tools save the asset to disk (default ~/Downloads, override with save_path or the DROPSCAN_DOWNLOAD_DIR env var) and return the saved path, byte size and content type.
Write / action (double-gated: DROPSCAN_ALLOW_WRITES=1 and confirm=true)
| Tool | Endpoint |
|---|---|
request_mailing_action(scanbox_id, mailing_uuid, action_type, forwarding_address_id?, forwarding_date?, confirm) |
POST .../{uuid}/action_requests |
cancel_mailing_action(scanbox_id, mailing_uuid, action_request_id, confirm) |
DELETE .../{uuid}/action_requests/{id} |
set_mailing_recipient(scanbox_id, mailing_uuid, recipient_id, confirm) |
PUT .../{uuid}/recipient |
create_recipient(scanbox_id, type, firstname?, lastname?, name?, confirm) |
POST /scanboxes/{id}/recipients |
create_forwarding_address(firstname, lastname, street, number, zip_code, city, country_code, company?, info?, state?, confirm) |
POST /forwarding_addresses |
create_webhook_rule(url, events, authorization_header?, confirm) |
POST /webhook_rules |
update_webhook_rule(rule_id, url?, events?, authorization_header?, confirm) |
PATCH /webhook_rules/{id} |
delete_webhook_rule(rule_id, confirm) |
DELETE /webhook_rules/{id} |
action_type is one of scan, forward, destroy (exact enum from the API). For forward, both forwarding_address_id and forwarding_date (ISO YYYY-MM-DD) are required.
Webhook events: mailing_received, scan_requested, mailing_scanned, mailing_archived, mailing_trashed, mailing_shredded, mailing_added_to_shipment, mailing_removed_from_shipment, shipment_sent, package_tracking_updated.
Requirements
- Python >= 3.10
- A Dropscan personal access token
Installation
From a local clone:
python3 -m venv .venv
./.venv/bin/pip install .
Configuration
The token is read from the DROPSCAN_TOKEN environment variable and sent as Authorization: Bearer <token>. It is never hardcoded.
Claude Code
claude mcp add dropscan -e DROPSCAN_TOKEN="dspat-..." -- dropscan-mcp
Claude Desktop / generic MCP client
{
"mcpServers": {
"dropscan": {
"command": "/absolute/path/to/dropscan-mcp/.venv/bin/python",
"args": ["-m", "dropscan_mcp.server"],
"env": {
"DROPSCAN_TOKEN": "dspat-..."
}
}
}
}
To enable the write/action tools, add "DROPSCAN_ALLOW_WRITES": "1" to env. Leave it out to keep the server strictly read-only.
The server runs over stdio.
Environment variables
| Variable | Description |
|---|---|
DROPSCAN_TOKEN |
Required. Dropscan personal access token (Bearer). |
DROPSCAN_ALLOW_WRITES |
Set to 1/true to enable write/action tools. Default: disabled. |
DROPSCAN_DOWNLOAD_DIR |
Default directory for downloaded PDFs/ZIPs/images. Default: ~/Downloads. |
License
MIT, see LICENSE.
Author
Fabian Bitter (fabian@bitter.de)
Dropscan MCP questions
How do I add Dropscan MCP to Claude Code?
Run claude mcp add --env DROPSCAN_API_TOKEN=<YOUR_DROPSCAN_API_TOKEN> dropscan-mcp -- uvx dropscan-mcp in your terminal. Add --scope user to make it available in every project.
How do I add Dropscan MCP to Cursor?
Open ~/.cursor/mcp.json and add the server under mcpServers, using the Cursor config shown in the install section above.
What tools does Dropscan MCP provide?
It exposes 1 tool, including list_scanboxes.
What happens if I use the destroy action?
The action is irreversible and the physical letter will be shredded.