diff --git a/pyproject.toml b/pyproject.toml
index 513107332d76f771e95f2b6d6188d2ef158afd51..ca7d28a0dc3e62e8f23c35f8a574f88a3470f3e6 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -15,6 +15,9 @@ dependencies = [
     "tqdm>=4.65.0",
 ]
 
+[project.scripts]
+nctool = "nctool.__main__:main"
+
 [tool.pdm.dev-dependencies]
 dev = [
     "ruff>=0.0.261",
diff --git a/src/nctool/__init__.py b/src/nctool/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/nctool/__main__.py b/src/nctool/__main__.py
new file mode 100644
index 0000000000000000000000000000000000000000..f77c4462f2d8f5e73568e25ca768542f2792f0dd
--- /dev/null
+++ b/src/nctool/__main__.py
@@ -0,0 +1,9 @@
+from . import cli
+
+
+def main():
+    cli.main()
+
+
+if __name__ == "__main__":
+    main()
diff --git a/nctool.py b/src/nctool/cli.py
similarity index 98%
rename from nctool.py
rename to src/nctool/cli.py
index d8c5b52a39d4d2c09b350356ff9168d1fb55bb2a..90b064926ce6fb93bf58d66201bb8a378b0aa7a8 100644
--- a/nctool.py
+++ b/src/nctool/cli.py
@@ -1,4 +1,3 @@
-#! /usr/bin/env python
 import argparse
 from getpass import getpass
 import os
@@ -69,7 +68,7 @@ def get_models(args):
                 fp.write(r.data)
 
 
-if __name__ == "__main__":
+def main():
     parser = argparse.ArgumentParser()
 
     parser.add_argument(