Skip to main content

Multi-repo workspace manager with MCP server + web dashboard

Project description

project-hub

Multi-repo workspace manager that unifies local git state and GitLab forge data (MRs, pipelines, vulnerabilities) into a single MCP server + web dashboard.

Designed for engineers managing many repos under one parent directory.

Dashboard

Killer features

aka why I built this

Vulnerabilities that make sense. GitLab's vulnerability report is per-repo, noisy, and doesn't tell you what's already being fixed. project-hub aggregates vulns across all your repos, cross-references them with open MR branches to flag what's already fixed but not yet merged ("fixed in branch"), and lets you filter by severity, state, or hide already-handled ones. You see what actually needs work, not what's already in flight.

Stale branch detection. After merging an MR you often forget to switch back to the default branch locally. project-hub detects repos still sitting on stale feature branches and shows ahead/behind relative to the default branch — with a one-click checkout to clean up.

Events, not inbox. Stop reminding yourself to check your cluttered GitLab inbox. project-hub diffs state on every refresh cycle and surfaces what changed: new MR, pipeline failure, new vuln, auth expiry. Events live in a slide-in panel on the dashboard and persist across sessions until dismissed.

MCP-powered multi-repo agent. Everything visible in the dashboard is exposed as MCP tools. Claude Code sees your repos, MRs, pipelines, vulns, and events — and can act on them. Events surface as MCP notifications, making the agent proactive instead of reactive.

Features

  • Unified dashboard — git status, MRs, pipelines, vulns across all repos in one view
  • Merge request & pipeline views — cross-repo tables with filters (mine/all, failed only, current branches only)
  • Per-repo detail page — MRs, pipelines, active vulns for a single repo
  • Web UI (htmx) with real-time sync, sortable tables, persistent filters
  • Non-destructive pull — conflict detection via git merge-tree, no worktree mutations
  • Pin & reorder repos, drag-and-drop card layout
  • Bulk actions — pull all, unstale all in one click

Quick start

cd ~/Projects                    # parent dir containing your repos
uvx project-hub init             # creates .project-hub/
uvx project-hub auth login gitlab.com  # store your PAT
uvx project-hub                  # launch dashboard (opens browser)

Use as MCP server (Claude Code)

From PyPI:

claude mcp add --scope user project-hub -- uvx project-hub --mcp

From source (picks up local changes without cache issues):

claude mcp add --scope user project-hub -- \
  uv run --project /path/to/project-hub project-hub --mcp

Installing with --scope user is safe — the server adapts to the current directory:

Directory state Behavior
Has .project-hub/ Active — full tools + refresh
Parent has .project-hub/ Disabled — zero tools (sub-repo)
Has .no-project-hub Disabled — zero tools (opt-out)
Neither Dormant — only init tool
touch ~/some-project/.no-project-hub   # force disable in a specific dir

Then in Claude Code, the agent can call tools like list_repos, get_vulnerabilities, pull_safe, etc.

MCP tools

Tool Description
init Bootstrap .project-hub/ workspace
list_repos List discovered repos with forge info
repo_status Git status (branch, ahead/behind, dirty)
fetch_all Trigger full refresh cycle
pull_safe Pull with conflict detection
list_mrs Merge requests (substring repo filter)
list_pipelines Pipelines (substring repo filter)
get_vulnerabilities Vulns — defaults to high/critical + detected, includes solutions
get_pipeline_jobs Jobs for a specific pipeline
acknowledge_alerts Mark events as seen
auth_status Check forge authentication
auth_login Store PAT for a forge instance
configure_forge Configure forge host mapping

Web dashboard

Route Description
/ Dashboard with repo cards, pinning, drag-and-drop, events panel
/mrs Merge requests table (mine/all filter)
/pipelines Pipelines table (failed only, current branches only)
/vulns Vulnerabilities (severity, state, fixed-in-branch filters)
/repo/{name} Per-repo detail: MRs, pipelines, active vulns
/settings Exclude/include repos, rescan workspace

All filters and table sort are persisted in localStorage.

Architecture

Single Python process, dual interfaces: MCP (stdio) + HTTP (FastAPI/htmx). Background asyncio task refreshes git+forge data on a TTL cycle, diffs with SQLite cache to generate events.

project_hub/
  cli.py              # Click entry points
  core/
    workspace.py       # Orchestrator: discover -> refresh loop -> stop
    cache.py           # SQLite (WAL mode, aiosqlite)
    config.py          # YAML config with defaults
    discovery.py       # Scan for .git/ repos, classify forges
    models.py          # Dataclasses: Repo, MR, Pipeline, Vulnerability, Event
    events.py          # Diff old vs new state -> Event list
  gitlab/
    client.py          # python-gitlab + GraphQL (vulnerabilities)
    auth.py            # PAT resolution chain
  git/
    ops.py             # fetch, status, pull_safe (merge-tree conflict detection)
  mcp/
    server.py          # FastMCP tools + resources
  web/
    app.py             # FastAPI factory, routes, htmx fragments
    templates/         # Jinja2 templates
    static/            # CSS + vendored JS

Requirements

  • Python 3.10+
  • Git 2.38+ (for git merge-tree --write-tree)
  • GitLab PAT with read_api scope

Testing

uv run pytest tests/ -v

License

Unlicense — public domain.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

project_hub-0.7.0.tar.gz (325.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

project_hub-0.7.0-py3-none-any.whl (119.5 kB view details)

Uploaded Python 3

File details

Details for the file project_hub-0.7.0.tar.gz.

File metadata

  • Download URL: project_hub-0.7.0.tar.gz
  • Upload date:
  • Size: 325.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for project_hub-0.7.0.tar.gz
Algorithm Hash digest
SHA256 d96606f8c2e05943d70292a83d0f41f665d8442f1ebb5c60bf3f429187484c55
MD5 5406dfed745ea81cd32289e2d022dda1
BLAKE2b-256 8f076c5dfd623a2a231e10d4e08123956a0673443aa503bbdad8da25ac802621

See more details on using hashes here.

File details

Details for the file project_hub-0.7.0-py3-none-any.whl.

File metadata

  • Download URL: project_hub-0.7.0-py3-none-any.whl
  • Upload date:
  • Size: 119.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for project_hub-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1f10b5d8d45e7f03f5be917cbba6527d788210e0f417aeaca3f565aa6edebea8
MD5 e76c1cfe0865b0b9b7a4adb20a6f9798
BLAKE2b-256 5cbdacd78fa1a604a2573bc02f9ed9b62cf312e273b0d29811c2f8d0458ace2c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page