Skip to main content

mstransfer

Tests codecov

Transfer mass spectrometry files (mzML / MSZ) between machines over HTTP. Files are always transported in compressed MSZ format using mscompress — mzML sources are compressed on-the-fly without temp files, and the receiving end can optionally decompress back to mzML.

Install

# Recommended — installs as an isolated CLI tool
uv tool install mstransfer

# Or with pipx
pipx install mstransfer

# Or as a project dependency
uv pip install mstransfer
pip install mstransfer

Quick start

Start a server on the receiving machine:

mstransfer serve --port 1319 --store-as msz

Upload files from the source machine:

mstransfer upload /data/experiment1.mzML /data/batch/ remote-host:1319

Usage

mstransfer serve

Start the receiver server.

mstransfer serve [--host 0.0.0.0] [--port 1319] [--output-dir ./received] [--store-as msz|mzml]
Flag Default Description
--host 0.0.0.0 Bind address
--port 1319 Listen port
--output-dir ./received Where received files are written
--store-as msz Store as msz (compressed) or mzml (decompress on arrival)

mstransfer upload

Upload files to a server. Accepts any mix of files and directories. The last positional argument is the target.

mstransfer upload <paths...> <host[:port]> [--recursive] [--parallel 4]
Flag Default Description
--recursive, -r off Recurse into directories
--parallel, -p 4 Number of concurrent uploads

Supported file types: .mzML, .msz, .mszx.

  • mzML files are compressed to MSZ on-the-fly via compress_stream() and streamed directly into the HTTP request — no temp files on the sender.
  • MSZ / MSZX files are streamed as-is.

Programmatic access

You can use mstransfer as a library to send files from your own Python code:

from pathlib import Path
from mstransfer.client import send_file, send_batch

# Send a single file (Path)
result = send_file(Path("experiment.mzML"), "http://remote-host:1319")

# Send an already-opened mscompress object
from mscompress import MZMLFile, MSZFile
from mscompress.mszx import MSZXFile

mzml = MZMLFile(b"/data/experiment.mzML")
send_file(mzml, "http://remote-host:1319")

msz = MSZFile(b"/data/experiment.msz")
send_file(msz, "http://remote-host:1319")

mszx = MSZXFile.open("/data/experiment.mszx")
send_file(mszx, "http://remote-host:1319")

# Send multiple files in parallel
send_batch(
    [Path("a.mzML"), Path("b.msz"), mszx],
    "http://remote-host:1319",
    parallel=4,
)

send_file and send_batch accept any mix of Path, MZMLFile, MSZFile, and MSZXFile inputs.

API

The server exposes a REST API under /v1/:

Endpoint Method Description
/v1/health GET Server status, version, storage mode
/v1/upload POST Upload a file (streamed MSZ body)
/v1/transfer/{id}/status GET Poll transfer state

Embedding in another app

The server is built as a FastAPI app factory:

from mstransfer import create_app

# Standalone
app = create_app(output_dir="/data/ms", store_as="mzml")

# Mount in an existing FastAPI app
from fastapi import FastAPI
main_app = FastAPI()
main_app.mount("/transfer", create_app())

How it works

flowchart LR
    subgraph Sender
        mzML[".mzML"] --> compress["compress_stream()"]
        msz[".msz / .mszx"] --> read["read file"]
    end

    compress --> upload["POST /v1/upload\n(MSZ bytes)"]
    read --> upload

    subgraph Server
        upload --> mode{store-as?}
        mode -- msz --> write["write to disk"]
        mode -- mzml --> temp["write temp .msz"]
        temp --> decompress["decompress"]
        decompress --> cleanup["cleanup temp"]
    end

Development

uv sync --dev
uv run pytest
uv run ruff check src/ tests/

Pre-commit hooks

Install the pre-commit hooks to automatically run linting, type checking, and tests before each commit:

uv run pre-commit install

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mstransfer-0.2.3.tar.gz (2.1 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mstransfer-0.2.3-py3-none-any.whl (25.8 kB view details)

Uploaded Python 3

File details

Details for the file mstransfer-0.2.3.tar.gz.

File metadata

  • Download URL: mstransfer-0.2.3.tar.gz
  • Upload date:
  • Size: 2.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mstransfer-0.2.3.tar.gz
Algorithm Hash digest
SHA256 d499684eab6105cd118b481c42d474af91d1fe733aace8814175de082001cef2
MD5 b68cc6467f732faaa81d0efc5267da75
BLAKE2b-256 44921fdaf4e7fb3351eadbefabd5f14a3cc1054ae55e27235e6a2ff0cdca3462

See more details on using hashes here.

Provenance

The following attestation bundles were made for mstransfer-0.2.3.tar.gz:

Publisher: publish.yml on chrisagrams/mstransfer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mstransfer-0.2.3-py3-none-any.whl.

File metadata

  • Download URL: mstransfer-0.2.3-py3-none-any.whl
  • Upload date:
  • Size: 25.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mstransfer-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 5ef76ffa860ef2a15c0a4682d3306cc9f874777f0eaa0b91bcf657f6acb94ca9
MD5 4123015e8a04df394f0eeb50894a4cf9
BLAKE2b-256 fcf70ef84347bcef2adbbd258a0936b8031af28812a54df8445e7642299ded3e

See more details on using hashes here.

Provenance

The following attestation bundles were made for mstransfer-0.2.3-py3-none-any.whl:

Publisher: publish.yml on chrisagrams/mstransfer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.2.3 This release

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.1

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page