Skip to main content

MetabolomicsHub Common Data Model and Utility Tools (mhd-model)

You can find documentation on Github

Repository Integration with Command Line Tool

Upon completing the MetabolomicsHub consortium agreement and repository registration, repositories may start MetabolomicsHub integration. A repository will use the submission endpoints to acquire an MHD accession number and make public dataset announcements.

You can use mhd-cli tool to create the required files for registration and use the most common MetabolomicsHub submission REST web service endpoints.

Before proceeding next steps, you need to install mhd-cli tool. Please ensure that python >=3.12 and pip commands are already installed.

Step 1: Command Line Tool Installation

# ensure python version is equal or greater than 3.12. Otherwise install new Python version
python --version

# Insure your mhd-model library is up-to-date. Remove current installation from your environment.
pip uninstall mhd-model -y

# Ensure install the new mhd-model library
pip install mhd-model

# Check mhd-cli command line and its version
mhd-cli --version

# Check mhd-cli command line and its version
mhd-cli --help
#############################################################################
# Example output
#############################################################################
# Usage: mhd-cli [OPTIONS] COMMAND [ARGS]...
#   MetabomicsHub CLI with subcommands.
# Options:
#   --version   Show the version and exit.
#   -h, --help  Show this message and exit.
# Commands:
#   client    utilities to communicate with MHD Server.
#   create    utilities to create and convert files (announcement file, etc.).
#   validate  utilities to validate MetabolomicsHub files.
#############################################################################

Step 2: Repository Registration

You can use mhd-cli command to create public key files for repository registration. You MUST keep the generated private keys in secure place.

MetabolomicsHub needs some information from repositories to store in the database. You need to share the following information (not private key files) with MetabolomicsHub:

  • Repository Name: Name of the repository (Case sensitive). e.g. MetaboLights, Metabolomics Workbench
  • Repository Short Name: Sort name of the repository (Case sensitive). e.g. mtbls, mw
  • Repository Description: Short description about the repository
  • Repository Logo URL: Repository logo URL
  • Repository public keys: Public key file created by repositories. It will be used to validate repository REST API web service requests. MetabolomicsHub will request two public keys for production and test environments.
# create public and private key files
mhd-cli client key-pair create --output-folder mhd-production-keys
# This command creates public_key.pem and private_key.pem files in 'mhd-production-keys' subfolder

mhd-cli client key-pair create --output-folder mhd-test-keys
# This command creates public_key.pem and private_key.pem files in 'mhd-test-keys' subfolder

After receiving the required information, MetabolomicsHub will update the databases to allow the repository web service requests.

Step 3: Create MHD API Tokens

A repository signed JWT token is required to create and delete a repository API token. You can use mhd-cli command to create a signed JWT token. Public and private key files are required to create a valid signed JWT token.

Notes:

  • Signed JWT tokens MUST be created with public key shared with MetabolomicsHub
  • Keep the signed JWT token in secure place.
mhd-cli client signed-jwt create --repository-name 'Metabolomics Workbench' --private-key-path mhd-production-keys/private_key.pem --public-key-path mhd-production-keys/private_key.pem  --output-file-path mhd-production-keys/signed-jwt.txt

# You can test the signed JWT token content
mhd-cli client signed-jwt show --signed-jwt-file-path mhd-production-keys/signed-jwt.txt

# For test environment
mhd-cli client signed-jwt create --repository-name 'Metabolomics Workbench' --private-key-path mhd-test-keys/private_key.pem --public-key-path mhd-test-keys/private_key.pem  --output-file-path mhd-test-keys/signed-jwt.txt

# You can test the signed JWT token content
mhd-cli client signed-jwt show --signed-jwt-file-path mhd-test-keys/signed-jwt.txt

If you have a valid signed JWT token, you can create an API token with a name. API tokens are not stored on MetabolomicsHub database and shown only once they are created. So keep them in a secure place.

export PRODUCTION_MHD_SERVER_URL="https://www.metabolomicshub.org/api/submission"
export TEST_MHD_SERVER_URL="https://www.metabolomicshub.org/test/api/submission"
# API token creation for production
mhd-cli client api-token create \
    --token-name prod-2026-09 \
    --signed-jwt-file-path mhd-production-keys/signed-jwt.txt \
    --mhd-server-url $PRODUCTION_MHD_SERVER_URL \
    --output-file-path mhd-production-keys/api-token-prod-2026-09.txt


# API token creation for test
mhd-cli client api-token create \
    --token-name test-2026-09 \
    --signed-jwt-file-path mhd-test-keys/signed-jwt.txt \
    --mhd-server-url $TEST_MHD_SERVER_URL \
    --output-file-path mhd-test-keys/api-token-test-2026-09.txt

Step 4: MHD Accession Integration

After completion of a dataset in repository, repositories will request an MHD accession for each MHD dataset.

##################################################################################
# STEP 1: ENSURE DATASET MHD TYPE (MHD OR LEGACY)
#         AND MHD VERSION IS STORED IN DATABASE FOR EACH DATASET
##################################################################################

##################################################################################
# STEP 2.1: REQUEST MHD ACCESSION FOR EACH MS DATASET AFTER ITS COMPLETION
##################################################################################

export PRODUCTION_MHD_SERVER_URL="https://www.metabolomicshub.org/api/submission"
export TEST_MHD_SERVER_URL="https://www.metabolomicshub.org/test/api/submission"

# Get an MHD accession for a repository dataset on test MHD server
mhd-cli client fetch-mhd-accession \
    --dataset-repository-identifier ST912345 \
    --api-token-file-path mhd-test-keys/api-token-test-2026-09.txt \
    --mhd-server-url $TEST_MHD_SERVER_URL \
    --accession-type mhd

##################################################################################
# STEP 2.2: REGISTER EACH LEGACY DATASET AFTER ITS COMPLETION
##################################################################################

# Register a legacy dateset for a repository dataset on test MHD server
mhd-cli client fetch-mhd-accession \
    --dataset-repository-identifier ST004212
    --api-token-file-path mhd-test-keys/api-token-test-2026-09.txt \
    --mhd-server-url $TEST_MHD_SERVER_URL \
    --accession-type legacy

Step 4: Announcement Integration

After a dataset is public or there is a new revision for the dataset, repositories will generate MHD common data file, create an MHD announcement file and share the announcement file with MetabolomicsHub.

MHD common data file can be generated using repository specific convertors. After MHD file creation, repositories SHOULD validate its content to ensure alignment of MHD specification requirements.

If there a valid MHD common data file, the following commands can be used to create annoucement file and share with MetabolomicsHub.

Create MHD Announcement File and make an announcement for MHD datasets

##################################################################################
# STEP 1: CREATE MHD COMMON DATA FILE USING REPOSITORY CONVERTOR
##################################################################################

##################################################################################
# STEP 2: CREATE MHD ANNOUNCEMENT FILE USING THE CREATED MHD COMMON DATA FILE
##################################################################################
# You have a dataset with repository id ST912345 and MHD accession ST912345.
# MHD common data file is on current path
# Target URL MUST be accessible after a study is public
mhd-cli create announcement --mhd-id MHD000021 \
    --mhd-common-data-file-path ./ST912345.mhd.json \
    --output-dir . \
    --output-filename ST912345.announcement.json \
    --target-mhd-common-data-file-url 'https://www.metabolomicsworkbench.org/data/mhd.php?STUDY_ID=ST004212'

##################################################################################
# STEP 3: RUN VALIDATIONS FOR BOTH MHD COMMON DATA FILE AND MHD ANNOUNCEMENT FILE
##################################################################################

##################################################################################
# STEP 4: MAKE STUDY PUBLIC AND HOST MHD COMMON DATA FILE ON INTERNET
##################################################################################
# ENSURE URL defined with target-mhd-common-data-file-url is accessible
# and downloadable as JSON file


##################################################################################
# STEP 5: ANNOUNCE PUBLIC DATASET
##################################################################################
export PRODUCTION_MHD_SERVER_URL="https://www.metabolomicshub.org/api/submission"
export TEST_MHD_SERVER_URL="https://www.metabolomicshub.org/test/api/submission"

# Announce an MHD announcement file for MHD studies
mhd-cli client announce \
    --dataset-repository-identifier ST912345 \
    --api-token-file-path mhd-test-keys/api-token-test-2026-09.txt \
    --mhd-server-url $TEST_MHD_SERVER_URL \
    --mhd-id MHD000021 \
    --announcement-reason 'initial publication' \
    --announcement-file-path ST912345.announcement.json

Create MHD Announcement File and make an announcement for Legacy datasets

##################################################################################
# STEP 1: (LEGACY DATASET) CREATE MHD COMMON DATA FILE USING REPOSITORY CONVERTOR
##################################################################################

##################################################################################
# STEP 2: (LEGACY DATASET) CREATE MHD ANNOUNCEMENT FILE USING THE CREATED MHD COMMON DATA FILE
##################################################################################
# You have a legacy dataset with repository id ST004083
# MHD common data file for the legacy dataset is on current path
# Target URL MUST be accessible after a study is public

mhd-cli create announcement --mhd-id ST004083 \
    --mhd-common-data-file-path ./ST004083.mhd.json \
    --output-dir . \
    --output-filename ST004083.announcement.json \
    --target-mhd-common-data-file-url 'https://www.metabolomicsworkbench.org/data/mhd.php?STUDY_ID=ST004212'

##################################################################################
# STEP 3: (LEGACY DATASET) RUN VALIDATIONS FOR BOTH MHD COMMON DATA FILE AND MHD ANNOUNCEMENT FILE
##################################################################################

##################################################################################
# STEP 4: (LEGACY DATASET) MAKE STUDY PUBLIC AND HOST MHD COMMON DATA FILE ON INTERNET
##################################################################################
# ENSURE URL defined with target-mhd-common-data-file-url is accessible
# and downloadable as JSON file

##################################################################################
# STEP 5: (LEGACY DATASET) ANNOUNCE PUBLIC DATASET
##################################################################################
# Announce an MHD announcement file for legacy studies
mhd-cli client announce \
    --dataset-repository-identifier ST004083 \
    --api-token-file-path mhd-test-keys/api-token-test-2026-09.txt \
    --mhd-server-url $TEST_MHD_SERVER_URL \
    --mhd-id ST004083 \
    --announcement-reason 'updated version' \
    --announcement-file-path ST004083.announcement.json

Development Environment

Development environment for linux or mac

# install python package manager uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# add $HOME/.local/bin to your PATH, either restart your shell or run
export PATH=$HOME/.local/bin:$PATH

# install git from https://git-scm.com/downloads
# Linux command
apt update; apt install git -y

# Mac command
# brew install git

# clone project from github
git clone https://github.com/MetabolomicsHub/mhd_model.git

cd mhd-model

# install python if it is not installed
uv python install 3.12

# install python dependencies
uv sync

# install pre-commit to check repository integrity and format checking
uv run pre-commit

# open your IDE (vscode, pycharm, etc.) and set python interpreter as .venv/bin/python

Example API Usage

from mhd_model.mhd_client import MhdClient, MhdClientError

mhd_webservice_base_url = "https://www.metabolomicshub.org/test/api/submission"
api_token = "<your-api-token>"


def get_new_mhd_accession_example():
    mhd_client: MhdClient = MhdClient(mhd_webservice_base_url, api_token)

    try:
        accession = mhd_client.get_new_mhd_accession(
            dataset_repository_identifier="MTBLS1234567", accession_type="mhd"
        )
        print("Accession: %s" % accession)
    except MhdClientError as ex:
        print("Error: %s" % ex.message)


def get_new_test_mhd_accession_example():
    mhd_client: MhdClient = MhdClient(mhd_webservice_base_url, api_token)

    try:
        accession = mhd_client.get_new_mhd_accession(
            dataset_repository_identifier="MTBLS4444", accession_type="test"
        )
        print("Accession: %s" % accession)
    except MhdClientError as ex:
        print("Error: %s" % ex.message)


def submit_legacy_dataset_example():
    announcement_file_path = "MTBLS9876543.announcement.json"
    dataset_repository_id = "MTBLS9876543"
    announcement_reason = "Initial revision"
    mhd_client: MhdClient = MhdClient(mhd_webservice_base_url, api_token)

    try:
        revision: SubmittedRevision = mhd_client.submit_announcement_file(
            dataset_repository_id=dataset_repository_id,
            mhd_id=None,
            file_path=announcement_file_path,
            announcement_reason=announcement_reason,
        )
        print("Revision: %s" % revision.revision)
    except MhdClientError as ex:
        print("Error: %s" % ex.message)


def submit_mhd_dataset_example():
    announcement_file_path = "MTBLS9876543.announcement.json"
    mhd_id = "MHD0000001"
    dataset_repository_id = "MTBLS22222"
    announcement_reason = "Initial revision"
    mhd_client: MhdClient = MhdClient(mhd_webservice_base_url, api_token)

    try:
        revision: SubmittedRevision = mhd_client.submit_announcement_file(
            dataset_repository_id=dataset_repository_id,
            mhd_id=mhd_id,
            file_path=announcement_file_path,
            announcement_reason=announcement_reason,
        )
        print("Revision: %s" % revision.revision)
    except MhdClientError as ex:
        print("Error: %s" % ex.message)

Metadata

Release files for mhd-model 0.1.111

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

Source distribution (sdist)

Source distribution for mhd-model 0.1.111
File Size Uploaded
mhd_model-0.1.111.tar.gz 236.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for mhd-model 0.1.111
File Interpreter ABI Platform
mhd_model-0.1.111-py3-none-any.whl Python 3 none any Details

Total release size: 535.1 kB

Release files / mhd_model-0.1.111.tar.gz

Download URL mhd_model-0.1.111.tar.gz
Size 236.6 kB
Tags Source
SHA-256 checksum
How to use checksums
9cd18c4367c97a5065a75b3dac271ba8c032498e9f5d1de9dc64f0f5d3011fcb
BLAKE2b-256 checksum
How to use checksums
c35b5a4f330c369fe9044df4bf42ed1efce96a500c730a6a9598b387a6672a31
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / mhd_model-0.1.111-py3-none-any.whl

Download URL mhd_model-0.1.111-py3-none-any.whl
Size 298.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
64079652bd08e349aae429fb0e4fc0f43aa8189543f906dac1886d0f1da5c61b
BLAKE2b-256 checksum
How to use checksums
55068924270a59aa9d77957e28ddd9a808c8e70977961548222fe4186897f758
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.1.111 This release

2 release files

0.1.92

2 release files

0.1.91

2 release files

0.1.90

2 release files

0.1.85

2 release files

0.1.84

2 release files

0.1.83

2 release files

0.1.82

2 release files

0.1.81

2 release files

0.1.80

2 release files

0.1.79

2 release files

0.1.78

2 release files

0.1.77

2 release files

0.1.76

2 release files

0.1.75

2 release files

0.1.72

2 release files

0.1.71

2 release files

0.1.70

2 release files

0.1.69

2 release files

0.1.68

2 release files

0.1.67

2 release files

0.1.66

2 release files

0.1.65

2 release files

0.1.64

2 release files

0.1.63

2 release files

0.1.62

2 release files

0.1.61

2 release files

0.1.60

2 release files

0.1.59

2 release files

0.1.58

2 release files

0.1.57

2 release files

0.1.56

2 release files

0.1.55

2 release files

0.1.54

2 release files

0.1.53

2 release files

0.1.52

2 release files

0.1.51

2 release files

0.1.43

2 release files

0.1.42

2 release files

0.1.41

2 release files

0.1.40

2 release files

0.1.39

2 release files

0.1.38

2 release files

0.1.37

2 release files

0.1.36

2 release files

0.1.35

2 release files

0.1.34

2 release files

0.1.33

2 release files

0.1.32

2 release files

0.1.31

2 release files

0.1.30

2 release files

0.1.29

2 release files

0.1.28

2 release files

0.1.27

2 release files

0.1.26

2 release files

0.1.25

2 release files

0.1.24

2 release files

0.1.23

2 release files

0.1.22

2 release files

0.1.21

2 release files

0.1.20

2 release files

0.1.19

2 release files

0.1.18

2 release files

0.1.17

2 release files

0.1.16

2 release files

0.1.15

2 release files

0.1.14

2 release files

0.1.13

2 release files

0.1.12

2 release files

0.1.11

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.13

2 release files

0.0.12

2 release files

0.0.11

2 release files

0.0.10

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

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