From 7caf4709c4189b44d9185a2b72c556f724012e80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Hr=C4=8Dek?= Date: Thu, 22 Jan 2026 08:25:34 +0100 Subject: [PATCH 1/7] Fix -Wunused-dependencies warnings --- mcp.cabal | 45 +++++++++++++++++---------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/mcp.cabal b/mcp.cabal index 3d3ae2a..6e5b158 100644 --- a/mcp.cabal +++ b/mcp.cabal @@ -26,20 +26,20 @@ version: 0.3.0.0 synopsis: A Haskell implementation of the Model Context Protocol (MCP) -- A longer description of the package. -description: +description: This library provides a complete implementation of the Model Context Protocol (MCP) for Haskell. MCP is a protocol that enables seamless communication between AI models and external tools, resources, and services. This implementation supports the latest - MCP protocol version (2025-06-18) with full compatibility for resources, tools, - prompts, and all standard MCP message types. It provides both a server framework + MCP protocol version (2025-06-18) with full compatibility for resources, tools, + prompts, and all standard MCP message types. It provides both a server framework and type definitions for building MCP-compliant applications. - + Features dual transport support: - + * StdIO transport for process-based clients (e.g., Claude Desktop) * HTTP transport following the official MCP specification for web-based integration, and supports OAuth authentication. - + Both transports use the same MCPServer typeclass, allowing seamless switching between communication methods while maintaining identical server logic. @@ -71,6 +71,12 @@ extra-source-files: examples/claude-desktop-config.json examples/full-config-example.json +tested-with: GHC == 9.6.7 + || == 9.8.4 + || == 9.10.3 + || == 9.12.2 + || == 9.14.1 + homepage: https://github.com/Tritlo/mcp source-repository head @@ -78,16 +84,16 @@ source-repository head location: https://github.com/Tritlo/mcp.git common warnings - ghc-options: -Wall + ghc-options: -Wall -Wunused-packages library -- Import common warning flags. import: warnings -- Modules exported by the library. - exposed-modules: + exposed-modules: MCP.Types - MCP.Protocol + MCP.Protocol MCP.Server MCP.Server.StdIO MCP.Server.HTTP @@ -100,24 +106,19 @@ library -- other-extensions: -- Other library packages from which modules are imported. - build-depends: + build-depends: base >= 4.18.2.1 && <= 4.21.0.0, aeson >= 2.1 && < 2.3, text >= 2.0 && <= 2.1.2, containers >= 0.6 && < 0.7, bytestring >= 0.11 && < 0.12, - unordered-containers >= 0.2 && < 0.3, stm >= 2.5 && < 2.6, - async >= 2.2 && < 2.3, mtl >= 2.3 && < 2.4, - transformers >= 0.6 && < 0.7, warp >= 3.3 && < 3.4, wai >= 3.2 && < 3.3, wai-extra >= 3.1 && < 3.2, servant-server >= 0.19 && < 0.21, servant >= 0.19 && < 0.21, - http-types >= 0.12 && < 0.13, - servant-auth >= 0.4 && < 0.5, servant-auth-server >= 0.4 && < 0.5, jose >= 0.10 && < 0.12, cryptonite >= 0.30 && < 0.31, @@ -152,12 +153,8 @@ executable mcp build-depends: base >= 4.18.2.1 && <= 4.21.0.0, mcp, - aeson >= 2.1 && < 2.3, text >= 2.0 && <= 2.1.2, - containers >= 0.6 && < 0.7, - scientific >= 0.3 && < 0.4, time >= 1.12 && < 1.13, - data-default >= 0.7 && < 0.8 -- Directories containing source files. hs-source-dirs: app @@ -183,13 +180,9 @@ executable mcp-http build-depends: base >= 4.18.2.1 && <= 4.21.0.0, mcp, - aeson >= 2.1 && < 2.3, text >= 2.0 && <= 2.1.2, - containers >= 0.6 && < 0.7, - scientific >= 0.3 && < 0.4, time >= 1.12 && < 1.13, - optparse-applicative >= 0.17 && < 0.19, - data-default >= 0.7 && < 0.8 + optparse-applicative >= 0.17 && < 0.19 -- Directories containing source files. hs-source-dirs: examples @@ -215,13 +208,9 @@ executable mcp-stdio build-depends: base >= 4.18.2.1 && <= 4.21.0.0, mcp, - aeson >= 2.1 && < 2.3, text >= 2.0 && <= 2.1.2, - containers >= 0.6 && < 0.7, - scientific >= 0.3 && < 0.4, time >= 1.12 && < 1.13, optparse-applicative >= 0.17 && < 0.19, - data-default >= 0.7 && < 0.8 -- Directories containing source files. hs-source-dirs: examples From f6a67706dcbf9b481d19e1cc9395f8e42bd772a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Hr=C4=8Dek?= Date: Thu, 22 Jan 2026 08:25:57 +0100 Subject: [PATCH 2/7] Add haskell-ci generated github actions config --- .github/workflows/haskell-ci.yml | 221 +++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 .github/workflows/haskell-ci.yml diff --git a/.github/workflows/haskell-ci.yml b/.github/workflows/haskell-ci.yml new file mode 100644 index 0000000..74a9f8b --- /dev/null +++ b/.github/workflows/haskell-ci.yml @@ -0,0 +1,221 @@ +# This GitHub workflow config has been generated by a script via +# +# haskell-ci 'github' 'mcp.cabal' +# +# To regenerate the script (for example after adjusting tested-with) run +# +# haskell-ci regenerate +# +# For more information, see https://github.com/haskell-CI/haskell-ci +# +# version: 0.19.20260104 +# +# REGENDATA ("0.19.20260104",["github","mcp.cabal"]) +# +name: Haskell-CI +on: + - push + - pull_request + - merge_group +jobs: + linux: + name: Haskell-CI - Linux - ${{ matrix.compiler }} + runs-on: ubuntu-24.04 + timeout-minutes: + 60 + container: + image: buildpack-deps:jammy + continue-on-error: ${{ matrix.allow-failure }} + strategy: + matrix: + include: + - compiler: ghc-9.14.1 + compilerKind: ghc + compilerVersion: 9.14.1 + setup-method: ghcup + allow-failure: false + - compiler: ghc-9.12.2 + compilerKind: ghc + compilerVersion: 9.12.2 + setup-method: ghcup + allow-failure: false + - compiler: ghc-9.10.3 + compilerKind: ghc + compilerVersion: 9.10.3 + setup-method: ghcup + allow-failure: false + - compiler: ghc-9.8.4 + compilerKind: ghc + compilerVersion: 9.8.4 + setup-method: ghcup + allow-failure: false + - compiler: ghc-9.6.7 + compilerKind: ghc + compilerVersion: 9.6.7 + setup-method: ghcup + allow-failure: false + fail-fast: false + steps: + - name: apt-get install + run: | + apt-get update + apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5 + - name: Install GHCup + run: | + mkdir -p "$HOME/.ghcup/bin" + curl -sL https://downloads.haskell.org/ghcup/0.1.50.1/x86_64-linux-ghcup-0.1.50.1 > "$HOME/.ghcup/bin/ghcup" + chmod a+x "$HOME/.ghcup/bin/ghcup" + - name: Install cabal-install + run: | + "$HOME/.ghcup/bin/ghcup" install cabal 3.16.0.0 || (cat "$HOME"/.ghcup/logs/*.* && false) + echo "CABAL=$HOME/.ghcup/bin/cabal-3.16.0.0 -vnormal+nowrap" >> "$GITHUB_ENV" + - name: Install GHC (GHCup) + if: matrix.setup-method == 'ghcup' + run: | + "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false) + HC=$("$HOME/.ghcup/bin/ghcup" whereis ghc "$HCVER") + HCPKG=$(echo "$HC" | sed 's#ghc$#ghc-pkg#') + HADDOCK=$(echo "$HC" | sed 's#ghc$#haddock#') + echo "HC=$HC" >> "$GITHUB_ENV" + echo "HCPKG=$HCPKG" >> "$GITHUB_ENV" + echo "HADDOCK=$HADDOCK" >> "$GITHUB_ENV" + env: + HCKIND: ${{ matrix.compilerKind }} + HCNAME: ${{ matrix.compiler }} + HCVER: ${{ matrix.compilerVersion }} + - name: Set PATH and environment variables + run: | + echo "$HOME/.cabal/bin" >> $GITHUB_PATH + echo "LANG=C.UTF-8" >> "$GITHUB_ENV" + echo "CABAL_DIR=$HOME/.cabal" >> "$GITHUB_ENV" + echo "CABAL_CONFIG=$HOME/.cabal/config" >> "$GITHUB_ENV" + HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))') + echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV" + echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV" + echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV" + echo "HEADHACKAGE=false" >> "$GITHUB_ENV" + echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV" + env: + HCKIND: ${{ matrix.compilerKind }} + HCNAME: ${{ matrix.compiler }} + HCVER: ${{ matrix.compilerVersion }} + - name: env + run: | + env + - name: write cabal config + run: | + mkdir -p $CABAL_DIR + cat >> $CABAL_CONFIG <> $CABAL_CONFIG < cabal-plan.xz + echo 'f62ccb2971567a5f638f2005ad3173dba14693a45154c1508645c52289714cb2 cabal-plan.xz' | sha256sum -c - + xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan + rm -f cabal-plan.xz + chmod a+x $HOME/.cabal/bin/cabal-plan + cabal-plan --version + - name: checkout + uses: actions/checkout@v5 + with: + path: source + - name: initial cabal.project for sdist + run: | + touch cabal.project + echo "packages: $GITHUB_WORKSPACE/source/." >> cabal.project + cat cabal.project + - name: sdist + run: | + mkdir -p sdist + $CABAL sdist all --output-dir $GITHUB_WORKSPACE/sdist + - name: unpack + run: | + mkdir -p unpacked + find sdist -maxdepth 1 -type f -name '*.tar.gz' -exec tar -C $GITHUB_WORKSPACE/unpacked -xzvf {} \; + - name: generate cabal.project + run: | + PKGDIR_mcp="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/mcp-[0-9.]*')" + echo "PKGDIR_mcp=${PKGDIR_mcp}" >> "$GITHUB_ENV" + rm -f cabal.project cabal.project.local + touch cabal.project + touch cabal.project.local + echo "packages: ${PKGDIR_mcp}" >> cabal.project + echo "package mcp" >> cabal.project + echo " ghc-options: -Werror=missing-methods -Werror=missing-fields" >> cabal.project + echo "package mcp" >> cabal.project + echo " ghc-options: -Werror=unused-packages" >> cabal.project + echo "package mcp" >> cabal.project + echo " ghc-options: -Werror=incomplete-patterns -Werror=incomplete-uni-patterns" >> cabal.project + cat >> cabal.project <> cabal.project.local + cat cabal.project + cat cabal.project.local + - name: dump install plan + run: | + $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all + cabal-plan + - name: restore cache + uses: actions/cache/restore@v4 + with: + key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }} + path: ~/.cabal/store + restore-keys: ${{ runner.os }}-${{ matrix.compiler }}- + - name: install dependencies + run: | + $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all + $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dependencies-only -j2 all + - name: build w/o tests + run: | + $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all + - name: build + run: | + $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --write-ghc-environment-files=always + - name: tests + run: | + $CABAL v2-test $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --test-show-details=direct + - name: cabal check + run: | + cd ${PKGDIR_mcp} || false + ${CABAL} -vnormal check + - name: haddock + run: | + $CABAL v2-haddock --disable-documentation --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all + - name: unconstrained build + run: | + rm -f cabal.project.local + $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all + - name: save cache + if: always() + uses: actions/cache/save@v4 + with: + key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }} + path: ~/.cabal/store From d8db835d03f222c7038f1b4e705431699b10fa37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Hr=C4=8Dek?= Date: Thu, 22 Jan 2026 08:29:54 +0100 Subject: [PATCH 3/7] Bump depencency bounds reported by cabal outdated --- mcp.cabal | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/mcp.cabal b/mcp.cabal index 6e5b158..c86b411 100644 --- a/mcp.cabal +++ b/mcp.cabal @@ -107,28 +107,28 @@ library -- Other library packages from which modules are imported. build-depends: - base >= 4.18.2.1 && <= 4.21.0.0, + base >= 4.18.2.1 && <= 4.23.0.0, aeson >= 2.1 && < 2.3, - text >= 2.0 && <= 2.1.2, - containers >= 0.6 && < 0.7, - bytestring >= 0.11 && < 0.12, + text >= 2.0 && <= 2.1.4, + containers >= 0.6 && < 0.9, + bytestring >= 0.11 && < 0.13, stm >= 2.5 && < 2.6, mtl >= 2.3 && < 2.4, - warp >= 3.3 && < 3.4, + warp >= 3.3 && < 3.5, wai >= 3.2 && < 3.3, wai-extra >= 3.1 && < 3.2, servant-server >= 0.19 && < 0.21, servant >= 0.19 && < 0.21, servant-auth-server >= 0.4 && < 0.5, - jose >= 0.10 && < 0.12, + jose >= 0.10 && < 0.13, cryptonite >= 0.30 && < 0.31, - memory >= 0.18 && < 0.19, + memory >= 0.18 && < 0.20, base64-bytestring >= 1.2 && < 1.3, http-conduit >= 2.3 && < 2.4, - random >= 1.2 && < 1.3, - time >= 1.12 && < 1.13, + random >= 1.2 && < 1.4, + time >= 1.12 && < 1.16, uuid >= 1.3 && < 1.4, - data-default >= 0.7 && < 0.8 + data-default >= 0.7 && < 0.9 -- Directories containing source files. hs-source-dirs: src @@ -151,10 +151,10 @@ executable mcp -- Other library packages from which modules are imported. build-depends: - base >= 4.18.2.1 && <= 4.21.0.0, + base >= 4.18.2.1 && <= 4.23.0.0, mcp, - text >= 2.0 && <= 2.1.2, - time >= 1.12 && < 1.13, + text >= 2.0 && <= 2.1.4, + time >= 1.12 && < 1.16, -- Directories containing source files. hs-source-dirs: app @@ -178,11 +178,11 @@ executable mcp-http -- Other library packages from which modules are imported. build-depends: - base >= 4.18.2.1 && <= 4.21.0.0, + base >= 4.18.2.1 && <= 4.23.0.0, mcp, - text >= 2.0 && <= 2.1.2, - time >= 1.12 && < 1.13, - optparse-applicative >= 0.17 && < 0.19 + text >= 2.0 && <= 2.1.4, + time >= 1.12 && < 1.16, + optparse-applicative >= 0.17 && < 0.20 -- Directories containing source files. hs-source-dirs: examples @@ -206,11 +206,11 @@ executable mcp-stdio -- Other library packages from which modules are imported. build-depends: - base >= 4.18.2.1 && <= 4.21.0.0, + base >= 4.18.2.1 && <= 4.23.0.0, mcp, - text >= 2.0 && <= 2.1.2, - time >= 1.12 && < 1.13, - optparse-applicative >= 0.17 && < 0.19, + text >= 2.0 && <= 2.1.4, + time >= 1.12 && < 1.16, + optparse-applicative >= 0.17 && < 0.20, -- Directories containing source files. hs-source-dirs: examples @@ -243,5 +243,5 @@ test-suite mcp-test -- Test dependencies. build-depends: - base >= 4.18.2.1 && <= 4.21.0.0, + base >= 4.18.2.1 && <= 4.23.0.0, mcp From 0e1ae1780abef5c56d2a66e8e665c4b76948d413 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Hr=C4=8Dek?= Date: Thu, 22 Jan 2026 08:31:19 +0100 Subject: [PATCH 4/7] Fix cabal check warnings --- mcp.cabal | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mcp.cabal b/mcp.cabal index c86b411..21e0ccc 100644 --- a/mcp.cabal +++ b/mcp.cabal @@ -107,9 +107,9 @@ library -- Other library packages from which modules are imported. build-depends: - base >= 4.18.2.1 && <= 4.23.0.0, + base >= 4.18.2.1 && < 4.23, aeson >= 2.1 && < 2.3, - text >= 2.0 && <= 2.1.4, + text >= 2.0 && < 2.1.4, containers >= 0.6 && < 0.9, bytestring >= 0.11 && < 0.13, stm >= 2.5 && < 2.6, @@ -151,9 +151,9 @@ executable mcp -- Other library packages from which modules are imported. build-depends: - base >= 4.18.2.1 && <= 4.23.0.0, + base >= 4.18.2.1 && < 4.23, mcp, - text >= 2.0 && <= 2.1.4, + text >= 2.0 && < 2.1.4, time >= 1.12 && < 1.16, -- Directories containing source files. @@ -178,9 +178,9 @@ executable mcp-http -- Other library packages from which modules are imported. build-depends: - base >= 4.18.2.1 && <= 4.23.0.0, + base >= 4.18.2.1 && < 4.23, mcp, - text >= 2.0 && <= 2.1.4, + text >= 2.0 && < 2.1.4, time >= 1.12 && < 1.16, optparse-applicative >= 0.17 && < 0.20 @@ -206,9 +206,9 @@ executable mcp-stdio -- Other library packages from which modules are imported. build-depends: - base >= 4.18.2.1 && <= 4.23.0.0, + base >= 4.18.2.1 && < 4.23, mcp, - text >= 2.0 && <= 2.1.4, + text >= 2.0 && < 2.1.4, time >= 1.12 && < 1.16, optparse-applicative >= 0.17 && < 0.20, @@ -243,5 +243,5 @@ test-suite mcp-test -- Test dependencies. build-depends: - base >= 4.18.2.1 && <= 4.23.0.0, + base >= 4.18.2.1 && < 4.23, mcp From b1dcc0cb0fb6f59849d4a7c40197ae0257ba4efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Hr=C4=8Dek?= Date: Thu, 22 Jan 2026 08:33:03 +0100 Subject: [PATCH 5/7] Fix cabal check warnings - part 2 --- mcp.cabal | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mcp.cabal b/mcp.cabal index 21e0ccc..e630760 100644 --- a/mcp.cabal +++ b/mcp.cabal @@ -68,8 +68,10 @@ extra-source-files: schema.ts examples/README.md examples/http-server.hs + examples/stdio-server.hs + examples/cursor-config-examples.json examples/claude-desktop-config.json - examples/full-config-example.json + examples/claude-desktop-full-config.json tested-with: GHC == 9.6.7 || == 9.8.4 From 3ceb8c18e940953d7ebea6455e49f2721b98a5d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Hr=C4=8Dek?= Date: Thu, 22 Jan 2026 08:42:18 +0100 Subject: [PATCH 6/7] Remove not yet working ghc 9.14 --- .github/workflows/haskell-ci.yml | 5 ----- mcp.cabal | 1 - 2 files changed, 6 deletions(-) diff --git a/.github/workflows/haskell-ci.yml b/.github/workflows/haskell-ci.yml index 74a9f8b..c599bea 100644 --- a/.github/workflows/haskell-ci.yml +++ b/.github/workflows/haskell-ci.yml @@ -29,11 +29,6 @@ jobs: strategy: matrix: include: - - compiler: ghc-9.14.1 - compilerKind: ghc - compilerVersion: 9.14.1 - setup-method: ghcup - allow-failure: false - compiler: ghc-9.12.2 compilerKind: ghc compilerVersion: 9.12.2 diff --git a/mcp.cabal b/mcp.cabal index e630760..5237fe0 100644 --- a/mcp.cabal +++ b/mcp.cabal @@ -77,7 +77,6 @@ tested-with: GHC == 9.6.7 || == 9.8.4 || == 9.10.3 || == 9.12.2 - || == 9.14.1 homepage: https://github.com/Tritlo/mcp From e81305f2ae4c44f88021b7dd32e1e2710804c78b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Hr=C4=8Dek?= Date: Thu, 22 Jan 2026 08:56:08 +0100 Subject: [PATCH 7/7] Fix -Wunused-packages warning in tests --- mcp.cabal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcp.cabal b/mcp.cabal index 5237fe0..e1606e4 100644 --- a/mcp.cabal +++ b/mcp.cabal @@ -245,4 +245,4 @@ test-suite mcp-test -- Test dependencies. build-depends: base >= 4.18.2.1 && < 4.23, - mcp + -- mcp