CI dashboard for Claude Code — MCP server, web GUI, TUI for managing Forgejo workflows
- Python 100%
Update FORGEJO_URL default and MCP setup examples to use public Forgejo URL, with LAN as fallback note. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| .gitignore | ||
| dashboard.py | ||
| forgejo_api.py | ||
| mcp_server.py | ||
| README.md | ||
| state.py | ||
| web.py | ||
Claude CI Dashboard
CI dashboard for managing Claude Code workflows on Forgejo. Three interfaces: MCP server, web GUI, and TUI.
Components
| File | Description |
|---|---|
mcp_server.py |
FastMCP server — tools for Claude Code to manage issues, runs, PRs |
web.py |
Flask web GUI — kanban board with issue management |
dashboard.py |
Textual TUI — terminal dashboard |
forgejo_api.py |
Forgejo API client (urllib, no deps) |
state.py |
State machine: new -> clarifying -> planning -> implementing -> reviewing -> merged |
Setup
pip install flask fastmcp textual rich
Environment Variables
| Variable | Default | Description |
|---|---|---|
FORGEJO_URL |
https://silo.retromonkey.com.au |
Forgejo instance URL (LAN fallback: http://192.168.0.33:3200) |
FORGEJO_TOKEN |
Forgejo API token | |
FORGEJO_REPO |
aaron/claude-ci-demo |
Target repo (owner/repo) |
MCP Server Setup
Add to Claude Code (user scope)
claude mcp add claude-ci -s user -- python3 /path/to/claude_ci_mcp.py \
-e FORGEJO_URL=https://silo.retromonkey.com.au \
-e FORGEJO_TOKEN=<your-token> \
-e FORGEJO_REPO=aaron/claude-ci-demo
Available Scopes
| Scope | Flag | Persist across projects? | Use case |
|---|---|---|---|
local |
-s local (default) |
No | One-off testing |
user |
-s user |
Yes | Personal setup, all projects |
project |
-s project |
Per project (.mcp.json) | Team-shared config |
Managing MCP Servers
# List all servers (with health check)
claude mcp list
# Get details for one server
claude mcp get claude-ci
# Remove a server
claude mcp remove -s user claude-ci
# Reset all project-scoped approvals
claude mcp reset-project-choices
# Add SSE server (e.g. searchmcp)
claude mcp add searchmcp -s user --transport sse --url http://192.168.0.33:8013/sse
Blocking Unwanted Servers
Add to ~/.claude/settings.json:
{
"deniedMcpServers": ["unwanted-server-name"]
}
Note: Some servers may be injected by the API provider (e.g. Z.ai) and cannot be blocked this way.
MCP Tools
The server exposes the following tools to Claude Code:
| Tool | Description |
|---|---|
ci_dashboard |
Full CI dashboard summary: issues, runs, runner status |
ci_create_issue |
Create a new issue (title, body) |
ci_get_issue |
Get issue details including comments |
ci_list_issues |
List issues with state labels (open/closed/all) |
ci_reply |
Comment on an issue |
ci_approve |
Approve an issue — adds approved comment, sets awaiting-approval label |
ci_list_runs |
List recent workflow runs |
ci_runner_status |
Check runner health and status |
ci_list_pulls |
List pull requests (open/closed/all) |
ci_get_pull |
Get pull request details |
Running
Web GUI (port 8100)
python web.py --port 8100
MCP Server
python mcp_server.py
TUI
python dashboard.py --refresh 10
CI State Machine
NEW → CLARIFYING → PLANNING → IMPLEMENTING → REVIEWING → MERGED
Issues flow through states via labels:
awaiting-clarification→ clarifyingawaiting-approval→ planningawaiting-review→ reviewing
Web GUI Features
- Kanban board with columns per state
- Issue detail panel with comments
- Create/reply/approve actions
- Workflow runs sidebar with status
- State machine visualization
- Runner health indicator
- Auto-refresh every 30s
- Keyboard shortcuts:
Rrefresh,Nnew issue,Escclose