Skip to content

CLI reference

dcmclient exposes 65 agent-facing tools over one declarative ToolSpec registry — the same registry that backs the manifest self-description and the live mcp server. This page is generated straight from that manifest, so it cannot drift from the binary.

Conventions

stdout = machine output, stderr = human diagnostics. Status tools (the dcmnet SCUs/SCPs + dcmprobe/dcmconv/json2dcm/xml2dcm) accept --json for a {tool,ok,exit_code,error,result} envelope; document tools (dcmdump/dcm2json/dcm2xml/dsrdump/dsr2html/dcmvalidate) write their structured artifact straight to stdout. Network tools also surface the DICOM response status in result.

Exit codes

Code Meaning
0 success
1 runtime error — unreadable / invalid input, or a per-file / per-operation failure
104 CLI argument conversion error (bad numeric or enum value)
105 CLI validation error (rejected value, or mutually-exclusive options)
106 required option or argument missing

Network — DICOMweb & DIMSE

delete

DICOMweb DELETE a study / series / instance (PS3.18 §10.6)

network · module dicomweb

Option Type Description
-s / --server string Server origin, e.g. http://localhost:8042 (or use --profile)
--base-path string DICOMweb base path under the origin
--auth string Authorization header value (e.g. 'Bearer ey…' or 'Basic …')
--profile string Fill --server/--base-path/--auth from a saved dcmclient config profile
--level string Delete level: study | series | instance
--study string StudyInstanceUID (required)
--series string SeriesInstanceUID (series/instance level)
--instance string SOPInstanceUID (instance level)
--yes bool Confirm the irreversible delete (required)
--aws-region string AWS region (or $AWS_REGION). Required to enable SigV4
--aws-access-key string AWS access key (or $AWS_ACCESS_KEY_ID)
--aws-secret-key string AWS secret key (or $AWS_SECRET_ACCESS_KEY)
--aws-session-token string STS session token (or $AWS_SESSION_TOKEN). Optional
--aws-service string AWS service for SigV4 scope (default medical-imaging)
--oauth2-token-url string OAuth2 token endpoint URL (or $DCMCLIENT_OAUTH2_TOKEN_URL)
--oauth2-auth-url string OAuth2 authorization endpoint URL — loopback flow (or $DCMCLIENT_OAUTH2_AUTH_URL)
--oauth2-device-url string OAuth2 device authorization endpoint URL — device flow (or $DCMCLIENT_OAUTH2_DEVICE_URL)
--oauth2-client-id string OAuth2 client_id (or $DCMCLIENT_OAUTH2_CLIENT_ID)
--oauth2-client-secret string OAuth2 client_secret (or $DCMCLIENT_OAUTH2_CLIENT_SECRET)
--oauth2-scope string OAuth2 scope string (or $DCMCLIENT_OAUTH2_SCOPE)
--oauth2-refresh-token string Bootstrap refresh_token (or $DCMCLIENT_OAUTH2_REFRESH_TOKEN)
--oauth2-flow string Flow override: client_credentials | refresh | loopback | device (default: auto)
--oauth2-loopback-port uint Fixed 127.0.0.1 redirect port for the loopback flow (default 0 = OS-assigned)
--oauth2-no-cache bool Don't read or write the on-disk token cache
$ dcmclient delete --server http://localhost:8042 --study 1.2.3 --yes
$ dcmclient delete --profile pacs --study 1.2.3 --series 1.2.4 --instance 1.2.5 --yes

echoscu

DIMSE Verification SCU — one association, N C-ECHO round-trips

network · module dcmnet

Option Type Description
peer string, required Peer SCP host (IP / DNS name)
port uint, required Peer SCP TCP port
--aet (-aet) string Calling AE Title (us)
--aec (-aec) string Called AE Title (peer)
--max-pdu (-pdu) uint Maximum receive PDU size
--connect-timeout (-to, --timeout, -ta, --acse-timeout) string Association-establishment timeout in SECONDS — TCP connect + ACSE handshake (fractional allowed; default 30). The aliases --timeout/-to and --acse-timeout/-ta also set it: this async stack uses one establishment timeout covering both connect and ACSE
--dimse-timeout (-td) string Per-operation DIMSE response timeout in SECONDS (fractional; 0 = no bound) — abort if the peer stays silent this long waiting for a response (for C-FIND/C-GET it bounds the gap between results, so a long healthy query isn't cut off). Alias: -td
--repeat uint Number of C-ECHO round-trips on the single association
--json bool Emit a single {tool,ok,exit_code,result} status object on stdout
--tls / --enable-tls bool Wrap the DIMSE association in TLS 1.2+.
--tls-ca-cert string PEM bundle the peer's certificate is verified against (default: system trust store).
--tls-cert string Our client certificate (PEM) — enables mTLS. Pair with --tls-key.
--tls-key string Our client private key (PEM) — pair with --tls-cert.
--tls-insecure bool Skip server certificate verification. Dev/self-signed only.
--tls-server-name string SNI server name (default: peer host). Used for cert hostname match.
-v / --verbose bool Per-echo trace to stderr
$ dcmclient echoscu PACS 4242 --aec PACS
$ dcmclient echoscu 127.0.0.1 11112 --repeat 3 --json

findscu

DIMSE Q/R FIND SCU — query a remote SCP for matching studies / series / instances

network · module dcmnet

Option Type Description
peer string, required Peer SCP host (IP / DNS name)
port uint, required Peer SCP TCP port
--aet (-aet) string Calling AE Title (us)
--aec (-aec) string Called AE Title (peer)
--max-pdu (-pdu) uint Maximum receive PDU size
--connect-timeout (-to, --timeout, -ta, --acse-timeout) string Association-establishment timeout in SECONDS — TCP connect + ACSE handshake (fractional allowed; default 30). The aliases --timeout/-to and --acse-timeout/-ta also set it: this async stack uses one establishment timeout covering both connect and ACSE
--dimse-timeout (-td) string Per-operation DIMSE response timeout in SECONDS (fractional; 0 = no bound) — abort if the peer stays silent this long waiting for a response (for C-FIND/C-GET it bounds the gap between results, so a long healthy query isn't cut off). Alias: -td
-P / --patient bool Patient Root information model (PS3.4 §C.6.1)
-S / --study bool Study Root information model (PS3.4 §C.6.2 — default)
-O / --psonly bool Patient/Study Only information model (PS3.4 §C.6.3)
-W / --worklist bool Modality Worklist information model (PS3.4 §K.6) — requires --query-file (the MWL identifier needs a Scheduled Procedure Step Sequence)
-k / --key string[] Matching / returning key. Forms: 'PatientName=DOE^', '0010,0010=DOE^', or 'PatientID' (returning key, empty value).
--query-file string DICOM JSON Model file supplying the C-FIND identifier verbatim (replaces -k). Required for -W (MWL); also for any query needing sequences.
--cancel uint Send C-CANCEL after N pending responses
--json bool Emit one NormalizedStudy JSON object per pending response (study-root flows)
--tls / --enable-tls bool Wrap the DIMSE association in TLS 1.2+.
--tls-ca-cert string PEM bundle the peer's certificate is verified against (default: system trust store).
--tls-cert string Our client certificate (PEM) — enables mTLS. Pair with --tls-key.
--tls-key string Our client private key (PEM) — pair with --tls-cert.
--tls-insecure bool Skip server certificate verification. Dev/self-signed only.
--tls-server-name string SNI server name (default: peer host). Used for cert hostname match.
-v / --verbose bool Per-step protocol trace to stderr
$ dcmclient findscu PACS 4242 --aec PACS -S -k PatientName=DOE^*
$ dcmclient findscu 127.0.0.1 11112 -k StudyInstanceUID -k PatientID --json

forward

Relay studies between two DICOMweb servers (WADO-RS pull → STOW-RS push)

network · module dicomweb

Option Type Description
--source string Source server origin (or --source-profile)
--source-base-path string Source DICOMweb base path
--source-auth string Source Authorization header value
--source-profile string Fill --source/-base-path/-auth from a saved profile
--dest string Destination server origin (or --dest-profile)
--dest-base-path string Destination DICOMweb base path
--dest-auth string Destination Authorization header value
--dest-profile string Fill --dest/-base-path/-auth from a saved profile
--dest-bound-study string Bind the destination STOW POST to this StudyInstanceUID
--study string, required StudyInstanceUID to relay
--series string SeriesInstanceUID (empty → whole study)
--instance string SOPInstanceUID (empty → whole series/study)
--concurrency uint Parallel series-level pull+push workers at study scope
-v / --verbose bool Per-instance progress to stderr
--source-aws-region string AWS region (or $AWS_REGION). Required to enable SigV4
--source-aws-access-key string AWS access key (or $AWS_ACCESS_KEY_ID)
--source-aws-secret-key string AWS secret key (or $AWS_SECRET_ACCESS_KEY)
--source-aws-session-token string STS session token (or $AWS_SESSION_TOKEN). Optional
--source-aws-service string AWS service for SigV4 scope (default medical-imaging)
--dest-aws-region string AWS region (or $AWS_REGION). Required to enable SigV4
--dest-aws-access-key string AWS access key (or $AWS_ACCESS_KEY_ID)
--dest-aws-secret-key string AWS secret key (or $AWS_SECRET_ACCESS_KEY)
--dest-aws-session-token string STS session token (or $AWS_SESSION_TOKEN). Optional
--dest-aws-service string AWS service for SigV4 scope (default medical-imaging)
--source-oauth2-token-url string OAuth2 token endpoint URL (or $DCMCLIENT_OAUTH2_TOKEN_URL)
--source-oauth2-auth-url string OAuth2 authorization endpoint URL — loopback flow (or $DCMCLIENT_OAUTH2_AUTH_URL)
--source-oauth2-device-url string OAuth2 device authorization endpoint URL — device flow (or $DCMCLIENT_OAUTH2_DEVICE_URL)
--source-oauth2-client-id string OAuth2 client_id (or $DCMCLIENT_OAUTH2_CLIENT_ID)
--source-oauth2-client-secret string OAuth2 client_secret (or $DCMCLIENT_OAUTH2_CLIENT_SECRET)
--source-oauth2-scope string OAuth2 scope string (or $DCMCLIENT_OAUTH2_SCOPE)
--source-oauth2-refresh-token string Bootstrap refresh_token (or $DCMCLIENT_OAUTH2_REFRESH_TOKEN)
--source-oauth2-flow string Flow override: client_credentials | refresh | loopback | device (default: auto)
--source-oauth2-loopback-port uint Fixed 127.0.0.1 redirect port for the loopback flow (default 0 = OS-assigned)
--source-oauth2-no-cache bool Don't read or write the on-disk token cache
--dest-oauth2-token-url string OAuth2 token endpoint URL (or $DCMCLIENT_OAUTH2_TOKEN_URL)
--dest-oauth2-auth-url string OAuth2 authorization endpoint URL — loopback flow (or $DCMCLIENT_OAUTH2_AUTH_URL)
--dest-oauth2-device-url string OAuth2 device authorization endpoint URL — device flow (or $DCMCLIENT_OAUTH2_DEVICE_URL)
--dest-oauth2-client-id string OAuth2 client_id (or $DCMCLIENT_OAUTH2_CLIENT_ID)
--dest-oauth2-client-secret string OAuth2 client_secret (or $DCMCLIENT_OAUTH2_CLIENT_SECRET)
--dest-oauth2-scope string OAuth2 scope string (or $DCMCLIENT_OAUTH2_SCOPE)
--dest-oauth2-refresh-token string Bootstrap refresh_token (or $DCMCLIENT_OAUTH2_REFRESH_TOKEN)
--dest-oauth2-flow string Flow override: client_credentials | refresh | loopback | device (default: auto)
--dest-oauth2-loopback-port uint Fixed 127.0.0.1 redirect port for the loopback flow (default 0 = OS-assigned)
--dest-oauth2-no-cache bool Don't read or write the on-disk token cache
$ dcmclient forward --source http://a:8042 --dest http://b:8042 --study 1.2.3
$ dcmclient forward --source-profile src --dest-profile dst --series 1.2.3.4

getscu

DIMSE Q/R GET SCU — retrieve matching instances over a single association

writes files · network · module dcmnet

Option Type Description
peer string, required Peer SCP host (IP / DNS name)
port uint, required Peer SCP TCP port
--aet (-aet) string Calling AE Title (us)
--aec (-aec) string Called AE Title (peer)
--max-pdu (-pdu) uint Maximum receive PDU size
--connect-timeout (-to, --timeout, -ta, --acse-timeout) string Association-establishment timeout in SECONDS — TCP connect + ACSE handshake (fractional allowed; default 30). The aliases --timeout/-to and --acse-timeout/-ta also set it: this async stack uses one establishment timeout covering both connect and ACSE
--dimse-timeout (-td) string Per-operation DIMSE response timeout in SECONDS (fractional; 0 = no bound) — abort if the peer stays silent this long waiting for a response (for C-FIND/C-GET it bounds the gap between results, so a long healthy query isn't cut off). Alias: -td
-P / --patient bool Patient Root information model
-S / --study bool Study Root information model (default)
-O / --psonly bool Patient/Study Only information model
-k / --key string[] Matching key. Same syntax as find-scu's -k.
--store-class string[] Storage SOP Class UID to receive (repeatable) — declare the classes a prior find-scu showed so they negotiate their full transfer-syntax set (lets a non-transcoding SCP return compressed instances). Empty: common image classes only.
--cancel uint Send C-CANCEL after N pending C-GET responses
--out-dir (-od) string Directory to write received instances into. Default '.'
--json bool Emit a {tool,ok,exit_code,result} status object on stdout
--tls / --enable-tls bool Wrap the DIMSE association in TLS 1.2+.
--tls-ca-cert string PEM bundle the peer's certificate is verified against (default: system trust store).
--tls-cert string Our client certificate (PEM) — enables mTLS. Pair with --tls-key.
--tls-key string Our client private key (PEM) — pair with --tls-cert.
--tls-insecure bool Skip server certificate verification. Dev/self-signed only.
--tls-server-name string SNI server name (default: peer host). Used for cert hostname match.
-v / --verbose bool Per-step + per-instance progress to stderr
$ dcmclient getscu PACS 4242 --aec PACS -S -k StudyInstanceUID=1.2.3 --out-dir out/
$ dcmclient getscu 127.0.0.1 11112 -k PatientID=12345 --out-dir study/

ian-scu

DIMSE Instance Availability Notification SCU — announce available instances to a peer (N-CREATE, PS3.4 §R)

network · module dcmnet

Option Type Description
peer string, required Peer SCP host (IP / DNS name)
port uint, required Peer SCP TCP port
--aet (-aet) string Calling AE Title (us)
--aec (-aec) string Called AE Title (peer)
--max-pdu (-pdu) uint Maximum receive PDU size
--connect-timeout (-to, --timeout, -ta, --acse-timeout) string Association-establishment timeout in SECONDS — TCP connect + ACSE handshake (fractional allowed; default 30). The aliases --timeout/-to and --acse-timeout/-ta also set it: this async stack uses one establishment timeout covering both connect and ACSE
--dimse-timeout (-td) string Per-operation DIMSE response timeout in SECONDS (fractional; 0 = no bound) — abort if the peer stays silent this long waiting for a response (for C-FIND/C-GET it bounds the gap between results, so a long healthy query isn't cut off). Alias: -td
--dataset-file string DICOM JSON Model file: the Attribute List (Referenced Series Sequence with per-instance availability + retrieve AE)
--instance string Propose the IAN SOP Instance UID (empty → the SCP assigns one)
--json bool Emit a single {tool,ok,exit_code,result} status object on stdout
--tls / --enable-tls bool Wrap the DIMSE association in TLS 1.2+.
--tls-ca-cert string PEM bundle the peer's certificate is verified against (default: system trust store).
--tls-cert string Our client certificate (PEM) — enables mTLS. Pair with --tls-key.
--tls-key string Our client private key (PEM) — pair with --tls-cert.
--tls-insecure bool Skip server certificate verification. Dev/self-signed only.
--tls-server-name string SNI server name (default: peer host). Used for cert hostname match.
-v / --verbose bool Verbose diagnostics to stderr
$ dcmclient ian-scu PACS 11112 --dataset-file ian.json
$ dcmclient ian-scu 127.0.0.1 11112 --dataset-file ian.json --json

listen

DIMSE SCP receiver — accept C-STORE associations and forward each instance to a DICOMweb sink

writes files · network · module dcmnet

Option Type Description
-p / --port uint Local TCP port to bind
--ae-title string Local AE Title
--bind string Bind address. Default any (0.0.0.0); use 127.0.0.1 for loopback-only
--sink string DICOMweb sink origin to forward to, e.g. http://localhost:8042 (or use --sink-profile)
--sink-profile string Use a saved profile for the sink
--sink-base-path string Sink DICOMweb base path. Default /dicom-web
--sink-auth string Sink Authorization header value
--max-pdu (-pdu) uint Maximum receive PDU size advertised in A-ASSOCIATE-AC (0 = unlimited)
--max-assocs uint Cap on concurrent associations; new SCUs over the cap get A-ASSOCIATE-RJ (0 = unlimited)
--idle-timeout string Per-connection idle timeout in SECONDS (fractional allowed) — peer is A-ABORTed if silent this long (0 = no bound)
--prefer-uncompr bool Reject any encapsulated transfer syntax — accept only EVR-LE / IVR-LE (a stricter default; ours accepts encapsulated)
--tls / --enable-tls bool Wrap the DIMSE association in TLS 1.2+. Required for everything else --tls-* to take effect.
--tls-ca-cert string PEM bundle inbound client certs are verified against (enables mTLS). Optional.
--tls-cert string Our server certificate (PEM). Required when --tls is on.
--tls-key string Our server private key (PEM). Required when --tls is on.
--tls-no-require-client-cert bool When --tls-ca-cert is set, allow anonymous clients (cert verified IF presented, but not required).
--tls-ciphers string Cipher policy: 'bcp195' (curated RFC 9325 AEAD+PFS allowlist), 'default'/'' (provider default), or a raw OpenSSL TLS 1.2 cipher string. Resolved before the handshake; the server also wins cipher selection.
-v / --verbose bool Per-association + per-instance progress to stderr
$ dcmclient listen --port 11112 --ae-title DCMCLIENT --sink http://localhost:8042
$ dcmclient listen -p 104 --sink-profile pacs --sink-base-path /dicom-web

movescu

DIMSE Q/R MOVE SCU — ship matched instances to a third-party C-STORE destination AET

writes files · network · module dcmnet

Option Type Description
peer string, required Peer SCP host (IP / DNS name)
port uint, required Peer SCP TCP port
--aet (-aet) string Calling AE Title (us)
--aec (-aec) string Called AE Title (peer)
--max-pdu (-pdu) uint Maximum receive PDU size
--connect-timeout (-to, --timeout, -ta, --acse-timeout) string Association-establishment timeout in SECONDS — TCP connect + ACSE handshake (fractional allowed; default 30). The aliases --timeout/-to and --acse-timeout/-ta also set it: this async stack uses one establishment timeout covering both connect and ACSE
--dimse-timeout (-td) string Per-operation DIMSE response timeout in SECONDS (fractional; 0 = no bound) — abort if the peer stays silent this long waiting for a response (for C-FIND/C-GET it bounds the gap between results, so a long healthy query isn't cut off). Alias: -td
--aem / --move-dest (-aem) string, required Move destination AE Title (REQUIRED). The SCP must have this AET registered as a known modality so it can open a C-STORE association.
-P / --patient bool Patient Root information model
-S / --study bool Study Root information model (default)
-O / --psonly bool Patient/Study Only information model
-k / --key string[] Matching key. Same syntax as find-scu's -k.
--cancel uint Send C-CANCEL after N pending responses
--json bool Emit a {tool,ok,exit_code,result} status object (sub-op counters) on stdout
--tls / --enable-tls bool Wrap the DIMSE association in TLS 1.2+.
--tls-ca-cert string PEM bundle the peer's certificate is verified against (default: system trust store).
--tls-cert string Our client certificate (PEM) — enables mTLS. Pair with --tls-key.
--tls-key string Our client private key (PEM) — pair with --tls-cert.
--tls-insecure bool Skip server certificate verification. Dev/self-signed only.
--tls-server-name string SNI server name (default: peer host). Used for cert hostname match.
-v / --verbose bool Per-step + sub-operation counter progress to stderr
$ dcmclient movescu PACS 4242 --aec PACS --move-dest STORESCP -S -k StudyInstanceUID=1.2.3
$ dcmclient movescu 127.0.0.1 11112 --aem DESTAE -k PatientID=12345 --json

mpps-scu

DIMSE Modality Performed Procedure Step (MPPS) SCU — start (N-CREATE) / update (N-SET) a procedure step (PS3.4 §F)

network · module dcmnet

Option Type Description
peer string, required Peer SCP host (IP / DNS name)
port uint, required Peer SCP TCP port
--aet (-aet) string Calling AE Title (us)
--aec (-aec) string Called AE Title (peer)
--max-pdu (-pdu) uint Maximum receive PDU size
--connect-timeout (-to, --timeout, -ta, --acse-timeout) string Association-establishment timeout in SECONDS — TCP connect + ACSE handshake (fractional allowed; default 30). The aliases --timeout/-to and --acse-timeout/-ta also set it: this async stack uses one establishment timeout covering both connect and ACSE
--dimse-timeout (-td) string Per-operation DIMSE response timeout in SECONDS (fractional; 0 = no bound) — abort if the peer stays silent this long waiting for a response (for C-FIND/C-GET it bounds the gap between results, so a long healthy query isn't cut off). Alias: -td
--action string MPPS operation: create (N-CREATE, status IN PROGRESS) | set (N-SET)
--instance string MPPS SOP Instance UID — required for set; optional for create (proposes the UID)
--dataset-file string DICOM JSON Model file: the Attribute List (create) or Modification List (set)
--json bool Emit a single {tool,ok,exit_code,result} status object on stdout
--tls / --enable-tls bool Wrap the DIMSE association in TLS 1.2+.
--tls-ca-cert string PEM bundle the peer's certificate is verified against (default: system trust store).
--tls-cert string Our client certificate (PEM) — enables mTLS. Pair with --tls-key.
--tls-key string Our client private key (PEM) — pair with --tls-cert.
--tls-insecure bool Skip server certificate verification. Dev/self-signed only.
--tls-server-name string SNI server name (default: peer host). Used for cert hostname match.
-v / --verbose bool Verbose diagnostics to stderr
$ dcmclient mpps-scu PACS 11112 --action create --dataset-file step.json
$ dcmclient mpps-scu 127.0.0.1 11112 --action set --instance 1.2.3 --dataset-file complete.json

printscu

DIMSE Print Management SCU — print an image to a hardcopy / virtual printer (Film Session/Box/Image Box, PS3.4 §H)

network · module dcmnet

Option Type Description
peer string, required Peer SCP host (IP / DNS name)
port uint, required Peer SCP TCP port
--aet (-aet) string Calling AE Title (us)
--aec (-aec) string Called AE Title (peer)
--max-pdu (-pdu) uint Maximum receive PDU size
--connect-timeout (-to, --timeout, -ta, --acse-timeout) string Association-establishment timeout in SECONDS — TCP connect + ACSE handshake (fractional allowed; default 30). The aliases --timeout/-to and --acse-timeout/-ta also set it: this async stack uses one establishment timeout covering both connect and ACSE
--dimse-timeout (-td) string Per-operation DIMSE response timeout in SECONDS (fractional; 0 = no bound) — abort if the peer stays silent this long waiting for a response (for C-FIND/C-GET it bounds the gap between results, so a long healthy query isn't cut off). Alias: -td
--dicom-file string DICOM instance to print (rendered to an 8-bit film tile)
--frame uint 1-based frame to print (multi-frame instances; default 1)
--max-dim uint Aspect-preserving downscale so the largest dimension fits N px (0 = native resolution)
--grayscale bool Print a colour source as grayscale (luma) instead of colour
--json bool Emit a single {tool,ok,exit_code,result} status object on stdout
--tls / --enable-tls bool Wrap the DIMSE association in TLS 1.2+.
--tls-ca-cert string PEM bundle the peer's certificate is verified against (default: system trust store).
--tls-cert string Our client certificate (PEM) — enables mTLS. Pair with --tls-key.
--tls-key string Our client private key (PEM) — pair with --tls-cert.
--tls-insecure bool Skip server certificate verification. Dev/self-signed only.
--tls-server-name string SNI server name (default: peer host). Used for cert hostname match.
-v / --verbose bool Verbose diagnostics to stderr
$ dcmclient printscu PRINTER 104 --dicom-file chest.dcm
$ dcmclient printscu 127.0.0.1 11112 --dicom-file ct.dcm --frame 3 --max-dim 2048 --json

qido

QIDO-RS study / series / instance search (PS3.18 §10.6)

network · module dicomweb

Option Type Description
-s / --server string Server origin, e.g. http://localhost:8042 (or use --profile)
--base-path string DICOMweb base path under the origin
--auth string Authorization header value (e.g. 'Bearer ey…' or 'Basic …')
--profile string Fill --server/--base-path/--auth from a saved dcmclient config profile
--patient-name string QIDO PatientName match (wildcards *,?)
--patient-id string QIDO PatientID match
--study string StudyInstanceUID (match, or path binding for series/instance)
--series string SeriesInstanceUID (match, or path binding for instance level)
--modality string Modality match, e.g. CT / MR / US
--date-range string StudyDate: 2025-01-01..2025-12-31, half-open .. forms, or a single date
--sort string[] PS3.18 §10.6.1.5 sort term(s), '-' prefix = descending (e.g. -StudyDate)
--include string[] Extra includefield(s): keyword or 8-hex tag
--level string Query level: study | series | instance
--limit uint Max results to return
--offset uint Result offset for paging
--json bool Emit one NormalizedStudy JSON record per match (else human table)
--aws-region string AWS region (or $AWS_REGION). Required to enable SigV4
--aws-access-key string AWS access key (or $AWS_ACCESS_KEY_ID)
--aws-secret-key string AWS secret key (or $AWS_SECRET_ACCESS_KEY)
--aws-session-token string STS session token (or $AWS_SESSION_TOKEN). Optional
--aws-service string AWS service for SigV4 scope (default medical-imaging)
--oauth2-token-url string OAuth2 token endpoint URL (or $DCMCLIENT_OAUTH2_TOKEN_URL)
--oauth2-auth-url string OAuth2 authorization endpoint URL — loopback flow (or $DCMCLIENT_OAUTH2_AUTH_URL)
--oauth2-device-url string OAuth2 device authorization endpoint URL — device flow (or $DCMCLIENT_OAUTH2_DEVICE_URL)
--oauth2-client-id string OAuth2 client_id (or $DCMCLIENT_OAUTH2_CLIENT_ID)
--oauth2-client-secret string OAuth2 client_secret (or $DCMCLIENT_OAUTH2_CLIENT_SECRET)
--oauth2-scope string OAuth2 scope string (or $DCMCLIENT_OAUTH2_SCOPE)
--oauth2-refresh-token string Bootstrap refresh_token (or $DCMCLIENT_OAUTH2_REFRESH_TOKEN)
--oauth2-flow string Flow override: client_credentials | refresh | loopback | device (default: auto)
--oauth2-loopback-port uint Fixed 127.0.0.1 redirect port for the loopback flow (default 0 = OS-assigned)
--oauth2-no-cache bool Don't read or write the on-disk token cache
$ dcmclient qido --server http://localhost:8042 --patient-name 'DOE^*' --json
$ dcmclient qido --profile pacs --modality CT --date-range 2025-01-01.. --limit 20

stgcmt-scu

DIMSE Storage Commitment Push Model SCU — request commitment (N-ACTION) for stored instances (PS3.4 §J)

network · module dcmnet

Option Type Description
peer string, required Peer SCP host (IP / DNS name)
port uint, required Peer SCP TCP port
--aet (-aet) string Calling AE Title (us)
--aec (-aec) string Called AE Title (peer)
--max-pdu (-pdu) uint Maximum receive PDU size
--connect-timeout (-to, --timeout, -ta, --acse-timeout) string Association-establishment timeout in SECONDS — TCP connect + ACSE handshake (fractional allowed; default 30). The aliases --timeout/-to and --acse-timeout/-ta also set it: this async stack uses one establishment timeout covering both connect and ACSE
--dimse-timeout (-td) string Per-operation DIMSE response timeout in SECONDS (fractional; 0 = no bound) — abort if the peer stays silent this long waiting for a response (for C-FIND/C-GET it bounds the gap between results, so a long healthy query isn't cut off). Alias: -td
--dataset-file string DICOM JSON Model file carrying the (0008,1199) Referenced SOP Sequence of instances to commit (do NOT include (0008,1195) — use --transaction-uid)
--transaction-uid string (0008,1195) Transaction UID (PS3.4 §J Type 1) — correlates the later N-EVENT-REPORT result; required
--json bool Emit a single {tool,ok,exit_code,result} status object on stdout
--tls / --enable-tls bool Wrap the DIMSE association in TLS 1.2+.
--tls-ca-cert string PEM bundle the peer's certificate is verified against (default: system trust store).
--tls-cert string Our client certificate (PEM) — enables mTLS. Pair with --tls-key.
--tls-key string Our client private key (PEM) — pair with --tls-cert.
--tls-insecure bool Skip server certificate verification. Dev/self-signed only.
--tls-server-name string SNI server name (default: peer host). Used for cert hostname match.
-v / --verbose bool Verbose diagnostics to stderr
$ dcmclient stgcmt-scu PACS 11112 --dataset-file commit.json
$ dcmclient stgcmt-scu 127.0.0.1 11112 --dataset-file commit.json --json

storescp

DIMSE Storage SCP — accept C-STORE associations and write each instance to disk

writes files · network · module dcmnet

Option Type Description
port uint Local TCP port to bind
--aet (-aet) string Local AE Title
--bind string Bind address. Default any (0.0.0.0); use 127.0.0.1 for loopback-only
--out-dir (-od) string Directory to write received instances into. Default '.'
--max-pdu (-pdu) uint Maximum receive PDU size advertised in A-ASSOCIATE-AC (0 = unlimited)
--max-assocs uint Cap on concurrent associations; new SCUs over the cap get A-ASSOCIATE-RJ (0 = unlimited)
--idle-timeout string Per-connection idle timeout in SECONDS (fractional allowed) — peer is A-ABORTed if silent this long (0 = no bound)
--sort-by-study bool Group received instances under // subdirectories
--unique-filenames bool On collision, append _NNN before .dcm instead of overwriting
--prefer-uncompr bool Reject any encapsulated transfer syntax — accept only EVR-LE / IVR-LE (a stricter default; ours accepts encapsulated)
--tls / --enable-tls bool Wrap the DIMSE association in TLS 1.2+. Required for everything else --tls-* to take effect.
--tls-ca-cert string PEM bundle inbound client certs are verified against (enables mTLS). Optional.
--tls-cert string Our server certificate (PEM). Required when --tls is on.
--tls-key string Our server private key (PEM). Required when --tls is on.
--tls-no-require-client-cert bool When --tls-ca-cert is set, allow anonymous clients (cert verified IF presented, but not required).
--tls-ciphers string Cipher policy: 'bcp195' (curated RFC 9325 AEAD+PFS allowlist), 'default'/'' (provider default), or a raw OpenSSL TLS 1.2 cipher string. Resolved before the handshake; the server also wins cipher selection.
-v / --verbose bool Per-association + per-instance progress to stderr
$ dcmclient storescp 11112 --aet STORESCP --out-dir incoming/
$ dcmclient storescp 104 --bind 127.0.0.1 --sort-by-study --unique-filenames

storescu

DIMSE Storage SCU — send one or more .dcm files to a remote SCP over a single association

network · module dcmnet

Option Type Description
peer string, required Peer SCP host (IP / DNS name)
port uint, required Peer SCP TCP port
--aet (-aet) string Calling AE Title (us)
--aec (-aec) string Called AE Title (peer)
--max-pdu (-pdu) uint Maximum receive PDU size
--connect-timeout (-to, --timeout, -ta, --acse-timeout) string Association-establishment timeout in SECONDS — TCP connect + ACSE handshake (fractional allowed; default 30). The aliases --timeout/-to and --acse-timeout/-ta also set it: this async stack uses one establishment timeout covering both connect and ACSE
--dimse-timeout (-td) string Per-operation DIMSE response timeout in SECONDS (fractional; 0 = no bound) — abort if the peer stays silent this long waiting for a response (for C-FIND/C-GET it bounds the gap between results, so a long healthy query isn't cut off). Alias: -td
files string[], required One or more Part-10 DICOM files OR directories (directories are recursed by default; see --no-recurse)
--no-recurse bool When a positional names a directory, take only its top-level entries instead of descending (default: recurse)
--propose-little (-xe) bool Propose Explicit VR Little Endian
--propose-implicit (-xi) bool Propose Implicit VR Little Endian
--propose-deflated (-xd) bool Propose Deflated Explicit VR Little Endian
--propose-rle (-xr) bool Propose RLE Lossless
--propose-lossless (-xs) bool Propose JPEG Lossless (process 14, SV1)
--propose-jpeg8 (-xy) bool Propose JPEG Baseline (process 1)
--propose-jpeg12 (-xx) bool Propose JPEG Extended (process 2 & 4)
--propose-j2k-lossless (-xv) bool Propose JPEG 2000 Lossless Only
--propose-j2k-lossy (-xw) bool Propose JPEG 2000
--propose-jls-lossless (-xt) bool Propose JPEG-LS Lossless
--propose-jls-lossy (-xu) bool Propose JPEG-LS Lossy (near-lossless)
--propose-htj2k bool Propose High-Throughput JPEG 2000 Lossless Only
--json bool Emit a {tool,ok,exit_code,result} status object (with per-file results) on stdout
--tls / --enable-tls bool Wrap the DIMSE association in TLS 1.2+.
--tls-ca-cert string PEM bundle the peer's certificate is verified against (default: system trust store).
--tls-cert string Our client certificate (PEM) — enables mTLS. Pair with --tls-key.
--tls-key string Our client private key (PEM) — pair with --tls-cert.
--tls-insecure bool Skip server certificate verification. Dev/self-signed only.
--tls-server-name string SNI server name (default: peer host). Used for cert hostname match.
-v / --verbose bool Per-file progress to stderr
$ dcmclient storescu PACS 4242 --aec PACS scan.dcm
$ dcmclient storescu 127.0.0.1 11112 study/ --propose-j2k-lossless

stow

STOW-RS upload one or more .dcm files

network · module dicomweb

Option Type Description
-s / --server string Server origin, e.g. http://localhost:8042 (or use --profile)
--base-path string DICOMweb base path under the origin
--auth string Authorization header value (e.g. 'Bearer ey…' or 'Basic …')
--profile string Fill --server/--base-path/--auth from a saved dcmclient config profile
--study string Bind the STOW POST to this StudyInstanceUID (empty → POST /studies, unbound)
files string[], required One or more .dcm files to upload
-v / --verbose bool Per-file progress to stderr
--aws-region string AWS region (or $AWS_REGION). Required to enable SigV4
--aws-access-key string AWS access key (or $AWS_ACCESS_KEY_ID)
--aws-secret-key string AWS secret key (or $AWS_SECRET_ACCESS_KEY)
--aws-session-token string STS session token (or $AWS_SESSION_TOKEN). Optional
--aws-service string AWS service for SigV4 scope (default medical-imaging)
--oauth2-token-url string OAuth2 token endpoint URL (or $DCMCLIENT_OAUTH2_TOKEN_URL)
--oauth2-auth-url string OAuth2 authorization endpoint URL — loopback flow (or $DCMCLIENT_OAUTH2_AUTH_URL)
--oauth2-device-url string OAuth2 device authorization endpoint URL — device flow (or $DCMCLIENT_OAUTH2_DEVICE_URL)
--oauth2-client-id string OAuth2 client_id (or $DCMCLIENT_OAUTH2_CLIENT_ID)
--oauth2-client-secret string OAuth2 client_secret (or $DCMCLIENT_OAUTH2_CLIENT_SECRET)
--oauth2-scope string OAuth2 scope string (or $DCMCLIENT_OAUTH2_SCOPE)
--oauth2-refresh-token string Bootstrap refresh_token (or $DCMCLIENT_OAUTH2_REFRESH_TOKEN)
--oauth2-flow string Flow override: client_credentials | refresh | loopback | device (default: auto)
--oauth2-loopback-port uint Fixed 127.0.0.1 redirect port for the loopback flow (default 0 = OS-assigned)
--oauth2-no-cache bool Don't read or write the on-disk token cache
$ dcmclient stow --server http://localhost:8042 scan1.dcm scan2.dcm
$ dcmclient stow --profile pacs --study 1.2.3 study/*.dcm

termscu

DIMSE termination probe — open an association and immediately A-ABORT (or --release)

network · module dcmnet

Option Type Description
peer string, required Peer SCP host (IP / DNS name)
port uint, required Peer SCP TCP port
--aet (-aet) string Calling AE Title (us)
--aec (-aec) string Called AE Title (peer)
--max-pdu (-pdu) uint Maximum receive PDU size
--connect-timeout (-to, --timeout, -ta, --acse-timeout) string Association-establishment timeout in SECONDS — TCP connect + ACSE handshake (fractional allowed; default 30). The aliases --timeout/-to and --acse-timeout/-ta also set it: this async stack uses one establishment timeout covering both connect and ACSE
--dimse-timeout (-td) string Per-operation DIMSE response timeout in SECONDS (fractional; 0 = no bound) — abort if the peer stays silent this long waiting for a response (for C-FIND/C-GET it bounds the gap between results, so a long healthy query isn't cut off). Alias: -td
--release bool Tear down with A-RELEASE instead of A-ABORT
--json bool Emit a single {tool,ok,exit_code,result} status object on stdout
--tls / --enable-tls bool Wrap the DIMSE association in TLS 1.2+.
--tls-ca-cert string PEM bundle the peer's certificate is verified against (default: system trust store).
--tls-cert string Our client certificate (PEM) — enables mTLS. Pair with --tls-key.
--tls-key string Our client private key (PEM) — pair with --tls-cert.
--tls-insecure bool Skip server certificate verification. Dev/self-signed only.
--tls-server-name string SNI server name (default: peer host). Used for cert hostname match.
-v / --verbose bool Per-step trace to stderr
$ dcmclient termscu PACS 4242 --aec PACS
$ dcmclient termscu 127.0.0.1 11112 --release --json

ups

UPS-RS workitem worklist — create / search / claim / cancel / subscribe workitems (PS3.18 §11)

network · module dicomweb

Option Type Description
-s / --server string Server origin, e.g. http://localhost:8042 (or use --profile)
--base-path string DICOMweb base path under the origin
--auth string Authorization header value (e.g. 'Bearer ey…' or 'Basic …')
--profile string Fill --server/--base-path/--auth from a saved dcmclient config profile
--action string UPS-RS verb: create | search | retrieve | update | change-state | request-cancel | subscribe | unsubscribe
--workitem string Workitem SOP Instance UID
--state string change-state: SCHEDULED | IN PROGRESS | COMPLETED | CANCELED
--transaction-uid string Transaction UID (update / change-state)
--dataset-file string DICOM JSON Model file: the workitem (create), changes (update), or cancellation reason (request-cancel)
--ae-title string Subscriber AE Title (subscribe / unsubscribe)
--match string[] search match key: tag=value or keyword=value
--include string[] search includefield(s): keyword or 8-hex tag
--limit int search: max results to return
--offset int search: result offset for paging
--aws-region string AWS region (or $AWS_REGION). Required to enable SigV4
--aws-access-key string AWS access key (or $AWS_ACCESS_KEY_ID)
--aws-secret-key string AWS secret key (or $AWS_SECRET_ACCESS_KEY)
--aws-session-token string STS session token (or $AWS_SESSION_TOKEN). Optional
--aws-service string AWS service for SigV4 scope (default medical-imaging)
--oauth2-token-url string OAuth2 token endpoint URL (or $DCMCLIENT_OAUTH2_TOKEN_URL)
--oauth2-auth-url string OAuth2 authorization endpoint URL — loopback flow (or $DCMCLIENT_OAUTH2_AUTH_URL)
--oauth2-device-url string OAuth2 device authorization endpoint URL — device flow (or $DCMCLIENT_OAUTH2_DEVICE_URL)
--oauth2-client-id string OAuth2 client_id (or $DCMCLIENT_OAUTH2_CLIENT_ID)
--oauth2-client-secret string OAuth2 client_secret (or $DCMCLIENT_OAUTH2_CLIENT_SECRET)
--oauth2-scope string OAuth2 scope string (or $DCMCLIENT_OAUTH2_SCOPE)
--oauth2-refresh-token string Bootstrap refresh_token (or $DCMCLIENT_OAUTH2_REFRESH_TOKEN)
--oauth2-flow string Flow override: client_credentials | refresh | loopback | device (default: auto)
--oauth2-loopback-port uint Fixed 127.0.0.1 redirect port for the loopback flow (default 0 = OS-assigned)
--oauth2-no-cache bool Don't read or write the on-disk token cache
$ dcmclient ups --action search --server http://localhost:8042 --json
$ dcmclient ups --action change-state --workitem 1.2.3 --state "IN PROGRESS" --transaction-uid 1.2.9 --server http://localhost:8042

upsscu

DIMSE Unified Procedure Step (UPS) SCU — push / pull / claim / update / cancel / subscribe workitems (PS3.4 §CC)

network · module dcmnet

Option Type Description
peer string, required Peer SCP host (IP / DNS name)
port uint, required Peer SCP TCP port
--aet (-aet) string Calling AE Title (us)
--aec (-aec) string Called AE Title (peer)
--max-pdu (-pdu) uint Maximum receive PDU size
--connect-timeout (-to, --timeout, -ta, --acse-timeout) string Association-establishment timeout in SECONDS — TCP connect + ACSE handshake (fractional allowed; default 30). The aliases --timeout/-to and --acse-timeout/-ta also set it: this async stack uses one establishment timeout covering both connect and ACSE
--dimse-timeout (-td) string Per-operation DIMSE response timeout in SECONDS (fractional; 0 = no bound) — abort if the peer stays silent this long waiting for a response (for C-FIND/C-GET it bounds the gap between results, so a long healthy query isn't cut off). Alias: -td
--action string UPS operation: push | get | set | change-state | request-cancel | subscribe | unsubscribe
--workitem string Target workitem SOP Instance UID (get / set / change-state / request-cancel)
--state string change-state: target Procedure Step State (SCHEDULED | IN PROGRESS | COMPLETED | CANCELED)
--transaction-uid string Transaction UID claimed with (change-state / set)
--dataset-file string DICOM JSON Model file: the workitem (push), modification list (set), or cancellation reason (request-cancel)
--receiving-ae string subscribe / unsubscribe: Receiving AE Title (default: the calling AET)
--target string subscribe / unsubscribe: target instance UID (default: the global subscription instance)
--json bool Emit a single {tool,ok,exit_code,result} status object on stdout
--tls / --enable-tls bool Wrap the DIMSE association in TLS 1.2+.
--tls-ca-cert string PEM bundle the peer's certificate is verified against (default: system trust store).
--tls-cert string Our client certificate (PEM) — enables mTLS. Pair with --tls-key.
--tls-key string Our client private key (PEM) — pair with --tls-cert.
--tls-insecure bool Skip server certificate verification. Dev/self-signed only.
--tls-server-name string SNI server name (default: peer host). Used for cert hostname match.
-v / --verbose bool Verbose diagnostics to stderr
$ dcmclient upsscu PACS 11112 --action push --dataset-file workitem.json
$ dcmclient upsscu 127.0.0.1 11112 --action change-state --workitem 1.2.3 --state "IN PROGRESS" --transaction-uid 1.2.9
$ dcmclient upsscu 127.0.0.1 11112 --action subscribe --json

wado

WADO-RS bulk retrieve (study / series / instance)

writes files · network · module dicomweb

Option Type Description
-s / --server string Server origin, e.g. http://localhost:8042 (or use --profile)
--base-path string DICOMweb base path under the origin
--auth string Authorization header value (e.g. 'Bearer ey…' or 'Basic …')
--profile string Fill --server/--base-path/--auth from a saved dcmclient config profile
--study string, required StudyInstanceUID to retrieve
--series string SeriesInstanceUID (empty → whole study)
--instance string SOPInstanceUID (empty → whole series/study)
--transfer-syntax string Preferred transfer syntax UID to request (empty → server's stored encoding)
-o / --out string Output directory for retrieved instances
--concurrency uint Parallel fetch width at study level (1 = single GET)
-v / --verbose bool Per-instance progress to stderr
--aws-region string AWS region (or $AWS_REGION). Required to enable SigV4
--aws-access-key string AWS access key (or $AWS_ACCESS_KEY_ID)
--aws-secret-key string AWS secret key (or $AWS_SECRET_ACCESS_KEY)
--aws-session-token string STS session token (or $AWS_SESSION_TOKEN). Optional
--aws-service string AWS service for SigV4 scope (default medical-imaging)
--oauth2-token-url string OAuth2 token endpoint URL (or $DCMCLIENT_OAUTH2_TOKEN_URL)
--oauth2-auth-url string OAuth2 authorization endpoint URL — loopback flow (or $DCMCLIENT_OAUTH2_AUTH_URL)
--oauth2-device-url string OAuth2 device authorization endpoint URL — device flow (or $DCMCLIENT_OAUTH2_DEVICE_URL)
--oauth2-client-id string OAuth2 client_id (or $DCMCLIENT_OAUTH2_CLIENT_ID)
--oauth2-client-secret string OAuth2 client_secret (or $DCMCLIENT_OAUTH2_CLIENT_SECRET)
--oauth2-scope string OAuth2 scope string (or $DCMCLIENT_OAUTH2_SCOPE)
--oauth2-refresh-token string Bootstrap refresh_token (or $DCMCLIENT_OAUTH2_REFRESH_TOKEN)
--oauth2-flow string Flow override: client_credentials | refresh | loopback | device (default: auto)
--oauth2-loopback-port uint Fixed 127.0.0.1 redirect port for the loopback flow (default 0 = OS-assigned)
--oauth2-no-cache bool Don't read or write the on-disk token cache
$ dcmclient wado --server http://localhost:8042 --study 1.2.3 -o out/
$ dcmclient wado --profile pacs --series 1.2.3.4 --concurrency 16 -o out/

wado-uri

WADO-URI single-object retrieve (PS3.18 §9; legacy PACS shim)

writes files · network · module dicomweb

Option Type Description
-s / --server string Server origin, e.g. http://localhost:8042 (or use --profile)
--base-path string WADO-URI endpoint path under the origin
--auth string Authorization header value (e.g. 'Bearer ey…' or 'Basic …')
--profile string Fill --server/--base-path/--auth from a saved dcmclient config profile
--study string, required StudyInstanceUID
--series string, required SeriesInstanceUID
--instance string, required SOPInstanceUID (objectUID)
--content-type string Requested representation: application/dicom (default) or an image MIME (image/jpeg, …)
--transfer-syntax string TransferSyntax UID to negotiate (optional)
--frame uint 1-based frame number for a multi-frame object (rendered)
--rows uint Rendered-image height in pixels (image content types)
--columns uint Rendered-image width in pixels (image content types)
--image-quality uint Rendered JPEG quality 1-100 (image content types)
--anonymize bool Ask the server to return a de-identified object
-o / --out string Output file (default: . in the current directory)
-v / --verbose bool Request URL to stderr
--aws-region string AWS region (or $AWS_REGION). Required to enable SigV4
--aws-access-key string AWS access key (or $AWS_ACCESS_KEY_ID)
--aws-secret-key string AWS secret key (or $AWS_SECRET_ACCESS_KEY)
--aws-session-token string STS session token (or $AWS_SESSION_TOKEN). Optional
--aws-service string AWS service for SigV4 scope (default medical-imaging)
--oauth2-token-url string OAuth2 token endpoint URL (or $DCMCLIENT_OAUTH2_TOKEN_URL)
--oauth2-auth-url string OAuth2 authorization endpoint URL — loopback flow (or $DCMCLIENT_OAUTH2_AUTH_URL)
--oauth2-device-url string OAuth2 device authorization endpoint URL — device flow (or $DCMCLIENT_OAUTH2_DEVICE_URL)
--oauth2-client-id string OAuth2 client_id (or $DCMCLIENT_OAUTH2_CLIENT_ID)
--oauth2-client-secret string OAuth2 client_secret (or $DCMCLIENT_OAUTH2_CLIENT_SECRET)
--oauth2-scope string OAuth2 scope string (or $DCMCLIENT_OAUTH2_SCOPE)
--oauth2-refresh-token string Bootstrap refresh_token (or $DCMCLIENT_OAUTH2_REFRESH_TOKEN)
--oauth2-flow string Flow override: client_credentials | refresh | loopback | device (default: auto)
--oauth2-loopback-port uint Fixed 127.0.0.1 redirect port for the loopback flow (default 0 = OS-assigned)
--oauth2-no-cache bool Don't read or write the on-disk token cache
$ dcmclient wado-uri -s http://localhost:8042 --base-path /wado --study 1.2.3 --series 1.2.3.4 --instance 1.2.3.4.5 -o out.dcm
$ dcmclient wado-uri --profile pacs --study 1.2.3 --series 1.2.3.4 --instance 1.2.3.4.5 --content-type image/jpeg --columns 512 -o preview.jpg

Inspect

dcm2content

Extract the semantic content of a structured DICOM object — Segmentation, RT Structure Set, RT Plan (photon + ion), RT Dose, Presentation State, Waveform, Ophthalmic Visual Field (static perimetry), Surface Segmentation (surface meshes), or Structured Report (the full content tree) — to JSON (auto-detected by SOP class, tagged by type). The interpreted counterpart to dcm2json's raw model

read-only · module dcmdata

Option Type Description
input string, required A structured DICOM object (Segmentation / RTSTRUCT / RTPLAN / RTDOSE / Presentation State / Waveform / Ophthalmic Visual Field / Surface Segmentation / Structured Report)
--contours bool RT Structure Set only: include each contour's full xyz point list (off by default — point clouds are bulky)
--control-points bool RT Plan only: include every control point (angles, meterset, leaf/jaw positions) instead of the first-control-point summary (off by default — IMRT/VMAT plans carry hundreds of control points)
--meshes bool Surface Segmentation only: include each surface's full points / normals / triangles arrays instead of just counts (off by default — meshes are bulky)
$ dcmclient dcm2content organ-seg.dcm
$ dcmclient dcm2content --contours plan-rtstruct.dcm
$ dcmclient dcm2content rtplan.dcm
$ dcmclient dcm2content --control-points vmat-rtplan.dcm
$ dcmclient dcm2content rtdose.dcm
$ dcmclient dcm2content ecg.dcm
$ dcmclient dcm2content --meshes surface-seg.dcm
$ dcmclient dcm2content report-sr.dcm

dcm2json

Convert a Part-10 DICOM file to DICOM JSON Model (PS3.18 §F)

read-only · module dcmdata

Option Type Description
files string[], required One or more Part-10 input files
-o / --output string Write JSON to this file instead of stdout (concatenated when multiple inputs)
--out-dir string With multiple inputs, write /.json per file. Wins over --output when both are set
--charset / --charset-assume (+Cd) string Override SpecificCharacterSet for transcoding (same wire form as (0008,0005): 'ISO_IR 100', 'GB18030', or VM=2 '\ISO 2022 IR 87'). Wins over the file's own (0008,0005)
-v / --verbose bool Per-file progress to stderr
$ dcmclient dcm2json scan.dcm
$ dcmclient dcm2json --output scan.json scan.dcm

dcm2xml

Convert a Part-10 DICOM file to Native DICOM Model XML (PS3.19)

read-only · module dcmdata

Option Type Description
files string[], required One or more Part-10 input files
-o / --output string Write XML to this file instead of stdout (concatenated when multiple inputs)
--out-dir string With multiple inputs, write /.xml per file. Wins over --output when both are set
--charset / --charset-assume string Override SpecificCharacterSet for transcoding (same wire form as (0008,0005): 'ISO_IR 100', 'GB18030', or VM=2 '\ISO 2022 IR 87' for ISO-2022 escapes). Wins over the file's own (0008,0005)
-v / --verbose bool Per-file progress to stderr
$ dcmclient dcm2xml scan.dcm
$ dcmclient dcm2xml --output scan.xml scan.dcm

dcmdump

Dump a Part-10 DICOM file as a one-element-per-line listing

read-only · module dcmdata

Option Type Description
files string[], required One or more file paths to dump
-L / --print-long-tag (+L) bool Do not truncate long values
-M / --max-read-length (+M) uint Truncate values longer than N bytes (default 64; ignored under -L)
--charset / --charset-assume (+Cd) string Override SpecificCharacterSet for transcoding; wins over (0008,0005), and kicks in when (0008,0005) is absent. Same wire form (0008,0005) carries: 'ISO_IR 100', 'GB18030', or VM=2 '\ISO 2022 IR 87' for ISO-2022 escapes
--no-utf8 bool Disable UTF-8 transcoding; dump raw element bytes (non-printable rendered as \xHH). We transcode by default, this opts out
--names bool Append the attribute keyword to each line, from the union public+private dictionary; private tags resolve by Private Creator
-v / --verbose bool Extra diagnostic lines on stderr
$ dcmclient dcmdump scan.dcm
$ dcmclient dcmdump --names --print-long-tag scan.dcm

dsr2html

Render a DICOM Structured Report to HTML

read-only · module dcmsr

Option Type Description
files string[], required One or more Part-10 SR input files
-o / --output string Write HTML to this file instead of stdout (documents concatenated when multiple inputs)
--out-dir string With multiple inputs, write /.html per file. Wins over --output when both are set
-v / --verbose bool Per-file progress to stderr
$ dcmclient dsr2html report.dcm
$ dcmclient dsr2html report.dcm -o report.html

dsrdump

Dump a DICOM Structured Report content tree as text

read-only · module dcmsr

Option Type Description
files string[], required One or more Part-10 SR input files
-o / --output string Write the dump to this file instead of stdout (concatenated when multiple inputs)
--out-dir string With multiple inputs, write /.txt per file. Wins over --output when both are set
-v / --verbose bool Per-file progress to stderr
$ dcmclient dsrdump report.dcm
$ dcmclient dsrdump report.dcm -o report.txt

Convert & author

dcm2fhir

Convert a DICOM instance or a whole study directory into one FHIR R4 ImagingStudy resource (JSON, multi-series/instance, contained Patient) — the imaging↔EHR gateway

writes files · module dcmehr

Option Type Description
input string, required DICOM file, or a directory of a study's instances (aggregated by series)
output string Write the ImagingStudy JSON here; omit to print to stdout
--no-recurse bool Directory input: scan the top level only (default: descend into subdirectories)
$ dcmclient dcm2fhir CT0001.dcm                      # ImagingStudy JSON to stdout
$ dcmclient dcm2fhir study_dir/ study.fhir.json      # whole study (all series/instances)
$ dcmclient dcm2fhir --no-recurse series_dir/ s.json

dcm2mha

Assemble a DICOM series into a single-file MetaImage (.mha) — 3-D or 4-D (--4d), double-faithful voxel→world geometry, optional zlib compression (--compress) — the ITK / nnU-Net / MONAI / Grand-Challenge on-ramp

writes files · module dcmvolume

Option Type Description
input string, required DICOM series directory (or a single file)
output string, required Write the MetaImage here (.mha)
--no-recurse bool Only scan the top-level directory (default: descend into subdirectories)
--4d bool General 4-D: discover the varying non-spatial axis (time / echo / cardiac phase / stack / energy) and write a [T,Z,Y,X] MetaImage — for dynamic / cine / multi-echo series
--compress bool Write CompressedData=True (zlib); default uncompressed
--json bool Emit the dims/spacing/affine/series sidecar on stdout
$ dcmclient dcm2mha ct_series_dir/ out.mha
$ dcmclient dcm2mha --compress ct_series_dir/ out.mha
$ dcmclient dcm2mha --json mr_dir/ vol.mha
$ dcmclient dcm2mha --no-recurse series/ out.mha
$ dcmclient dcm2mha --4d dce_series/ dynamic.mha   # [T,Z,Y,X] dynamic stack

dcm2nii

Assemble a DICOM series into a NIfTI-1 volume (.nii/.nii.gz) — 3-D or 4-D (--4d), gantry-tilt-corrected voxel→world affine, optional DWI .bval/.bvec and BIDS JSON sidecar (--bids) — the ML/neuro (FSL/ANTs/nibabel) on-ramp

writes files · module dcmvolume

Option Type Description
input string, required DICOM series directory (or a single file)
output string, required Write the NIfTI here; a .nii.gz extension gzip-compresses
--no-recurse bool Only scan the top-level directory (default: descend into subdirectories)
--dwi bool Diffusion mode: group by b-value+gradient into a 4-D stack and also write FSL .bval / .bvec (FSL DWI deliverable)
--4d bool General 4-D: discover the varying non-spatial axis (time / echo / cardiac phase / stack / energy) and write a [T,Z,Y,X] NIfTI — for dynamic / cine / multi-echo series (use --dwi for diffusion)
--gradient-order bool --dwi: order volumes by gradient (b0 first, deterministic) instead of the default acquisition order (InstanceNumber)
--bids bool Also write a BIDS .json metadata sidecar (timing/sequence/geometry) next to the NIfTI
--split bool Batch mode: when the input holds multiple series, write one NIfTI per SeriesInstanceUID into the output DIRECTORY (the dcm2niix folder workflow). Without it, the single dominant coherent series is assembled
-f / --filename string --split: per-series filename template (default "%s_%d"). Tokens: %i PatientID, %n PatientName, %s SeriesNumber, %d SeriesDescription, %p ProtocolName, %m Manufacturer, %q Modality, %t StudyDate, %u SeriesUID, %% literal %
--no-gzip bool --split: write .nii instead of the default .nii.gz
--json bool Emit the dims/spacing/affine/series sidecar on stdout
$ dcmclient dcm2nii ct_series_dir/ out.nii.gz
$ dcmclient dcm2nii --json mr_dir/ vol.nii
$ dcmclient dcm2nii --no-recurse series/ out.nii.gz
$ dcmclient dcm2nii --dwi dwi_series/ dwi.nii.gz   # + dwi.bval / dwi.bvec
$ dcmclient dcm2nii --4d dce_series/ dynamic.nii.gz   # [T,Z,Y,X] dynamic stack
$ dcmclient dcm2nii --bids mr_dir/ sub-01_T1w.nii.gz   # + sub-01_T1w.json
$ dcmclient dcm2nii --split study_dir/ out/   # one .nii.gz per series (dcm2niix batch)
$ dcmclient dcm2nii --split -f %i_%s_%d study/ out/   # custom per-series naming

dcm2nrrd

Assemble a DICOM series into an NRRD volume (.nrrd) — 3-D or 4-D (--4d), double-faithful voxel→world space directions, optional gzip encoding (--gzip) — the 3D Slicer on-ramp

writes files · module dcmvolume

Option Type Description
input string, required DICOM series directory (or a single file)
output string, required Write the NRRD here (.nrrd)
--no-recurse bool Only scan the top-level directory (default: descend into subdirectories)
--4d bool General 4-D: discover the varying non-spatial axis (time / echo / cardiac phase / stack / energy) and write a [T,Z,Y,X] NRRD — for dynamic / cine / multi-echo series
--gzip bool Encode the voxel data as encoding: gzip (NRRD encoding flag; default raw)
--json bool Emit the dims/spacing/affine/series sidecar on stdout
$ dcmclient dcm2nrrd ct_series_dir/ out.nrrd
$ dcmclient dcm2nrrd --gzip ct_series_dir/ out.nrrd
$ dcmclient dcm2nrrd --json mr_dir/ vol.nrrd
$ dcmclient dcm2nrrd --no-recurse series/ out.nrrd
$ dcmclient dcm2nrrd --4d dce_series/ dynamic.nrrd   # [T,Z,Y,X] dynamic stack

dcm2pdf

Extract the embedded document from an Encapsulated PDF/CDA/STL DICOM

writes files · module dcmdata

Option Type Description
input string, required Encapsulated PDF/CDA/STL DICOM file
output string, required Write the extracted document here
--json bool Emit one {tool,ok,exit_code,result} status object on stdout
$ dcmclient dcm2pdf report.dcm report.pdf

dcm2tiff

Extract an image from a DICOM Whole-Slide Image (WSI) — a pyramid-level region, a whole level, an associated label/overview/macro image, or a thumbnail — to TIFF/PNG/JPEG/BMP (the OpenSlide / bfconvert job)

writes files · module dcmwsi

Option Type Description
input string, required WSI DICOM file, or a directory of pyramid instances
output string Write the image here; extension picks the format (.tiff/.tif or .png). Omit with --info
--level int Pyramid level to read (0 = full resolution; see --info for the count)
--region string Crop 'x,y,w,h' — (x,y) in level-0 reference coords, (w,h) in the chosen level's coords (OpenSlide semantics). Default: the whole level
--associated string Extract a named associated image (label / overview / macro / …) instead of pyramid pixels
--thumbnail bool Extract the smallest pyramid level as an overview (no resampling; overrides --level/--region)
--icc bool Force/assert ICC → sRGB (errors if the source has no profile or the build lacks LCMS2). By default a present profile is auto-applied to sRGB
--raw bool Write the stored scanner colour verbatim — skip the default ICC→sRGB conversion (OpenSlide semantics)
--quality int JPEG quality 1..100 (default 90; ignored for tiff/png/bmp)
--info bool Print the pyramid + associated-image inventory (no tile decode); pair with --json
--no-recurse bool Only scan the top-level directory of a pyramid directory
--json bool Emit the dims/format/source sidecar on stdout
$ dcmclient dcm2tiff slide.dcm region.tiff --level 0 --region 10000,8000,1024,1024
$ dcmclient dcm2tiff slide_dir/ overview.png --thumbnail
$ dcmclient dcm2tiff slide.dcm label.png --associated label   # the PHI-bearing label
$ dcmclient dcm2tiff slide_dir/ thumb.jpg --thumbnail --quality 85  # lossy JPEG
$ dcmclient dcm2tiff slide.dcm level2.tiff --level 2          # whole downsampled level
$ dcmclient dcm2tiff --info --json slide.dcm                  # pyramid + associated inventory

dcmconv

Convert a Part-10 DICOM file to a different Transfer Syntax

writes files · module dcmdata

Option Type Description
input string, required Input Part-10 file
output string, required Output Part-10 file
--to / --write-xfer string Target Transfer Syntax: a UID (1.2.840.10008.1.2.4.90 …) or alias. Encode: j2k / j2k-lossy / jls / jls-lossy / htj2k / htj2k-lossy / jxl / jxl-lossy / jpeg (= jpeg-baseline) / jpeg-extended / jpeg-lossless / jpeg-lossless-sv1 / rle. Uncompressed: ivr-le / evr-le (source must be uncompressed VR-LE). Deflated: deflated (source must be uncompressed VR-LE). Optional only when --convert-to-utf8 is set.
--convert-to-utf8 (+U8) bool Reencode every PN / LO / SH / LT / ST / UT / UC value from the source (0008,0005) to UTF-8; (0008,0005) becomes 'ISO_IR 192'. Source must be uncompressed VR-LE. Combinable with --to — UTF-8 reencode runs first, then transcode.
--json bool Emit one {tool,ok,exit_code,result} status object on stdout (result = {input,output,source_ts,target_ts,bytes})
-v / --verbose bool Per-file source-TS / output-size progress to stderr
$ dcmclient dcmconv --to j2k input.dcm output.dcm
$ dcmclient dcmconv --convert-to-utf8 input.dcm output.dcm

dcmdecap

Extract the payload of an Encapsulated Document instance (PDF / CDA / STL / OBJ / MTL) — one tool for every payload type

writes files · module dcmdata

Option Type Description
input string, required Encapsulated Document DICOM instance
output string, required Write the payload here
--json bool Emit one {tool,ok,exit_code,result} status object on stdout
$ dcmclient dcmdecap report.dcm report.pdf
$ dcmclient dcmdecap implant.dcm implant.stl
$ dcmclient dcmdecap --json doc.dcm payload.bin

dcmencap

Wrap a document (PDF / CDA / STL / OBJ / MTL) into its Encapsulated Document Storage DICOM instance — one tool for every payload type

writes files · module dcmdata

Option Type Description
input string, required Document to encapsulate (pdf / xml|cda / stl / obj / mtl)
output string, required Write the DICOM instance here
--type string Document type: auto (default; file extension then content magic), pdf, cda, stl, obj, mtl
--title string DocumentTitle (0042,0010); defaults to the input file stem
--mime string Override MIMETypeOfEncapsulatedDocument (0042,0012)
--units string 3D model types only: UCUM Measurement Units code value (default um)
--series-from string Reference DICOM — inherit patient + study (the document joins that study)
--patient-name string PatientName (0010,0010) — overrides the reference / sets it when none
--patient-id string PatientID (0010,0020)
--json bool Emit one {tool,ok,exit_code,result} status object on stdout
$ dcmclient dcmencap report.pdf report.dcm
$ dcmclient dcmencap implant.stl implant.dcm --series-from ct.dcm
$ dcmclient dcmencap summary.xml out.dcm --type cda
$ dcmclient dcmencap mesh.obj out.dcm --title "Resection guide"

dcmmkdir

Build a DICOMDIR-indexed file-set (PS3.10 Basic Directory) from a set of DICOM files; lays the instances out under the output directory with media-ready (ISO-9660) File IDs

writes files · module dcmdata

Option Type Description
inputs string[], required Part-10 DICOM files and/or directories (directories are scanned recursively)
--output string, required Output media directory — each input is COPIED here under a flat File ID (IMG00001…) and the DICOMDIR is written alongside (a self-contained file-set; ~2x the source size)
--fileset-id string File-set ID (0004,1130), <=16 chars (default DCMCLIENT)
--json bool Emit one {tool,ok,exit_code,result} status object on stdout
$ dcmclient dcmmkdir study/ --output /media/dicom
$ dcmclient dcmmkdir a.dcm b.dcm c.dcm --output out
$ dcmclient dcmmkdir series/ --output disc --fileset-id MYSTUDY

dcmresample

Resample a DICOM series onto a new voxel grid — target mm spacing (isotropic) or exact voxel count — and write a NIfTI-1 with the updated voxel→world affine (the c3d / ANTs ResampleImage / MONAI Spacing job)

writes files · module dcmvolume

Option Type Description
input string, required DICOM series directory (or a single file)
output string, required Write the resampled NIfTI here; a .nii.gz extension gzip-compresses
--spacing string Target voxel spacing in mm as 'sx,sy,sz' (col,row,slice), or one value for isotropic (e.g. --spacing 1). Mutually exclusive with --size
--size string Target voxel count as 'W,H,D' (cols,rows,slices) over the same field of view. Mutually exclusive with --spacing
--interp string Interpolation: linear (default) | cubic | nearest
--label bool Treat the input as a segmentation/label mask: force nearest-neighbour so no class values are blended
--no-recurse bool Only scan the top-level directory (default: descend into subdirectories)
--json bool Emit the dims/affine/series sidecar on stdout
$ dcmclient dcmresample ct_series_dir/ iso.nii.gz --spacing 1        # 1mm isotropic
$ dcmclient dcmresample mr_dir/ out.nii.gz --spacing 0.5,0.5,3
$ dcmclient dcmresample ct_dir/ small.nii --size 256,256,128 --interp cubic
$ dcmclient dcmresample seg_dir/ mask.nii.gz --spacing 1 --label     # nearest, no blending
$ dcmclient dcmresample --json mr_dir/ iso.nii.gz --spacing 1

dsr2xml

Render a DICOM Structured Report's content tree as XML

writes files · module dcmsr

Option Type Description
input string, required Structured Report DICOM file
output string, required Write the SR-tree XML here
--json bool Emit one {tool,ok,exit_code,result} status object on stdout
$ dcmclient dsr2xml report.dcm report.xml

dump2dcm

Rebuild a Part-10 DICOM file from a dcmdump text listing

writes files · module dcmdata

Option Type Description
input string, required dcmdump text listing ("-" reads stdin)
output string, required Write the rebuilt Part-10 DICOM here
--json bool Emit one {tool,ok,exit_code,result} status object on stdout
$ dcmclient dump2dcm edited.txt out.dcm
$ dcmclient dcmdump in.dcm | dcmclient dump2dcm - out.dcm

img2dcm

Import a JPEG into a Secondary Capture DICOM, codestream stored verbatim

writes files · module dcmdata

Option Type Description
input string, required JPEG image (baseline or extended)
output string, required Write the DICOM instance here
--series-from string Reference DICOM — inherit patient + study (the image joins that study)
--patient-name string PatientName (0010,0010) — overrides the reference / sets it when none
--patient-id string PatientID (0010,0020)
--json bool Emit one {tool,ok,exit_code,result} status object on stdout
$ dcmclient img2dcm photo.jpg out.dcm
$ dcmclient img2dcm scan.jpg out.dcm --series-from study.dcm

json2dcm

Convert a DICOM JSON Model object (PS3.18 §F) to a Part-10 DICOM file

writes files · module dcmdata

Option Type Description
input string, required Input DICOM JSON Model file (the inverse of dcm2json)
output string, required Output Part-10 file (Implicit VR LE)
--json bool Emit one {tool,ok,exit_code,result} status object on stdout (result = {input,output,bytes})
-v / --verbose bool Print the output path / size to stderr
$ dcmclient json2dcm scan.json scan.dcm
$ dcmclient json2dcm --json scan.json scan.dcm

mkkos

Author a Key Object Selection (KOS) document from JSON instance references

writes files · module dcmsr

Option Type Description
input string, required JSON references ("-" reads stdin)
output string, required Write the KOS DICOM here
--series-from string Reference DICOM — inherit patient + study (the KOS is filed under that study)
--json bool Emit one {tool,ok,exit_code,result} status object on stdout
$ dcmclient mkkos keyimages.json kos.dcm --series-from study.dcm
$ echo '{"references":[...]}' | dcmclient mkkos - kos.dcm

mkreport

Author a Structured Report (TID 1500 Measurement Report) from JSON measurements

writes files · module dcmsr

Option Type Description
input string, required JSON measurements ("-" reads stdin)
output string, required Write the SR DICOM here
--series-from string Reference DICOM — inherit patient + study (the report attaches to that study)
--json bool Emit one {tool,ok,exit_code,result} status object on stdout
$ dcmclient mkreport findings.json report.dcm --series-from study.dcm
$ echo '{"measurements":[...]}' | dcmclient mkreport - report.dcm

pdf2dcm

Wrap a PDF into an Encapsulated PDF Storage DICOM instance

writes files · module dcmdata

Option Type Description
input string, required PDF file to encapsulate
output string, required Write the DICOM instance here
--series-from string Reference DICOM — inherit patient + study (the report joins that study)
--title string DocumentTitle (0042,0010); defaults to the PDF file stem
--patient-name string PatientName (0010,0010) — overrides the reference / sets it when none
--patient-id string PatientID (0010,0020)
--json bool Emit one {tool,ok,exit_code,result} status object on stdout
$ dcmclient pdf2dcm report.pdf report.dcm
$ dcmclient pdf2dcm report.pdf out.dcm --series-from study.dcm

seg2nii

Rasterize a DICOM Segmentation (SEG) to a labelmap NIfTI (voxel = Segment Number) — the read counterpart of mkseg

writes files · module dcmseg

Option Type Description
input string, required DICOM Segmentation (SEG) file
output string, required Write the NIfTI here; a .nii.gz extension gzip-compresses
--masks bool Write a lossless per-segment 4-D float volume [segment, z, y, x] in [0,1] instead of the combined labelmap (use when segments overlap)
--json bool Emit the dims/affine/segments sidecar on stdout
$ dcmclient seg2nii seg.dcm labels.nii.gz
$ dcmclient seg2nii --json seg.dcm labels.nii.gz
$ dcmclient seg2nii --masks seg.dcm masks.nii.gz   # lossless per-segment 4-D float

seg2nrrd

Rasterize a DICOM Segmentation (SEG) to a 3D Slicer Segmentation NRRD (.seg.nrrd) — named, colored segments + double-faithful LPS geometry — the Slicer counterpart of seg2nii

writes files · module dcmseg

Option Type Description
input string, required DICOM Segmentation (SEG) file
output string, required Write the Slicer .seg.nrrd here
--gzip bool Compress the labelmap (NRRD encoding: gzip)
--json bool Emit the dims/affine/segment_list sidecar on stdout
$ dcmclient seg2nrrd seg.dcm labels.seg.nrrd
$ dcmclient seg2nrrd --gzip seg.dcm labels.seg.nrrd
$ dcmclient seg2nrrd --json seg.dcm labels.seg.nrrd

tiff2dcm

Convert a pyramidal/tiled TIFF into a DICOM VL Whole Slide Microscopy Image pyramid (one instance per level) — the digital-pathology ingestion / pixelmed TIFFToDicom job

writes files · module dcmwsi

Option Type Description
input string, required Pyramidal / tiled TIFF (generic RGB; vendor SVS/NDPI is out of scope)
output string, required Output directory for the per-level DICOM instances (created if needed)
--ts string Encapsulated transfer syntax UID (default 1.2.840.10008.1.2.4.50 = JPEG baseline; pass a lossless UID like .4.80 / .4.90 for bit-exact)
--quality int JPEG / J2K quality 1..100 (default 80; ignored by lossless codecs)
--mpp string Microns per pixel at the base level → Pixel Spacing (default 0.25)
--patient-id string Patient ID (0010,0020)
--patient-name string Patient Name (0010,0010)
--study-uid string Reuse an existing Study Instance UID (default: mint one)
--container-id string Specimen Container Identifier (0040,0512)
--specimen-id string Specimen Identifier (0040,0551)
--json bool Emit the {output, levels, files} sidecar on stdout
$ dcmclient tiff2dcm slide.tif out_dir/
$ dcmclient tiff2dcm slide.tif out_dir/ --ts 1.2.840.10008.1.2.4.50 --quality 85 --mpp 0.25
$ dcmclient tiff2dcm --json slide.tif out_dir/ --patient-id 42 --container-id C1 --specimen-id S1

xml2dcm

Convert a Native DICOM Model document (PS3.19) to a Part-10 DICOM file

writes files · module dcmdata

Option Type Description
input string, required Input Native DICOM Model XML file (the inverse of dcm2xml)
output string, required Output Part-10 file (Implicit VR LE)
--json bool Emit one {tool,ok,exit_code,result} status object on stdout (result = {input,output,bytes})
-v / --verbose bool Print the output path / size to stderr
$ dcmclient xml2dcm scan.xml scan.dcm
$ dcmclient xml2dcm --json scan.xml scan.dcm

xml2dsr

Rebuild a Structured Report from dsr2xml content-tree XML

writes files · module dcmsr

Option Type Description
input string, required dsr2xml content-tree XML ("-" reads stdin)
output string, required Write the rebuilt SR DICOM here
--series-from string Reference DICOM — inherit patient + study (the SR header the XML omits)
--json bool Emit one {tool,ok,exit_code,result} status object on stdout
$ dcmclient dsr2xml report.dcm t.xml && dcmclient xml2dsr t.xml out.dcm
$ dcmclient xml2dsr edited.xml out.dcm --series-from study.dcm

Extract, render & measure

dcm2img

Render a DICOM frame to an image file (PNM/PNG/JPEG/BMP display; PNM16/TIFF/PNG16/JPEG12/JPEG16/JP2/JPH/JLS/JXL full-depth), with optional GSDF (PS3.14) display calibration and embedded-video → stills / animation

writes files · module dcmimage

Option Type Description
input string, required Input Part-10 DICOM file
output string Output image file (omit when using --data-uri)
--data-uri bool Emit the rendered image as a data:;base64 string on stdout instead of writing a file — over MCP this becomes an image content block a vision model can see (format defaults to png)
--format string Display 8-bit (windowed): pnm/pgm/ppm | png | jpeg | bmp. Full native depth (8/12/16-bit lossless): pnm16 | tiff | png16 | jpeg12 | jpeg16 | jp2/j2k | jph | jls/jpls | jxl. Multi-frame animation/video: webp | gif (lossless 8-bit) | mp4/mov (h264, lossy 8-bit, full-res) | mkv (FFV1, LOSSLESS, native 8/16-bit — the only video that keeps full depth). Video-transfer-syntax input (MPEG-2/H.264/HEVC) decodes here too: stills/animation in 8-bit, full-depth formats in 16-bit (no precision loss, incl. 10-bit HEVC); dcm2mpg for a lossless copy. Empty ⇒ infer from the output extension
--frame uint 1-based frame index (default 1)
--window string Explicit window 'center,width' for the 8-bit display formats AND the animation/video (mp4/webp/gif — the cine equivalent of choosing one window for all frames); default is the file's VOI (per-frame → dataset → auto from min/max). Ignored for mkv (lossless keeps native)
--quality int JPEG quality 1..100 (display jpeg only; default 90)
--scale uint Cap the largest output dimension (nearest-neighbour, aspect preserved; 0 = native; downscale only). Display + animation/video; not mkv (lossless keeps native resolution)
--apply-gsps string Burn a Grayscale Softcopy Presentation State's graphic annotations (point/polyline/circle/ellipse, in their layer colour) into the rendered display image — so an agent sees the markup. Grayscale is promoted to RGB. Coordinates align to NATIVE pixels; avoid combining with --scale
--apply-sr string Burn a Structured Report's SCOORD measurement regions (point/multipoint/polyline/circle/ellipse, in green) into the rendered display image — so an agent sees where each measurement was taken. Only SCOORDs whose IMAGE reference matches this image are drawn. Grayscale is promoted to RGB. Coordinates align to NATIVE pixels; avoid combining with --scale
--apply-rtstruct string Burn an RT Structure Set's ROI contours (projected from 3D patient coordinates onto this image's plane, in each ROI's display colour) into the rendered display image — so an agent sees the delineated structures. Only contours referencing this image (or coplanar with it) are drawn. Grayscale is promoted to RGB. Coordinates align to NATIVE pixels; avoid --scale
--apply-seg string Tint a DICOM Segmentation's mask (each segment in its Recommended Display colour, 40% alpha) onto the rendered display image — so an agent sees the segmentation over the anatomy. The SEG slice matching this image's position is drawn; the SEG must share this image's pixel grid. Grayscale is promoted to RGB. Aligns to NATIVE pixels; avoid combining with --scale
--fps string Animation frame rate for webp/gif (0 = default 10 fps)
--gsdf bool Apply DICOM PS3.14 GSDF (Grayscale Standard Display Function) display calibration — remaps the windowed value so equal steps are equal perceived-contrast (JND) steps. Grayscale only; opt-in (best-effort device-reported luminance, not photometer-certified). The non-linear remap is done in the float domain before 8-bit quantisation — a deterministic, reproducible LUT
--gsdf-lmin string GSDF display black level in cd/m² (default 0.5)
--gsdf-lmax string GSDF display white level in cd/m² (default 350)
--gsdf-gamma string GSDF panel native EOTF gamma (default 2.2 ≈ sRGB)
--json bool Emit one {tool,ok,exit_code,result} status object on stdout (result = {input,output,format,frame,width,height,bytes})
-v / --verbose bool Per-file progress to stderr
$ dcmclient dcm2img scan.dcm out.png
$ dcmclient dcm2img scan.dcm out.jpeg --frame 3 --window 40,400

dcm2mpg

Export the embedded video from a DICOM (MPEG-2/H.264/HEVC transfer syntax) by stream copy — no re-encode, bit-exact

writes files · module dcmimage

Option Type Description
input string, required Input Part-10 DICOM (video transfer syntax)
output string, required Output video file (.mp4)
--raw bool Write the raw elementary stream verbatim (no MP4 container) — the purest, most faithful dump (e.g. .m2v / .h264 / .h265)
--json bool Emit one {tool,ok,exit_code,result} status object on stdout (result = {input,output,codec,container,bytes})
-v / --verbose bool Progress to stderr
$ dcmclient dcm2mpg clip.dcm clip.mp4
$ dcmclient dcm2mpg clip.dcm clip.h265 --raw

dcm2raw

Decode DICOM pixels (any transfer syntax) to raw native integers (or HU/rescaled float) + a numpy shape/dtype + geometry sidecar

writes files · module dcmimage

Option Type Description
input string, required DICOM image file (any transfer syntax)
output string, required Write the raw native pixel bytes here
--frame int Extract just frame N (1-based); default 0 = all frames concatenated
--rescale bool Emit the modality-LUT output — real-world values (HU for CT) as float32 — instead of stored integers (per-frame rescale applied for Enhanced multi-frame)
--json bool Emit the shape/dtype + geometry sidecar (rows/columns/frames/dtype/numpy_shape + rescale/spacing/orientation/position/uids) on stdout
$ dcmclient dcm2raw --json scan.dcm pixels.raw
$ dcmclient dcm2raw --frame 1 ct-multiframe.dcm slice1.raw
$ dcmclient dcm2raw --rescale --json ct.dcm hu.raw

dcmicmp

Compare two DICOM images and report pixel-difference metrics (max |Δ|, mean |Δ|, RMSE, PSNR) over the NATIVE stored pixels. The QA gate for a lossy transcode: --min-psnr fails (exit 2) when the round-trip degraded below the given PSNR in dB

read-only · module dcmimage

Option Type Description
reference string, required Reference (original) Part-10 image
test string, required Test image to compare against the reference
--frame uint 1-based frame index (default 1)
--min-psnr string Fail with exit code 2 if PSNR is below this many dB (0 = report only)
--json bool Emit one {tool,ok,exit_code,result} status object on stdout
$ dcmclient dcmicmp original.dcm compressed.dcm
$ dcmclient dcmicmp orig.dcm lossy.dcm --min-psnr 50 --json
$ dcmclient dcmicmp a.dcm b.dcm --frame 3

Edit

dcmodify

Insert / modify / erase DICOM attributes in place

writes files · module dcmdata

Option Type Description
files string[], required One or more Part-10 input files (edited in place unless --output)
-i / --insert (-i) string[] Insert or overwrite: 'tag=value' (e.g. '(0010,0010)=Doe^Jane'). Repeatable. New top-level tags need a dictionary VR (v0: overwrite of existing tags only)
-m / --modify (-m) string[] Modify only if present: 'tag=value'. Repeatable
-e / --erase (-e) string[] Erase a tag: 'tag' (e.g. '0010,0010'). Repeatable
-o / --output string Write the edited file here (single input only) instead of editing in place
--regenerate-uids bool Produce a NEW COPY with fresh, consistently-remapped UIDs (Study/Series/SOP + recursive cross-references) and the same -i/-m/-e edits — the local equivalent of the server's POST /modify. Source is preserved, so requires -o (single) or --out-dir (batch)
--out-dir string With --regenerate-uids: write copies into this directory (batch; one session → consistent UIDs). Never edits in place
--uid-root string With --regenerate-uids: OID root for remapped UIDs (default '2.25')
-v / --verbose bool Per-file progress to stderr
--json bool Emit one {tool,ok,exit_code,result} status object on stdout (result = {modified,total,ops})
$ dcmclient dcmodify --modify '(0010,0010)=Doe^Jane' scan.dcm
$ dcmclient dcmodify --erase '0010,0010' --output anon.dcm scan.dcm
$ dcmclient dcmodify --regenerate-uids -m '(0010,0010)=Doe^Jane' -o copy.dcm scan.dcm

dsign

Sign or verify a DICOM file's digital signatures (PS3.15): embed an X.509-certified MAC, or check each signature against its embedded cert

writes files · module dcmdata

Option Type Description
input string, required DICOM file to sign (or verify)
output string Write the signed DICOM here (sign mode; omit when --verify)
--verify bool Verify every signature in the file (uses the embedded signer certificates; no --key/--cert/output needed)
--key string PEM private key to sign with (sign mode)
--cert string PEM X.509 certificate to embed as the signer (sign mode)
--mac string MAC algorithm (0400,0015), default SHA256
--json bool Emit one {tool,ok,exit_code,result} status object on stdout
$ dcmclient dsign in.dcm signed.dcm --key key.pem --cert cert.pem
$ dcmclient dsign in.dcm signed.dcm --key key.pem --cert cert.pem --mac SHA512
$ dcmclient dsign --verify signed.dcm
$ dcmclient dsign --verify signed.dcm --json

De-identify

dcmdeident

De-identify DICOM — PS3.15 Annex E Basic Profile with the full retain / clean option set (retain dates, device, institution, longitudinal, UIDs, safe-private; clean descriptors, graphics, structured content, burned-in pixels; date shift) and CID 7050 de-identification-method stamps

writes files · module dcmdata

Option Type Description
files string[], required One or more Part-10 input files to de-identify
-o / --output string Write the de-identified file here (single input only)
--out-dir string Write de-identified copies into this directory (batch; one session → consistent UIDs). Never edits in place
--patient-name string Replacement Patient Name (default 'Anonymous')
--patient-id string Replacement Patient ID (default 'ANON0001')
--uid-root string OID root for remapped UIDs (default '2.25', the UUID-derived arc)
--retain-dates bool Retain Longitudinal Full Dates option (keep study/series dates+times)
--retain-private bool Keep private tags (default: all private attributes removed)
--clean-descriptors bool Clean Descriptors option (v0: empties free-text descriptors; not full content-aware cleaning)
--retain-uids bool Retain UIDs option (keep SOP/Study/Series and other K-column UIDs unmapped)
--retain-device-id bool Retain Device Identity option (keep device serial numbers, station names, ...)
--retain-institution-id bool Retain Institution Identity option (keep institution name/address/department)
--retain-patient-chars bool Retain Patient Characteristics option (keep age/sex/size/weight; clean-column cells emptied)
--shift-dates int Retain Modified Dates option: shift every date by this many days (consistent across the batch); ignored with --retain-dates
--clean-graphics bool Clean Graphics option (v0: empties graphic annotations)
--clean-struct-content bool Clean Structured Content option (v0: empties SR content-column attributes)
--clean-pixel bool Clean Pixel Data option (113101): black out burned-in annotation regions using the RSNA CTP device signature library. Re-emits uncompressed (never re-compresses); non-image instances pass through
--replace string[] Override a dummy (D) value: 'tag=value' or 'Keyword=value'. Repeatable
--remove string[] Erase an extra tag beyond the profile: 'tag' or 'Keyword'. Applied in both profiles. Repeatable
--keep-phi bool Modify mode (profile::none): keep all clinical attributes, still remap UIDs consistently and apply --replace/--remove, but emit no (0012,006x) de-identification stamps. Not a de-identification
-v / --verbose bool Per-file progress to stderr
--json bool Emit one {tool,ok,exit_code,result} status object on stdout (result = {deidentified,total})
$ dcmclient dcmdeident --output anon.dcm scan.dcm
$ dcmclient dcmdeident --out-dir anon/ --retain-dates study/*.dcm

Validate

dcmprobe

Test whether each input file is a valid Part-10 DICOM

read-only · module dcmdata

Option Type Description
files string[], required One or more file paths to check
--json bool Emit one {tool,ok,exit_code,result} status object on stdout (result.files[] = per-file {path,valid,...}) instead of yes:/no: lines
-v / --verbose bool On a yes line, also print SOP class / instance UID and transfer syntax
$ dcmclient dcmprobe scan.dcm
$ dcmclient dcmprobe --json --verbose study/*.dcm

dcmvalidate

Validate DICOM conformance — VR / value / dictionary, IOD mandatory modules (Type 1/2) + RT cross-reference integrity, and SR content-tree + TID template conformance

read-only · module dcmdata

Option Type Description
files string[], required One or more Part-10 input files to validate
--json bool Emit a structured findings document per file (agent-consumable) instead of human text
--errors-only bool Print only error-severity findings (suppress warnings / info)
--quiet bool Drop the per-file header / summary lines; print findings only
$ dcmclient dcmvalidate scan.dcm
$ dcmclient dcmvalidate --json --errors-only study/*.dcm

Author

mkparamap

Author a DICOM Parametric Map (float pixels + Real World Value Mapping) from a float volume + a reference series

writes files · module dcmpmap

Option Type Description
ref string, required Reference series (directory) or a single image — geometry + demographics
--values string, required Raw float32 volume: colsrowsnslices, slices ordered by ascending position
--meta string JSON Real World Value Mapping: slope / intercept / units / quantity / label / explanation (defaults to slope 1, intercept 0, unitless)
-o / --output string, required Output Parametric Map file
--int int Integer pixel storage: 8 or 16 bits (values quantized through the RWVM); default 0 = 32-bit float pixels
--signed bool Integer mode: signed pixel representation
$ dcmclient mkparamap series/ --values adc.f32 --meta adc.json -o adc_map.dcm
$ dcmclient mkparamap ref.dcm --values t2.f32 --int 16 -o t2_map.dcm

mkseg

Author a DICOM Segmentation from a labelmap + a segment-terminology JSON (coded category / type / anatomy), geometry & demographics taken from the reference image

writes files · module dcmseg

Option Type Description
input string, required Reference image: a single instance, OR a directory of the source series' single-frame instances (geometry + demographics + source refs)
--mask string Co-framed labelmap DICOM (pixel value k = the segment with labelID k; single-frame)
--mask-raw string OR a raw uint16 labelmap (rowscols[slices], row-major; for a series the slices are ordered by ascending position to match)
--mask-nii string OR a NIfTI-1 label volume (.nii/.nii.gz) co-framed with the reference series — the NIfTI/FSL → DICOM-SEG return path (Z auto-flipped to match; labels map via labelID)
--meta string, required segment-terminology JSON — per-segment label + coded category/type/anatomy
-o / --output string, required Write the Segmentation here
--fractional string Author a FRACTIONAL segmentation (probability/occupancy) instead of binary; --mask-raw is then uint8 [nsegnslicesrows*cols], segment-major
--max-fractional int Maximum Fractional Value (fractional only)
$ dcmclient mkseg ct.dcm --mask labelmap.dcm --meta seg.json -o out-seg.dcm
$ dcmclient mkseg ct.dcm --mask-raw labelmap.u16 --meta seg.json -o out-seg.dcm
$ dcmclient mkseg ct-series-dir/ --mask-raw volume.u16 --meta seg.json -o out-seg.dcm
$ dcmclient mkseg ct-series-dir/ --mask-nii seg.nii.gz --meta seg.json -o out-seg.dcm

mksr

Author an arbitrary DICOM Structured Report (Comprehensive SR) from a JSON content tree — any value type (TEXT/CODE/NUM/CONTAINER/IMAGE/SCOORD…) and relationship. The general SR writer (mkreport is the TID 1500 preset)

writes files · module dcmsr

Option Type Description
input string, required JSON content-tree document (patient/study/series + title + nested content[])
-o / --output string, required Write the Structured Report here
$ dcmclient mksr report.json -o report-sr.dcm

mktract

Author a DICOM Tractography Results Storage (66.6) from track sets of polylines (Frame-of-Reference world coordinates)

writes files · module dcmtract

Option Type Description
tracks string, required JSON document: {"track_sets":[{label, anatomy, algorithm_name, diffusion, line_thickness, rgb:[r,g,b], tracks:[[[x,y,z],...],...], and optional measurements / track_statistics / set_statistics (FA/ADC etc.)}]} in world mm
--ref string Reference series (directory) or a single image — demographics + Frame of Reference UID (omit to mint fresh identifiers)
-o / --output string, required Output Tractography Results file
$ dcmclient mktract tracks.json -o tracts.dcm
$ dcmclient mktract tracks.json --ref dwi/ -o tracts.dcm

Compute

dcmradiomics

Extract the IBSI radiomic feature set — 10 classes (first-order, GLCM, GLRLM, GLSZM, GLDM, GLDZM, NGTDM, shape, intensity-volume histogram, local intensity) — from an image over an ROI (intensity threshold or co-framed mask) to JSON

read-only · module dcmimage

Option Type Description
input string, required Grayscale image (CT / MR, any transfer syntax)
--mask string Co-framed mask DICOM (non-zero = inside the ROI; same dimensions + frame count)
--roi-min string Threshold-ROI lower bound in real-world values (e.g. HU); pair with --roi-max
--roi-max string Threshold-ROI upper bound; a voxel is inside when roi-min <= value <= roi-max
--bins int Texture quantization bins (typ. 32 or 64)
--range-min string Quantization range lower bound (default CT HU)
--range-max string Quantization range upper bound (default CT HU)
--bin-width string Fixed-bin-width discretization (e.g. 25); overrides --bins
--resample string Resample the ROI to isotropic voxels of this size in mm (trilinear image / nearest mask)
--normalize bool Z-score normalize intensities before discretization
--normalize-scale string Post-normalization scale
--log-sigma string Laplacian-of-Gaussian sigma in mm; repeat for several (adds log-sigma--mm-3D features)
--wavelet bool Add coif1 stationary-wavelet features (8 sub-bands, wavelet--prefixed)
--merged bool GLCM/GLRLM direction-merged (IBSI) instead of per-angle averaged
--voxel-array-shift string First-order Energy/TotalEnergy/RMS use (value + shift)
--filter string[] Intensity filter (repeatable): square / squareroot / logarithm / exponential / gradient
$ dcmclient dcmradiomics ct.dcm --roi-min 0 --roi-max 200
$ dcmclient dcmradiomics ct.dcm --mask liver-seg.dcm
$ dcmclient dcmradiomics ct.dcm --mask roi.dcm --bins 64

Extract

dcm2waveform

Extract a DICOM Waveform's samples — physical-unit CSV (ECG / EEG / hemodynamic) or 16-bit PCM WAV (audio) + a channel/frequency sidecar

writes files · module dcmwaveform

Option Type Description
input string, required DICOM Waveform file (ECG / EEG / hemodynamic / audio …)
output string, required Write the CSV (or WAV with --wav) here
--group int Multiplex group index to extract (0-based); default 0
--raw bool Emit the stored integer samples instead of physical-unit values (skip the Channel Sensitivity / baseline correction)
--wav bool Decode the group to 16-bit PCM WAV (Audio SOP classes) instead of CSV
--json bool Emit the channel / frequency / annotation sidecar on stdout
$ dcmclient dcm2waveform ecg.dcm ecg.csv
$ dcmclient dcm2waveform --raw --json ecg.dcm ecg.csv
$ dcmclient dcm2waveform --wav voice.dcm voice.wav

Measure

dcmdvh

Compute a Dose-Volume Histogram (cumulative + differential, dose statistics) per ROI from an RT Structure Set + RT Dose

writes files · module dcmrt

Option Type Description
rtstruct string, required RT Structure Set DICOM file
rtdose string, required RT Dose DICOM file
output string Write the {rois:[…]} DVH JSON here; omit to print to stdout
--roi string ROI number, or a comma list like 1,3,7 (mutually exclusive with --all)
--all bool Compute the DVH for every ROI in the structure set
--summary bool Emit dose statistics only — omit the per-bin cumulative/differential curve arrays
--limit int Cap the histogram at this many cGy (0 = no cap)
--no-full-volume bool Exclude structure planes that fall outside the dose grid from the volume
--thickness string Override the structure plane thickness in mm (0 = auto from plane spacing)
$ dcmclient dcmdvh rtstruct.dcm rtdose.dcm --roi 1
$ dcmclient dcmdvh rtstruct.dcm rtdose.dcm --all dvh.json
$ dcmclient dcmdvh rtstruct.dcm rtdose.dcm --roi 1,3,7 --summary
$ dcmclient dcmdvh ss.dcm dose.dcm --all --summary   # dose stats only, no curves

Meta commands

Utility subcommands outside the tool registry — not exposed over manifest / mcp.

config

Manage the saved server registry (~/.config/dcmclient/servers.json) — the --profile source every network tool reads.

Subcommand Description
list Show every saved profile
add Add or update a profile
show Show one profile
remove Delete a profile

manifest

Emit JSON tool descriptions incl. JSON-Schema inputSchema (agent / MCP discovery). Pass a tool name (manifest echoscu) to limit output to one tool; the default is a JSON array of every tool.

mcp

Serve every tool as an MCP server over stdio (JSON-RPC: tools/list + tools/call). -v / --verbose logs server activity to stderr.