Skip to main content

QRFile MCP

Send local files from your PC using an MCP-enabled AI agent. Choose how to receive them:

  • Browser download — no app required. Ask your AI agent for a one-time HTTPS download link and QR code, then open the link or scan the QR on the receiving device. This is useful for occasional transfers or devices without the Android app. Your browser may show a certificate warning.
  • Android app — optional, for automatic delivery. Install and pair QRFile if you want files to arrive automatically in your phone's private inbox. After pairing, ask your AI agent to send files to the phone; you do not need to open a link or scan a QR for each transfer. The app verifies received files and lets you open them or save them to a folder.

Only the files you explicitly request are copied for transfer. Both devices must be on the same trusted private Wi-Fi/LAN subnet. One file keeps its original name; multiple files arrive as shared-files.zip. File downloads use HTTPS with TLS 1.2 or newer.

Package name

  • Application: QRFile
  • PyPI distribution and command: qrfile-mcp
  • Python import and module launcher: qrfile_mcp

Setup

Requires Python 3.11 or newer on the PC running your MCP-enabled AI agent. The Android app supports Android 8.0 (API 26) or newer, starting with app version 1.10.

Install the MCP server on your PC

QRFile is published on PyPI. In a terminal, create a virtual environment and install the latest published package:

python -m venv .venv

Activate it on macOS/Linux with source .venv/bin/activate, or in Windows PowerShell with .venv\Scripts\Activate.ps1. Use python3 instead of python if that is your Python 3 command. Then run:

python -m pip install --upgrade qrfile-mcp

Find it through the Claude MCP directory

You can also use the QRFile listing on Claude MCP. Open its How to connect guide and follow your MCP client's package setup flow using PyPI package qrfile-mcp and stdio transport. If your client requires a command or JSON configuration, use the pip installation and configuration above. The directory lists the package; opening the page alone does not install it.

Connect it to your MCP client

Add a local stdio server using command qrfile-mcp with no arguments. python -m qrfile_mcp is an equivalent launcher. For clients that use an mcpServers JSON configuration, use the Python executable from the environment where you installed QRFile:

{
  "mcpServers": {
    "qrfile": {
      "command": "/absolute/path/to/.venv/bin/python",
      "args": ["-m", "qrfile_mcp"]
    }
  }
}

Replace the example path with your actual environment's Python path. On Windows, use the full path to .venv/Scripts/python.exe; forward slashes work in the JSON path. Run python -c "import sys; print(sys.executable)" in the activated environment to find the path. An absolute path also lets the MCP client launch QRFile without needing to activate the environment itself.

Save the configuration and restart or reconnect the MCP client. Check that QRFile appears in its available tools. Keep the MCP process running while pairing.

Restart the MCP connection (or quit/reopen the LLM app) after updating so its running process loads the updated version. A graceful restart closes existing shares; create a new share afterward. Shares served by an older process that is still running retain that process's behavior until closed or expired.

Install and pair the Android app (optional)

Skip this step if you prefer browser downloads. For automatic delivery to the Android app, complete these steps once for each phone and PC you want to pair.

  1. Download the QRFile Android app on your phone. Use app version 1.10 or later for Android 8–10; earlier app versions require Android 11 or newer.
  2. Open app-debug.apk and tap Install. If prompted, enable Allow from this source for your browser or file manager, then return to the APK. You can turn this installation permission off afterward.
  3. Connect your phone and PC to the same private Wi-Fi network and disconnect VPNs.
  4. Open QRFile, turn on Receiving, and allow notifications. Wait for Ready · same Wi-Fi.
  5. In your PC's MCP-enabled AI agent, ask: “Pair my phone as My phone.” The AI agent displays a pairing QR code that is valid for five minutes.
  6. On the phone, tap Scan pairing QR code → Scan QR, allow camera access, and scan the QR shown on the PC. If another PC is already paired, use Settings → Paired PCs → Pair another PC.
  7. When the AI agent asks, type the four-digit code shown on your phone into the PC chat, including any leading zeros. Wait for Paired successfully on the phone.

If the pairing QR expires, ask for a new QR. If the phone's IP address changes, pair again using the same phone name. To remove a PC, open Settings → Paired PCs and remove its pairing.

Usage

Receive files in the QRFile Android app

For a phone with QRFile already installed and paired:

  1. Open QRFile on the phone and keep Receiving enabled. Keep the PC and phone awake and on the same private Wi-Fi network, with the MCP connection running on the PC.

  2. Ask your AI agent:

    Send /Users/XXX/Downloads/report.pdf to My phone.

    Replace the path with your file's exact absolute path and My phone with the name used during pairing. To send several files, name each one in your request; they arrive as one ZIP.

  3. QRFile automatically downloads the file into the phone's inbox. You do not need to scan a QR code, open a browser or press a download button.

  4. Ask your AI agent to check delivery if needed. Received means the phone saved and verified the file; queued means it is still waiting.

  5. In the app, tap Open file to view the file, or ⋮ → Save to folder to choose where to save it. Opening keeps the inbox copy. Saving successfully removes the inbox copy. Use Delete from inbox to discard an unwanted file.

Reopen QRFile if Android stops receiving. Uninstalling the app or clearing its data deletes files still held only in the inbox.

Ask your AI agent:

Create a browser download link and QR code for /Users/XXX/Downloads/report.pdf.

Replace the example with the exact path to your file. Name each file to share several as one ZIP.

  1. Keep both devices on the same trusted private Wi-Fi/LAN subnet and keep the sender awake.
  2. The AI agent displays a clickable HTTPS download link, QR code, download-start deadline and certificate fingerprint.
  3. Scan the QR code or open the link on the receiving device to download the file. Your browser may show a certificate warning (to avoid it, install and trust the verified server certificate on the receiving device; the default certificate changes with each share) or ask you to confirm the download.
  4. Keep the MCP process running until the transfer finishes. After one complete server-side transfer, the link stops working.

Ask the AI agent to check download status or cancel an unfinished share. A completed browser transfer means the server sent the entire file; it does not confirm that the browser saved it to storage.

Tools

Tool Purpose
create_file_share Share 1–20 explicitly selected regular files; return QR, HTTPS URL, credentials, expiration and certificate information.
get_file_share Recover an active share's QR/link or inspect its status.
list_file_shares Show file names, expiration, status and completed download counts; omit credentials.
revoke_file_share Stop the listener, invalidate the URL, interrupt active transfers and remove copied files.
list_local_networks Inspect private LAN interfaces if automatic selection needs correction.
start_android_pairing Show a temporary PC QR for the phone to scan.
get_android_pairing Wait for the scan and instruct the AI agent to ask for the phone's four-digit code.
confirm_android_pairing Verify the exact human-supplied four-digit code and save the device.
cancel_android_pairing Cancel an unfinished pairing and invalidate its QR.
list_android_devices List paired phone names and addresses without keys.
forget_android_device Remove one local pairing entry.
send_file_to_android Send exactly the requested files to a paired phone's private inbox.
get_android_transfer Query phone-confirmed queued/downloading/received/saved/failed status.

Example arguments:

{
  "file_paths": ["/Users/XXX/Downloads/report.pdf"],
  "expires_in_seconds": 600
}

The deadline to start downloading defaults to 10 minutes, configurable from 1 to 60 minutes. The timer begins after copying files and setting up TLS. A download accepted before that deadline may continue past it until the complete payload is sent. After the deadline, new downloads and retries are rejected; if the ongoing transfer fails, the share closes and temporary copies are deleted. Explicit revocation or MCP shutdown still interrupts ongoing transfers. A stalled socket write times out after 10 seconds; there is no overall transfer-duration limit while data continues to be sent. Five shares may run simultaneously; each share supports eight simultaneous connections. Repeated invalid credential requests revoke that share after ten attempts. Each share permits one successful download. After the server finishes sending the entire payload, the URL and QR are immediately invalidated, the listener stops, and staged files are deleted. HEAD metadata probes do not consume the link. A simultaneous second download receives HTTP 409; an interrupted send releases the transfer slot for retry until the original expiration. ZIP entry names are flattened and duplicate names are renamed to preserve all selected files.

The completion signal is the server successfully writing and flushing the complete payload; it does not verify the receiver’s saved file or browser storage. A browser can still show its own Save/Download confirmation, and the MCP cannot bypass that prompt. Direct download means there is no extra application Download button.

Scope and lifetime

  • Every share gets its own private temporary directory and random port. Only the credential-bearing download route and its /file/0 alias serve the selected payload; there is no directory listing or arbitrary filesystem path route.
  • Shared files are snapshots. Modifying the originals does not change the downloadable copies. Original files are never moved or deleted.
  • The listener binds to a single RFC1918 IPv4 interface, never 0.0.0.0. Requests from other subnets, public addresses and loopback are rejected. Known VPN/virtual interfaces are excluded from automatic discovery. An optional interface argument chooses among the discovered interfaces.
  • Credentials are randomly generated per share. The URL/QR embeds them to avoid a manual login screen. Anyone holding the link on the allowed LAN can download while it is active; there is no receiver identity verification. A GET preview that actually fetches the entire file can consume a one-time download link.
  • Download completion, expiration with no ongoing download, and revocation close the server and delete staged copies, including the QR image. The MCP process must remain running during transfers; graceful shutdown also removes shares. A forced process kill cannot guarantee deletion of temporary copies, although the stopped process can no longer serve them.
  • The download transport is HTTPS on the local network. Verify certificate trust to authenticate the sender. Use trusted Wi-Fi/LAN; don't expose it through port forwarding, tunnels or public proxies. Source-address checks cannot distinguish a LAN relay from a local receiver.
  • IPv6-only networks and routed devices on a different subnet are not supported. Wi-Fi guest/client isolation and sender firewalls can prevent a connection even when both devices use the same Wi-Fi name. A sleeping sender cannot serve downloads.
  • Automatic interface discovery chooses the preferred active physical-looking private interface; it cannot universally classify custom VPN/virtual interface names. Use list_local_networks and specify the correct interface when necessary.

Optional sender restrictions:

  • LOCAL_SHARE_ALLOWED_ROOTS: absolute directories separated by the OS path separator (: on macOS/Linux, ; on Windows). If omitted, the trusted local MCP client can request any regular file readable by the sender's user account. The tool instructions require the exact user-requested paths and do not authorize inferred extra files.
  • LOCAL_SHARE_MAX_BYTES: maximum total snapshot bytes per share, default 5 GiB.

mcp-name: io.github.hkturtco/qrfile

Metadata

Release files for qrfile-mcp 0.2.11

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for qrfile-mcp 0.2.11
File Size Uploaded
qrfile_mcp-0.2.11.tar.gz 36.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for qrfile-mcp 0.2.11
File Interpreter ABI Platform
qrfile_mcp-0.2.11-py3-none-any.whl Python 3 none any Details

Total release size: 63.1 kB

Release files / qrfile_mcp-0.2.11.tar.gz

Download URL qrfile_mcp-0.2.11.tar.gz
Size 36.8 kB
Tags Source
SHA-256 checksum
How to use checksums
5fa4f05e1e275634f554757fdbe90cf37f280fae6d1a1b688c226ea9fce3ff2f
BLAKE2b-256 checksum
How to use checksums
7027537f69dd5daddc3f8c3112028d088b07607ee60dee4c36ccd2758eae1a34
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.12

Release files / qrfile_mcp-0.2.11-py3-none-any.whl

Download URL qrfile_mcp-0.2.11-py3-none-any.whl
Size 26.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
acb7a575e025c69faff15d66f6783562f8c9479b6a9604b3aed5b71437f3cbb1
BLAKE2b-256 checksum
How to use checksums
06fd83a8f1a90a1f723bbf46741474d58df349e447c2ba5ab7b450e1a8d8fdbb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.12

Release history Release notifications | RSS feed

This release

0.2.11 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page