diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,15 @@
 
 ## [Unreleased]
 
+## [0.1.3.1] - 2026-10-20
+
+### Fixed
+
+- Pre-built binaries on GitHub were built against paths in `/nix/store`, and
+  were not portable to systems that did not have Nix installed. The binaries are
+  now correctly linked to be used on non-Nix machines, and NixOS machines with
+  `nix-ld` enabled.
+
 ## [0.1.3.0] - 2026-09-17
 
 ### Added
diff --git a/src/Tricorder/MCP/Tools.hs b/src/Tricorder/MCP/Tools.hs
--- a/src/Tricorder/MCP/Tools.hs
+++ b/src/Tricorder/MCP/Tools.hs
@@ -24,12 +24,15 @@
 import System.Exit (ExitCode (..))
 import System.Posix (getWorkingDirectory)
 import System.Process.Typed (proc, readProcess, setWorkingDir)
+import Tricorder.CLI.Command.OutputFormat (OutputFormat (..))
+import Tricorder.CLI.Command.WaitMode (WaitMode)
 import Tricorder.SourceLookup.SourceQuery (parseSourceQuery)
 import Prelude hiding (force)
 
 import Data.ByteString.Lazy qualified as BSL
 import Data.List qualified as List
 import Tricorder.CLI.Command qualified as CLI
+import Tricorder.CLI.Command.WaitMode qualified as WaitMode
 
 
 data Tool
@@ -158,7 +161,7 @@
         , defaultDefinitionOptions
             { optDescription =
                 Just
-                    "Print the Haskell source of one or more installed modules. Prefer this over downloading tarballs."
+                    "Print the Haskell source of one or more project or installed modules. Prefer this over downloading tarballs."
             , optTitle = Just "Lookup source"
             , optFieldDescriptions =
                 [ ("modules", "Module names to look up, e.g. Data.Map.Strict or Data.Map.Strict#insert.")
@@ -221,7 +224,7 @@
             $ CLI.Status
                 CLI.StatusOptions
                     { wait = toWaitMode wait
-                    , format = CLI.JsonOutput
+                    , format = JsonOutput
                     , verbosity = toVerbosity verbose
                     , expand
                     }
@@ -229,21 +232,29 @@
     (TestResults (TestResultsOptions {failed, wait, projectRoot})) ->
         ( projectRoot
         , CLI.commandToArgs
-            $ CLI.Test
+            $ CLI.TestResults
                 CLI.TestOptions
                     { failedOnly = fromMaybe False failed
                     , wait = toWaitMode wait
                     }
         )
     (Source (SourceOptions {modules, projectRoot})) ->
-        (projectRoot, CLI.commandToArgs $ CLI.Source $ parseSourceQuery <$> modules)
+        ( projectRoot
+        , CLI.commandToArgs
+            $ CLI.Source
+                CLI.SourceOptions
+                    { queries = parseSourceQuery <$> modules
+                    , maxDepth = Nothing
+                    , maxModules = Nothing
+                    }
+        )
     (EvalComments (EvalCommentsOptions {wait, projectRoot})) ->
         ( projectRoot
         , CLI.commandToArgs
             $ CLI.EvalComments
                 CLI.EvalCommentsOptions
                     { wait = toWaitMode wait
-                    , format = CLI.JsonOutput
+                    , format = JsonOutput
                     }
         )
     LogPath (LogPathOptions {projectRoot}) ->
@@ -256,8 +267,11 @@
 toForce = maybe CLI.NoForce (\enabled -> if enabled then CLI.Force else CLI.NoForce)
 
 
-toWaitMode :: Maybe Bool -> CLI.WaitMode
-toWaitMode = maybe CLI.ShowCurrent (\enabled -> if enabled then CLI.WaitForBuild else CLI.ShowCurrent)
+toWaitMode :: Maybe Bool -> WaitMode
+toWaitMode =
+    maybe
+        WaitMode.ShowCurrent
+        (\enabled -> if enabled then WaitMode.WaitForBuild else WaitMode.ShowCurrent)
 
 
 toVerbosity :: Maybe Bool -> CLI.Verbosity
diff --git a/test/Unit/Tricorder/MCP/ToolsSpec.hs b/test/Unit/Tricorder/MCP/ToolsSpec.hs
--- a/test/Unit/Tricorder/MCP/ToolsSpec.hs
+++ b/test/Unit/Tricorder/MCP/ToolsSpec.hs
@@ -1,77 +1,89 @@
-module Unit.Tricorder.MCP.ToolsSpec (spec_Tools) where
+module Unit.Tricorder.MCP.ToolsSpec (test_Tools) where
 
-import Test.Hspec (Spec, describe, it, shouldBe)
+import Test.Tasty (TestTree, testGroup)
+import Test.Tasty.HUnit (testCase, (@?=))
 
 import Tricorder.MCP.Tools
+    ( EvalCommentsOptions (..)
+    , LogContentsOptions (..)
+    , LogPathOptions (..)
+    , RestartOptions (..)
+    , SourceOptions (..)
+    , StartOptions (..)
+    , StatusOptions (..)
+    , StopOptions (..)
+    , TestResultsOptions (..)
+    , Tool (..)
+    , reportsBuildOutcome
+    , toolCommand
+    )
 
 
-spec_Tools :: Spec
-spec_Tools = do
-    describe "toolCommand" do
-        it "starts with just the directory" do
-            toolCommand (Start StartOptions {projectRoot = Nothing})
-                `shouldBe` (Nothing, ["start"])
-
-        it "omits --force when unset" do
-            toolCommand (Stop (StopOptions {force = Nothing, projectRoot = Nothing}))
-                `shouldBe` (Nothing, ["stop"])
-
-        it "omits --force when explicitly false" do
-            toolCommand (Restart (RestartOptions {force = Just False, projectRoot = Nothing}))
-                `shouldBe` (Nothing, ["restart"])
-
-        it "includes --force when true" do
-            toolCommand
-                ( Stop
-                    ( StopOptions
-                        { force = Just True
-                        , projectRoot = Nothing
-                        }
+test_Tools :: TestTree
+test_Tools =
+    testGroup
+        "Tools"
+        [ testGroup
+            "toolCommand"
+            [ testCase "starts with just the directory"
+                $ toolCommand (Start StartOptions {projectRoot = Nothing})
+                    @?= (Nothing, ["start"])
+            , testCase "omits --force when unset"
+                $ toolCommand (Stop (StopOptions {force = Nothing, projectRoot = Nothing}))
+                    @?= (Nothing, ["stop"])
+            , testCase "omits --force when explicitly false"
+                $ toolCommand (Restart (RestartOptions {force = Just False, projectRoot = Nothing}))
+                    @?= (Nothing, ["restart"])
+            , testCase "includes --force when true"
+                $ toolCommand
+                    ( Stop
+                        ( StopOptions
+                            { force = Just True
+                            , projectRoot = Nothing
+                            }
+                        )
                     )
-                )
-                `shouldBe` (Nothing, ["stop", "--force"])
-
-        it "combines status flags in order, with --expand carrying its argument" do
-            toolCommand
-                ( Status
-                    StatusOptions
-                        { wait = Just True
-                        , verbose = Nothing
-                        , expand = Just 3
-                        , projectRoot = Nothing
-                        }
-                )
-                `shouldBe` (Nothing, ["status", "--wait", "--json", "--expand", "3"])
-
-        it "turns modules into positional arguments" do
-            toolCommand
-                ( Source
-                    ( SourceOptions
-                        { projectRoot = Nothing
-                        , modules = ["Data.Map.Strict", "Foo#bar"]
-                        }
+                    @?= (Nothing, ["stop", "--force"])
+            , testCase "combines status flags in order, with --expand carrying its argument"
+                $ toolCommand
+                    ( Status
+                        StatusOptions
+                            { wait = Just True
+                            , verbose = Nothing
+                            , expand = Just 3
+                            , projectRoot = Nothing
+                            }
                     )
-                )
-                `shouldBe` (Nothing, ["source", "Data.Map.Strict", "Foo#bar"])
-
-        it "maps log_path to --print-path" do
-            toolCommand (LogPath LogPathOptions {projectRoot = Nothing})
-                `shouldBe` (Nothing, ["log", "--print-path"])
-
-        it "maps log_contents to plain log" do
-            toolCommand (LogContents LogContentsOptions {projectRoot = Nothing})
-                `shouldBe` (Nothing, ["log"])
-
-    describe "reportsBuildOutcome" do
-        it "is true for status, test_results and eval_comments" do
-            reportsBuildOutcome (Status (StatusOptions Nothing Nothing Nothing Nothing)) `shouldBe` True
-            reportsBuildOutcome (TestResults (TestResultsOptions Nothing Nothing Nothing)) `shouldBe` True
-            reportsBuildOutcome (EvalComments (EvalCommentsOptions Nothing Nothing)) `shouldBe` True
-
-        it "is false for commands whose exit code reflects process failure" do
-            reportsBuildOutcome (Start $ StartOptions Nothing) `shouldBe` False
-            reportsBuildOutcome (Stop $ StopOptions Nothing Nothing) `shouldBe` False
-            reportsBuildOutcome (Restart $ RestartOptions Nothing Nothing) `shouldBe` False
-            reportsBuildOutcome (Source $ SourceOptions [] Nothing) `shouldBe` False
-            reportsBuildOutcome (LogPath $ LogPathOptions Nothing) `shouldBe` False
-            reportsBuildOutcome (LogContents $ LogContentsOptions Nothing) `shouldBe` False
+                    @?= (Nothing, ["status", "--wait", "--json", "--expand", "3"])
+            , testCase "turns modules into positional arguments"
+                $ toolCommand
+                    ( Source
+                        ( SourceOptions
+                            { projectRoot = Nothing
+                            , modules = ["Data.Map.Strict", "Foo#bar"]
+                            }
+                        )
+                    )
+                    @?= (Nothing, ["source", "Data.Map.Strict", "Foo#bar"])
+            , testCase "maps log_path to --print-path"
+                $ toolCommand (LogPath LogPathOptions {projectRoot = Nothing})
+                    @?= (Nothing, ["log", "--print-path"])
+            , testCase "maps log_contents to plain log"
+                $ toolCommand (LogContents LogContentsOptions {projectRoot = Nothing})
+                    @?= (Nothing, ["log"])
+            ]
+        , testGroup
+            "reportsBuildOutcome"
+            [ testCase "is true for status, test_results and eval_comments" do
+                reportsBuildOutcome (Status (StatusOptions Nothing Nothing Nothing Nothing)) @?= True
+                reportsBuildOutcome (TestResults (TestResultsOptions Nothing Nothing Nothing)) @?= True
+                reportsBuildOutcome (EvalComments (EvalCommentsOptions Nothing Nothing)) @?= True
+            , testCase "is false for commands whose exit code reflects process failure" do
+                reportsBuildOutcome (Start $ StartOptions Nothing) @?= False
+                reportsBuildOutcome (Stop $ StopOptions Nothing Nothing) @?= False
+                reportsBuildOutcome (Restart $ RestartOptions Nothing Nothing) @?= False
+                reportsBuildOutcome (Source $ SourceOptions [] Nothing) @?= False
+                reportsBuildOutcome (LogPath $ LogPathOptions Nothing) @?= False
+                reportsBuildOutcome (LogContents $ LogContentsOptions Nothing) @?= False
+            ]
+        ]
diff --git a/tricorder-mcp.cabal b/tricorder-mcp.cabal
--- a/tricorder-mcp.cabal
+++ b/tricorder-mcp.cabal
@@ -5,14 +5,14 @@
 -- see: https://github.com/sol/hpack
 
 name:           tricorder-mcp
-version:        0.1.3.0
+version:        0.1.3.1
 synopsis:       MCP server for Tricorder
 description:    Model Context Protocol server for Tricorder.
 category:       AI,
                 Development
 homepage:       https://github.com/tweag/tricorder#readme
 bug-reports:    https://github.com/tweag/tricorder/issues
-author:         Victor Nascimento Bakke
+author:         Christian Georgii
 maintainer:     victor.bakke@tweag.io
 license:        MIT
 license-file:   LICENSE
@@ -60,7 +60,7 @@
       TypeFamilies
   ghc-options: -Weverything -Wno-unsafe -Wno-missing-safe-haskell-mode -Wno-monomorphism-restriction -Wno-missing-kind-signatures -Wno-missing-local-signatures -Wno-missing-import-lists -Wno-implicit-prelude -Wno-unticked-promoted-constructors -Wno-unused-packages -Wno-all-missed-specialisations -Wno-missed-specialisations -fplugin=Effectful.Plugin -threaded
   build-depends:
-      atelier-core ==0.7.*
+      atelier-core ==0.8.*
     , atelier-prelude ==0.4.*
     , base >=4.18 && <4.23
     , bytestring >=0.11 && <0.13
@@ -69,7 +69,7 @@
     , effectful-plugin ==2.2.*
     , mcp-server ==0.2.*
     , process ==1.6.*
-    , tricorder-types ==0.4.*
+    , tricorder-types ==0.5.*
     , typed-process ==0.2.*
     , unix ==2.8.*
   mixins:
@@ -147,14 +147,13 @@
   build-tool-depends:
       tasty-discover:tasty-discover
   build-depends:
-      atelier-core ==0.7.*
+      atelier-core ==0.8.*
     , atelier-prelude ==0.4.*
     , base >=4.18 && <4.23
     , effectful-core ==2.7.*
     , effectful-plugin ==2.2.*
-    , hspec ==2.11.*
     , tasty ==1.5.*
-    , tasty-hspec ==1.2.*
+    , tasty-hunit >=0.10.2 && <0.11
     , tricorder-mcp-internal
   mixins:
       base hiding (Prelude)
