From c71ac440a1e7358b55891daea46d5520f62eb56d Mon Sep 17 00:00:00 2001 From: aprozo Date: Fri, 17 Jul 2026 12:01:16 +0100 Subject: [PATCH 1/9] feat: install the EIC MCP server stack via spack packages The eic-mcp launcher and every MCP server now come from eic-spack recipes and land in /opt/local/bin via the environment view (supersedes #328: no bundled script, no runtime clone/build). - xl/spack.yaml: add eic-mcp, rucio-eic-mcp-server, supergateway, uproot-mcp-server (xrootd-/zenodo-mcp-server were already in) - packages.yaml: version requires for the servers and bridge; py-mcp +cli --- spack-environment/packages.yaml | 22 ++++++++++++++++++++++ spack-environment/xl/spack.yaml | 4 ++++ 2 files changed, 26 insertions(+) diff --git a/spack-environment/packages.yaml b/spack-environment/packages.yaml index c309dc421..84686aea7 100644 --- a/spack-environment/packages.yaml +++ b/spack-environment/packages.yaml @@ -158,6 +158,9 @@ packages: externals: - spec: egl@1.5.0 prefix: /usr + eic-mcp: + require: + - '@main' # pin to the first tagged release once eic/eic-mcp tags one eic-opticks: require: - '@0.3.0' @@ -510,6 +513,10 @@ packages: py-matplotlib: require: - '@3.10' # avoid FT_Render_Glyph errors possibly due to https://github.com/matplotlib/matplotlib/pull/30059 + py-mcp: + require: + - '@1.28:' + - +cli # rucio-eic-mcp-server needs mcp[cli] py-mplhep: require: - '@0.4.0:' @@ -622,6 +629,9 @@ packages: - '@6.38.04' - cxxstd=20 +fftw +fortran +gdml +http -ipo +mlp +python +root7 +tmva +tmva-sofie +x +xrootd +ssl - any_of: [+opengl +webgui, -opengl -webgui] + rucio-eic-mcp-server: + require: + - '@0.1.0:' sherpa: require: - '@3.0.1' @@ -665,6 +675,9 @@ packages: strace: require: - -mpers + supergateway: + require: + - '@3.4.3:' swig: require: - '@4.1:' # constrain to avoid duplicates in eic_tf @@ -675,6 +688,9 @@ packages: require: - '@2.8.0' - -xnnpack + uproot-mcp-server: + require: + - '@0.1.0:' valgrind: require: - '@3.20.0:' @@ -688,9 +704,15 @@ packages: require: - '@5.7.0:' - cxxstd=20 -davix +python +scitokens-cpp + xrootd-mcp-server: + require: + - '@0.1.0:' yoda: require: - '@2.1.0:' + zenodo-mcp-server: + require: + - '@0.1.0:' zlib-api: require: - zlib-ng diff --git a/spack-environment/xl/spack.yaml b/spack-environment/xl/spack.yaml index 474c392ac..576a90eff 100644 --- a/spack-environment/xl/spack.yaml +++ b/spack-environment/xl/spack.yaml @@ -28,6 +28,7 @@ spack: - doxygen - east - edm4hep + - eic-mcp - eic-smear - eigen - emacs @@ -126,6 +127,7 @@ spack: - py-yapf - rivet - root + - rucio-eic-mcp-server - sherpa - simsipm - slurm sysconfdir=/etc/slurm @@ -133,6 +135,8 @@ spack: - spdlog - stow - strace + - supergateway + - uproot-mcp-server - valgrind - xeyes - xrootd From 95e1fbb2664822d226f6c3069be4e455034b2558 Mon Sep 17 00:00:00 2001 From: aprozo Date: Fri, 17 Jul 2026 12:01:16 +0100 Subject: [PATCH 2/9] feat: opencode, an AI coding agent CLI For headless LLM-client use inside eic-shell (farm nodes, CI reproducers). Installed from the per-platform GitHub release binary. --- spack-environment/packages.yaml | 3 +++ spack-environment/xl/spack.yaml | 1 + 2 files changed, 4 insertions(+) diff --git a/spack-environment/packages.yaml b/spack-environment/packages.yaml index 84686aea7..cb9662c4f 100644 --- a/spack-environment/packages.yaml +++ b/spack-environment/packages.yaml @@ -383,6 +383,9 @@ packages: require: - '@7.8.1:' - +application_framework -vtk + opencode: + require: + - '@1.18.3:' opengl: buildable: False externals: diff --git a/spack-environment/xl/spack.yaml b/spack-environment/xl/spack.yaml index 576a90eff..ec4624f2c 100644 --- a/spack-environment/xl/spack.yaml +++ b/spack-environment/xl/spack.yaml @@ -70,6 +70,7 @@ spack: - ollama - onnx - opencascade + - opencode - osg-ca-certs - pelican - phonebook-cli From 359fad94af1be30699db5a7c43a13ce8aeea1008 Mon Sep 17 00:00:00 2001 From: aprozo Date: Fri, 17 Jul 2026 12:01:16 +0100 Subject: [PATCH 3/9] chore: TESTING pin eic-spack to the MCP recipes branch Points at aprozo/eic-spack feat/mcp-servers (develop@dd8a73e + the new recipes). Revert to eic/eic-spack at the merge SHA before undrafting. --- eic-spack.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/eic-spack.sh b/eic-spack.sh index dca91197a..81a1ea559 100644 --- a/eic-spack.sh +++ b/eic-spack.sh @@ -1,8 +1,10 @@ # shellcheck shell=bash # shellcheck disable=SC2034 # Variables are used by scripts that source this file ## EIC spack organization and repository, e.g. eic/eic-spack -EICSPACK_ORGREPO="eic/eic-spack" +## TESTING ONLY — revert to eic/eic-spack + the merge SHA before undrafting. +## The pinned commit is develop@dd8a73e + the MCP/opencode recipes. +EICSPACK_ORGREPO="aprozo/eic-spack" ## EIC spack commit hash or github version, e.g. v0.19.7 ## note: nightly builds could use a branch e.g. releases/v0.19 -EICSPACK_VERSION="dd8a73e348ec36c685da707c2d33f1d94b8df82c" +EICSPACK_VERSION="f356d6b81a19173901ef1e68eb2bb59099610b5f" From ce2fcba7936d7ce89074c78ff5b146d92500b418 Mon Sep 17 00:00:00 2001 From: aprozo Date: Fri, 17 Jul 2026 14:20:37 +0100 Subject: [PATCH 4/9] fix: py-mcp without the cli variant py-typer (newest builtin: 0.23.2) pins py-click@:8.1.8, which cannot unify with the environment's click 8.3+ (flask via pyrobird). The MCP servers only need mcp core, so the eic-spack recipes default the cli variant off. --- spack-environment/packages.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spack-environment/packages.yaml b/spack-environment/packages.yaml index cb9662c4f..9321670ad 100644 --- a/spack-environment/packages.yaml +++ b/spack-environment/packages.yaml @@ -519,7 +519,8 @@ packages: py-mcp: require: - '@1.28:' - - +cli # rucio-eic-mcp-server needs mcp[cli] + # no +cli: the typer-based mcp CLI pins py-click@:8.1.8, which cannot + # unify with the environment's click 8.3+ (flask); servers need mcp core py-mplhep: require: - '@0.4.0:' From 3d658cc8888863f3e9c634ac5e3d868c71ac401c Mon Sep 17 00:00:00 2001 From: aprozo Date: Fri, 17 Jul 2026 17:39:31 +0100 Subject: [PATCH 5/9] chore: bump the TESTING eic-spack pin to the current #986 head The previous pin predated py-mcp defaulting ~cli, so the typer/click conflict was still in the DAG. Also picks up the py-pyjwt import-test path fix, and drops the fork indirection now that the branch lives on eic/eic-spack. --- eic-spack.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/eic-spack.sh b/eic-spack.sh index 81a1ea559..b64235246 100644 --- a/eic-spack.sh +++ b/eic-spack.sh @@ -1,10 +1,10 @@ # shellcheck shell=bash # shellcheck disable=SC2034 # Variables are used by scripts that source this file ## EIC spack organization and repository, e.g. eic/eic-spack -## TESTING ONLY — revert to eic/eic-spack + the merge SHA before undrafting. -## The pinned commit is develop@dd8a73e + the MCP/opencode recipes. -EICSPACK_ORGREPO="aprozo/eic-spack" +EICSPACK_ORGREPO="eic/eic-spack" ## EIC spack commit hash or github version, e.g. v0.19.7 ## note: nightly builds could use a branch e.g. releases/v0.19 -EICSPACK_VERSION="f356d6b81a19173901ef1e68eb2bb59099610b5f" +## TESTING: head of eic-spack#986 (develop@dd8a73e + the MCP/opencode +## recipes); bump to the merge SHA before undrafting. +EICSPACK_VERSION="44bb45e3d8874740410d7152ce8f778893dcb86b" From 33e227bcfdc19255bcda86bc31ef8de36447c9fc Mon Sep 17 00:00:00 2001 From: aprozo Date: Mon, 31 Aug 2026 12:14:16 +0200 Subject: [PATCH 6/9] xl: drop supergateway; track main for the native-HTTP MCP servers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The MCP servers now speak streamable HTTP themselves and eic-mcp starts them directly, so the stdio bridge is gone from the environment. The three server pins move to '@main' — the only pin that builds before the v0.2.0 tags exist — mirroring the precedent eic-mcp already sets; flip them to '@0.2.0:' once the tags are pushed (grep TODO(push)). --- eic-spack.sh | 1 + spack-environment/packages.yaml | 9 +++------ spack-environment/xl/spack.yaml | 1 - 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/eic-spack.sh b/eic-spack.sh index b64235246..cb3ace1ef 100644 --- a/eic-spack.sh +++ b/eic-spack.sh @@ -7,4 +7,5 @@ EICSPACK_ORGREPO="eic/eic-spack" ## note: nightly builds could use a branch e.g. releases/v0.19 ## TESTING: head of eic-spack#986 (develop@dd8a73e + the MCP/opencode ## recipes); bump to the merge SHA before undrafting. +## TODO(push): bump to the new feat/mcp-servers head (native HTTP, no supergateway). EICSPACK_VERSION="44bb45e3d8874740410d7152ce8f778893dcb86b" diff --git a/spack-environment/packages.yaml b/spack-environment/packages.yaml index 9321670ad..81a58bbd5 100644 --- a/spack-environment/packages.yaml +++ b/spack-environment/packages.yaml @@ -635,7 +635,7 @@ packages: - any_of: [+opengl +webgui, -opengl -webgui] rucio-eic-mcp-server: require: - - '@0.1.0:' + - '@main' # native streamable HTTP; pin to '@0.2.0:' once v0.2.0 is tagged sherpa: require: - '@3.0.1' @@ -679,9 +679,6 @@ packages: strace: require: - -mpers - supergateway: - require: - - '@3.4.3:' swig: require: - '@4.1:' # constrain to avoid duplicates in eic_tf @@ -694,7 +691,7 @@ packages: - -xnnpack uproot-mcp-server: require: - - '@0.1.0:' + - '@main' # native streamable HTTP; pin to '@0.2.0:' once v0.2.0 is tagged valgrind: require: - '@3.20.0:' @@ -710,7 +707,7 @@ packages: - cxxstd=20 -davix +python +scitokens-cpp xrootd-mcp-server: require: - - '@0.1.0:' + - '@main' # native streamable HTTP; pin to '@0.2.0:' once v0.2.0 is tagged yoda: require: - '@2.1.0:' diff --git a/spack-environment/xl/spack.yaml b/spack-environment/xl/spack.yaml index ec4624f2c..ce6ca41bd 100644 --- a/spack-environment/xl/spack.yaml +++ b/spack-environment/xl/spack.yaml @@ -136,7 +136,6 @@ spack: - spdlog - stow - strace - - supergateway - uproot-mcp-server - valgrind - xeyes From e0bc4d153843604fad5f558c04774c1f9e0b763b Mon Sep 17 00:00:00 2001 From: aprozo Date: Mon, 31 Aug 2026 14:24:08 +0200 Subject: [PATCH 7/9] =?UTF-8?q?xl:=20drop=20opencode=20=E2=80=94=20it=20st?= =?UTF-8?q?ays=20a=20host-side=20install?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spack-environment/packages.yaml | 3 --- spack-environment/xl/spack.yaml | 1 - 2 files changed, 4 deletions(-) diff --git a/spack-environment/packages.yaml b/spack-environment/packages.yaml index 81a58bbd5..40be316eb 100644 --- a/spack-environment/packages.yaml +++ b/spack-environment/packages.yaml @@ -383,9 +383,6 @@ packages: require: - '@7.8.1:' - +application_framework -vtk - opencode: - require: - - '@1.18.3:' opengl: buildable: False externals: diff --git a/spack-environment/xl/spack.yaml b/spack-environment/xl/spack.yaml index ce6ca41bd..eca693d24 100644 --- a/spack-environment/xl/spack.yaml +++ b/spack-environment/xl/spack.yaml @@ -70,7 +70,6 @@ spack: - ollama - onnx - opencascade - - opencode - osg-ca-certs - pelican - phonebook-cli From ce4d0b860e0b59c3580b15120f737f1a8177b633 Mon Sep 17 00:00:00 2001 From: aprozo Date: Mon, 31 Aug 2026 15:13:14 +0200 Subject: [PATCH 8/9] cherry-pick spack-packages#5637 (py-mcp + deps); track the deduped eic-spack head --- eic-spack.sh | 5 +++-- spack-packages.sh | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/eic-spack.sh b/eic-spack.sh index cb3ace1ef..2af0355e4 100644 --- a/eic-spack.sh +++ b/eic-spack.sh @@ -7,5 +7,6 @@ EICSPACK_ORGREPO="eic/eic-spack" ## note: nightly builds could use a branch e.g. releases/v0.19 ## TESTING: head of eic-spack#986 (develop@dd8a73e + the MCP/opencode ## recipes); bump to the merge SHA before undrafting. -## TODO(push): bump to the new feat/mcp-servers head (native HTTP, no supergateway). -EICSPACK_VERSION="44bb45e3d8874740410d7152ce8f778893dcb86b" +## TESTING: head of eic-spack#986 (native HTTP, no supergateway, py-* deps +## from the spack-packages#5637 cherry-pick); bump to the merge SHA before undrafting. +EICSPACK_VERSION="646ef8ccdd18ba3c69b91331c08dd50e4715210d" diff --git a/spack-packages.sh b/spack-packages.sh index 09cf311c2..c2c8fa92a 100644 --- a/spack-packages.sh +++ b/spack-packages.sh @@ -23,6 +23,7 @@ a7c32f24cd5b69b237dc974804a71326306f4e58 de97f131df3dbc940151f406afd5c2c1158a660c caf013be0ee1594fdbba8feb07ffecc88474a2b0 75395349957ad785cca50002dffb18bbcb48af27 +d18c9ad43ea50d71e666c8a859da3293e4776c19 --- ## Optional hash table with comma-separated file list ## For these commits, the cherry-pick will be restricted to the listed files only. @@ -43,3 +44,4 @@ read -r -d '' SPACKPACKAGES_CHERRYPICKS_FILES <<- \ ## de97f131df3dbc940151f406afd5c2c1158a660c: TensorFlow: add v2.21.0 ## caf013be0ee1594fdbba8feb07ffecc88474a2b0: Add missing xxd dep ## 75395349957ad785cca50002dffb18bbcb48af27: py-torch: ensure setuptools is not unnecessarily constrained for 2.10: +## d18c9ad43ea50d71e666c8a859da3293e4776c19: py-mcp: new package (with missing deps, py-pyjwt 2.10.1) (#5637) From 6f7864db631267da035607a76a751bbb099a98b0 Mon Sep 17 00:00:00 2001 From: aprozo Date: Mon, 31 Aug 2026 15:29:26 +0200 Subject: [PATCH 9/9] xl: opencode via the upstream spack-packages recipe (#5639 cherry-pick) Both picks (#5637, #5639) verified to apply cleanly in sequence onto v2026.06.0. --- spack-environment/packages.yaml | 3 +++ spack-environment/xl/spack.yaml | 1 + spack-packages.sh | 2 ++ 3 files changed, 6 insertions(+) diff --git a/spack-environment/packages.yaml b/spack-environment/packages.yaml index a97737059..fc3df1b50 100644 --- a/spack-environment/packages.yaml +++ b/spack-environment/packages.yaml @@ -401,6 +401,9 @@ packages: opencascade: require: - '@7.8.1:' + opencode: + require: + - '@1.18.3:' - +application_framework -vtk opengl: buildable: False diff --git a/spack-environment/xl/spack.yaml b/spack-environment/xl/spack.yaml index af83114db..dd730cc0e 100644 --- a/spack-environment/xl/spack.yaml +++ b/spack-environment/xl/spack.yaml @@ -70,6 +70,7 @@ spack: - ollama - onnx - opencascade + - opencode - osg-ca-certs - pandorasdk - pelican diff --git a/spack-packages.sh b/spack-packages.sh index f16e40afc..bd283ea20 100644 --- a/spack-packages.sh +++ b/spack-packages.sh @@ -46,6 +46,7 @@ c44cd71db91d6e6c68cb604dcb87311b49b1bedb 409826414a2221be56011f8f0f912905dae558cd 63b8b9c3ac8ddcb2b9aafcd8160ff33bd6210f51 d18c9ad43ea50d71e666c8a859da3293e4776c19 +55be3f79a559d1e8f5ae8dffd1516569f444b5d0 --- ## Optional hash table with comma-separated file list ## For these commits, the cherry-pick will be restricted to the listed files only. @@ -89,3 +90,4 @@ read -r -d '' SPACKPACKAGES_CHERRYPICKS_FILES <<- \ ## 409826414a2221be56011f8f0f912905dae558cd: podio: Add version 1.8 and new parquet variant ## 63b8b9c3ac8ddcb2b9aafcd8160ff33bd6210f51: edm4hep: patch for new podio arrow targets ## d18c9ad43ea50d71e666c8a859da3293e4776c19: py-mcp: new package (with missing deps, py-pyjwt 2.10.1) (#5637) +## 55be3f79a559d1e8f5ae8dffd1516569f444b5d0: opencode, bun: new packages (#5639)