DicomKit.Cli 1.0.0

dotnet tool install --global DicomKit.Cli --version 1.0.0
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local DicomKit.Cli --version 1.0.0
                    
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=DicomKit.Cli&version=1.0.0
                    
nuke :add-package DicomKit.Cli --version 1.0.0
                    

dicomkit

Free command-line tool built on the DicomKit DICOM toolkit for .NET: C-ECHO, C-STORE, C-FIND, C-MOVE, Modality Worklist, anonymization and file dumps from one command.

dotnet tool install -g DicomKit.Cli
dicomkit --help

Runs on .NET 8 or later.

License key

The tool itself is free. The DicomKit toolkit it runs on needs a license key, and a free Developer key (development and testing) is enough: get one at https://dicomkit.plogic.dev/DeveloperKey.

Pass the key on any command with --license-key KEY, or set it once in the DICOMKIT_LICENSE_KEY environment variable. A short key (PLGIC-...) is activated online the first time it is used; a signed license (PLGIC1....) works offline. Without a key every command stops with one line pointing to the Developer key page and exit code 10. Production use needs a Pro or Enterprise plan: https://dicomkit.plogic.dev/Pricing.

export DICOMKIT_LICENSE_KEY=PLGIC-COM-XXXXX-XXXXX-XXXXX-XXXXX        # bash
$env:DICOMKIT_LICENSE_KEY = "PLGIC-COM-XXXXX-XXXXX-XXXXX-XXXXX"      # PowerShell

Commands

Command What it does
echo <host> <port> C-ECHO ("DICOM ping"), prints the round-trip time
store <host> <port> <file-or-folder>... C-STORE files and folders over one association (--recursive for sub-folders)
find <host> <port> --level patient\|study\|series\|image C-FIND, Study Root (Patient Root for patient), table or --json
move <host> <port> --dest AE --study-uid UID C-MOVE a study (or --series-uid) to another AE, with progress
worklist <host> <port> Modality Worklist query (--date, --modality, --station-ae)
anonymize <input> <output-folder> De-identify files, with a reusable salt (--salt-file)
dump <file> Print every element and any parse issues

Network commands take --called AE (the SCP's AE title, default ANY_SCP), --calling AE (ours, default DICOMKIT_SCU) and --timeout SECONDS. dicomkit <command> --help lists every option.

Examples

$ dicomkit echo pacs.example.org 104 --called PACS
C-ECHO pacs.example.org:104 (DICOMKIT_SCU -> PACS): Success (0x0000), round trip 1.4 ms (association 12.0 ms, total 14.1 ms)

$ dicomkit store pacs.example.org 104 ./study --recursive --called PACS
0x0000  ./study/IM0001.dcm
0x0000  ./study/IM0002.dcm
skip    ./study/notes.txt (not a DICOM instance)
Stored 2 of 2 in 0.1 s: 0 failed, 0 not sent, 1 skipped.

$ dicomkit find pacs.example.org 104 --called PACS --patient-name "DOE^*" --study-date 20260101-20261231
StudyDate  PatientID  PatientName  Accession  Modalities  Description  Series  Images  StudyInstanceUID
---------  ---------  -----------  ---------  ----------  -----------  ------  ------  ----------------
20260110   P1         DOE^JOHN     ACC-P1     CT          HEAD         1       2       1.2.826.0.1.3680043.2.1
1 match (STUDY level).

$ dicomkit find pacs.example.org 104 --called PACS --level series --study-uid 1.2.826.0.1.3680043.2.1 --json

$ dicomkit move pacs.example.org 104 --called PACS --dest WORKSTATION --study-uid 1.2.826.0.1.3680043.2.1
C-MOVE study 1.2.826.0.1.3680043.2.1 -> WORKSTATION
pending  0xFF00  remaining 1, completed 1, failed 0, warning 0
Success  0x0000  remaining 0, completed 2, failed 0, warning 0 in 0.3 s

$ dicomkit worklist ris.example.org 105 --called RIS --date today --modality CT

$ dicomkit anonymize ./study ./study-anon --salt-file ~/secrets/project.salt --recursive

$ dicomkit dump ./study/IM0001.dcm

The salt file used by anonymize is a secret: anyone holding it can test whether a known patient ID or UID maps to a pseudonym. Reuse the same salt file to keep pseudonyms and new UIDs consistent across runs, and keep it out of the folder you hand to others.

Exit codes

Code Meaning
0 Success
1 The operation failed (connection refused, association rejected, failure status, a file not stored)
2 Bad command line
3 dump: the file has parse errors
10 No valid license key
130 Cancelled with Ctrl+C (queries and moves are cancelled with C-CANCEL, other operations abort the association)

Disclaimer

Copyright (c) 2026 PrologicSign Technology. Use is governed by the DicomKit License Agreement (LICENSE.txt in the package). Not a medical device: not certified for diagnostic or clinical use.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
1.0.0 117 10/27/2026