diff --git a/.github/workflows/mpy_format.yml b/.github/workflows/mpy_format.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ab90bb339aa1ba68ee04b16213fd60b381d638ab
--- /dev/null
+++ b/.github/workflows/mpy_format.yml
@@ -0,0 +1,18 @@
+name: .mpy file format and tools
+
+on:
+  push:
+  pull_request:
+    paths:
+      - '.github/workflows/*.yml'
+      - 'tools/**'
+
+jobs:
+  test:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v2
+    - name: Install packages
+      run: source tools/ci.sh && ci_mpy_format_setup
+    - name: Test mpy-tool.py
+      run: source tools/ci.sh && ci_mpy_format_test
diff --git a/tools/ci.sh b/tools/ci.sh
index 3e78ae4a05a86702ed7a893168d1aacd938e9a49..075e5e423a9ca9d829ef1f4966128b42c7b02913 100755
--- a/tools/ci.sh
+++ b/tools/ci.sh
@@ -67,6 +67,23 @@ function ci_code_size_build {
     tools/metrics.py build bm | tee ~/size1
 }
 
+########################################################################################
+# .mpy file format
+
+function ci_mpy_format_setup {
+    sudo pip3 install pyelftools
+}
+
+function ci_mpy_format_test {
+    # Test mpy-tool.py dump feature on bytecode
+    python2 ./tools/mpy-tool.py -xd ports/minimal/frozentest.mpy
+    python3 ./tools/mpy-tool.py -xd ports/minimal/frozentest.mpy
+
+    # Test mpy-tool.py dump feature on native code
+    make -C examples/natmod/features1
+    ./tools/mpy-tool.py -xd examples/natmod/features1/features1.mpy
+}
+
 ########################################################################################
 # ports/cc3200