galaxyproject / galaxyproject/loom

[Feature request] Let Galaxy instances host the MCP server so Orbit doesn't need a local `uvx`

Open
#149 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
14
Forks
12
Avg merge
6d 5h
Merged PRs (30d)
17

Description

**Context**
Orbit (release install, `linux-arm64`, Jetson) currently launches `galaxy-mcp` as a local subprocess via `uvx` — the `command: "uvx"` MCP entry that gets written into `~/.pi/agent/mcp.json`. When `uvx` isn't available on the host (or the bundled one isn't found), Loom surfaces:

> *"I couldn't inspect the Galaxy history itself because the Galaxy MCP connection failed locally (uvx missing)"*

The codebase already tries to mitigate this by shipping `uv` under `resources/uv/` in packaged builds (see `app/forge.config.ts:208–249` and `app/src/main/agent.ts:74–82`), but the local-subprocess model still leaves a few rough edges for end users: a per-client Python runtime, a per-client galaxy-mcp version, an extra failure surface on platforms where the bundle doesn't resolve, and a `uvx`-spawn delay on every brain start.

**Proposal**
If the Galaxy instance hosted the MCP server itself — exposed over the same HTTPS endpoint as the Galaxy API, behind the existing API key auth — Orbit could connect to it as a remote MCP transport (HTTP/SSE/WebSocket) instead of spawning a subprocess. Concretely:

- Galaxy ships (or proxies to) a managed `galaxy-mcp` endpoint, e.g. `https:///api/mcp`.
- Orbit's mcp.json entry for `galaxy` becomes a `url:` entry pointing at that endpoint, with the existing `${GALAXY_API_KEY}` used as the bearer.
- The local `uvx galaxy-mcp` path remains as a fallback for self-hosted / dev setups that want the client-side server.

**Why this would help**
- Removes the `uv`/Python dependency from the client entirely (no bundling, no PATH plumbing in `agent.ts`).
- Server-side galaxy-mcp version is pinned to the Galaxy instance — no client/server skew.
- One less subprocess in Orbit's process tree; faster cold start.
- Easier to operate Orbit on platforms where bundling Python tooling is painful (ARM64 distros, sandboxed installs, etc.).

**Out of scope**
I'm not asking to remove the local-subprocess path — just to make remote MCP the preferred path when the Galaxy instance offers it. The local fallback stays useful for dev and for Galaxy instances that haven't adopted server-side MCP yet.

Related: #148 (separate report — Electron postinstall failure on the same host).

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reading the MCP configuration generation in app/src/main/agent.ts:74–82 and the packaged uv setup in app/forge.config.ts:208–249, then inspect the generated ~/.pi/agent/mcp.json entry. Define how Orbit detects and prefers a Galaxy-hosted endpoint, preserves the local uvx fallback, and passes the existing API key; done means remote MCP works when available without breaking self-hosted or development setups.

Written by the indexing model from the issue text.

Assessment

Tech stack
python, typescript
Domain
api, backend-api-design, desktop
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.