Files
galaxy/packages
Nicola Soranzo 0889af7dfc Always install `fastmcp`
in preparation for pydantic-ai 2.0.0, which replaced the
dependency on `fastmcp` with `fastmcp-slim[client]`.

Otherwise Galaxy fails to start with:

```
Traceback (most recent call last):
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/fastmcp/server/__init__.py", line 6, in <module>
    from .context import Context
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/fastmcp/server/context.py", line 28, in <module>
    from uncalled_for import SharedContext
ModuleNotFoundError: No module named 'uncalled_for'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/fastmcp/__init__.py", line 57, in __getattr__
    from fastmcp.server.context import Context
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/fastmcp/server/__init__.py", line 9, in <module>
    raise ImportError(_install_hints.SERVER_SUPPORT) from exc
ImportError: FastMCP server support is not installed. Install `fastmcp` or `fastmcp-slim[server]`.

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/bin/gunicorn", line 10, in <module>
    sys.exit(run())
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/gunicorn/app/wsgiapp.py", line 66, in run
    WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]", prog=prog).run()
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/gunicorn/app/base.py", line 235, in run
    super().run()
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/gunicorn/app/base.py", line 71, in run
    Arbiter(self).run()
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/gunicorn/arbiter.py", line 63, in __init__
    self.setup(app)
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/gunicorn/arbiter.py", line 139, in setup
    self.app.wsgi()
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/gunicorn/app/base.py", line 66, in wsgi
    self.callable = self.load()
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/gunicorn/app/wsgiapp.py", line 57, in load
    return self.load_wsgiapp()
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/gunicorn/app/wsgiapp.py", line 47, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/gunicorn/util.py", line 464, in import_app
    app = app(*args, **kwargs)
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/lib/galaxy/webapps/galaxy/fast_factory.py", line 63, in factory
    gx_wsgi_webapp, gx_app = app_pair(
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/lib/galaxy/webapps/galaxy/buildapp.py", line 178, in app_pair
    populate_api_routes(webapp, app)
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/lib/galaxy/webapps/galaxy/buildapp.py", line 362, in populate_api_routes
    webapp.add_api_controllers("galaxy.webapps.galaxy.api", app)
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/lib/galaxy/webapps/base/webapp.py", line 252, in add_api_controllers
    for name, module in base.walk_controller_modules(package_name):
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/lib/galaxy/web/framework/base.py", line 624, in walk_controller_modules
    module = import_module(module_name)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/lib/galaxy/webapps/galaxy/api/mcp.py", line 15, in <module>
    from fastmcp import (
  File "/usr/users/ga002/soranzon/software/nsoranzo_galaxy/.venv/lib/python3.10/site-packages/fastmcp/__init__.py", line 59, in __getattr__
    raise ImportError(_install_hints.SERVER_SUPPORT) from exc
ImportError: FastMCP server support is not installed. Install `fastmcp` or `fastmcp-slim[server]`.
```
2026-07-10 01:49:03 +01:00
..
2026-06-20 22:49:25 +02:00
2026-06-25 15:12:05 +01:00
2026-06-25 15:12:05 +01:00
2026-06-25 15:12:05 +01:00
2026-06-25 15:12:05 +01:00
2026-07-10 01:49:03 +01:00
2026-06-25 15:12:05 +01:00
2025-10-29 18:45:26 +00:00
2026-04-08 14:47:07 +01:00
2026-01-19 18:39:16 +00:00
2026-06-26 16:51:50 +01:00

Package-centric Galaxy

You clone Galaxy as a Monorepo for its Python backend. This packages directory allows us to distribute smaller connected repositories out of individual Galaxy components. CI ensures these repositories have valid dependencies and such defined by running each components tests in isolation.

Development

Typically Galaxy developers develop against the monorepo but there are times when developing against a small unit of Galaxy might make sense - such as to keep an AI (or human cognitive) context as small as possible.

This can be done by treating Galaxy as a uv workspace. The pyproject.toml file in this directory defines a workspace for Galaxy and allows development and testing of individual packages with uv.

Here is an example workflow that will run tests for a specific package after setting up a virtual environment for that package.

$ git clone https://github.com/galaxyproject/galaxy.git
$ cd galaxy/packages
$ cd auth
$ uv sync --all-extras
$ uv run pytest tests

When switching between projects it is just important to remember to rerun the sync command for that project.

The package Makefile has been updated to use ux also, so the above can be simplified to just:

$ git clone https://github.com/galaxyproject/galaxy.git
$ cd galaxy/packages
$ cd auth
$ make test

If the environment has already been setup and you wish to just re-run the tests. The make _test command be used to just do the testing in the existing environment without messing with sync and adjusting dependencies.

The Makefile can also be used for typechecking.

$ git clone https://github.com/galaxyproject/galaxy.git
$ cd galaxy/packages
$ cd auth
$ make mypy
$ make _mypy  # a shortcut to just run mypy on an existing updated environment

This is equivalent to syncing the uv environment and then adding Galaxy's type checking dependencies to it.

$ uv sync --all-extras
$ uv pip install -r ../../lib/galaxy/dependencies/pinned-typecheck-requirements.txt
$ uv run mypy .

The Makefile can also be used for linting.

$ git clone https://github.com/galaxyproject/galaxy.git
$ cd galaxy/packages
$ cd auth
$ make lint
$ make _lint  # a shortcut to just run ruff on an existing updated environment

This is equivalent to syncing the uv environment and then adding Galaxy's linting dependencies to it.

$ uv sync --all-extras
$ uv pip install -r ../../lib/galaxy/dependencies/pinned-lint-requirements.txt
$ uv run ruff check .