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.

Features

  • Unified view of git status, merge requests, pipelines, and vulnerabilities across all repos
  • MCP server (stdio) for Claude Code integration — ask "fix all vulns" and the agent has everything it needs
  • Web dashboard (htmx) with real-time sync, sortable tables, persistent filters, event notifications
  • Smart defaults — MCP returns only actionable vulns (high/critical + detected) with scanner solutions
  • Non-destructive — conflict detection via git merge-tree, no worktree mutations
  • Background refresh — async TTL-based cycle, diffs against SQLite cache to generate events

Quick start

# Install
uvx project-hub --help

# Or from source
uv sync
uv run project-hub --help

Bootstrap a workspace

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

Use as MCP server (Claude Code)

claude mcp add project-hub -- uvx project-hub --mcp

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, events panel
/mrs Merge requests table (mine/all filter)
/pipelines Pipelines table (failed only filter)
/vulns Vulnerabilities table (severity + state filters)
/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.1.0.tar.gz (193.3 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.1.0-py3-none-any.whl (101.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: project_hub-0.1.0.tar.gz
  • Upload date:
  • Size: 193.3 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.1.0.tar.gz
Algorithm Hash digest
SHA256 06703037de33712444c927423e9ba5a36a3c9ba6843e9b2a8073822b7b4942d7
MD5 c3250777dbd160c1687505598e03abfd
BLAKE2b-256 984b1cd319c5444fb6fe21b002b2de977d701f7f2c57c9bd10072497f30d5ed0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: project_hub-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 101.2 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.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0b11f07613baf3c69ed7cf6c86c5acb1a57692809f11a893cbb09f6ecb2b3d33
MD5 bb5bb07c4e3042b731e7c3153fe5c7c6
BLAKE2b-256 08e21442be5fb4bee3b75b32afeee4c79b9f2ffc6bdf0e857a2299e7010d7220

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