Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 52 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ A web UI for browsing, configuring, and deploying [MCP](https://modelcontextprot
- ⚙️ **Configure** — Fill in environment variables, arguments, file mounts, and ServiceAccount via web form
- 👁️ **Live YAML Preview** — See the `MCPServer` CR update in real-time as you type (htmx)
- ▶️ **Deploy** — Create `MCPServer` custom resources, Secrets, and ConfigMaps with one click
- 🚀 **One-Click Deploy** — Catalog entries with a `crTemplate` get a "Deploy" button directly on the card, skipping the configuration form
- 🔒 **Root Override** — UI checkbox to set `runAsNonRoot: false` for images that require root (e.g. Insights, Satellite)
- 🌐 **Gateway Integration** — Automatically creates `HTTPRoute` resources for deployed MCPServer instances via a configurable Gateway API gateway
- 🗑️ **Cleanup** — Delete running servers and all managed artifacts

## 📦 Catalog Format
Expand All @@ -30,12 +33,30 @@ Catalog entries are Kubernetes ConfigMaps with the label `mcp.x-k8s.io/catalog-e
}],
"_meta": {
"io.openshift/k8s": {
"defaultPort": 8080
"defaultPort": 8080,
"runAsRoot": false,
"needsServiceAccount": true,
"serviceAccountHint": "Needs a ServiceAccount bound to the 'view' ClusterRole",
"configMaps": [{
"label": "Server Config",
"defaultContent": "key = \"value\"\n",
"fileName": "config.toml",
"mountPath": "/etc/mcp-config"
}],
"crTemplate": {
"source": {
"type": "ContainerImage",
"containerImage": { "ref": "quay.io/example/my-mcp-server:latest" }
},
"config": { "port": 8080, "path": "/mcp" }
}
}
}
}
```

When `crTemplate` is present, the catalog card shows a one-click "Deploy" button that creates the `MCPServer` CR directly, skipping the configuration form.

Kubernetes-specific extensions live under `_meta` → `io.openshift/k8s` per the standard's publisher metadata mechanism.

## 🛠️ Quick Start
Expand Down Expand Up @@ -81,27 +102,45 @@ make test # Run tests
### Container Image

```bash
make docker-build # Build with podman (ubi9/go-toolset + ubi9-micro)
make docker-push # Push to quay.io/matzew/mcp-launcher:latest
make image-build # Build container image with podman (ubi9/go-toolset + ubi9-micro)
make image-push # Push to quay.io/matzew/mcp-launcher:latest
make image # Build and push in one step
```

### Cluster Operations

```bash
make install # Apply dist/mcp-launcher.yaml (single-file install)
make uninstall # Remove everything installed by dist/mcp-launcher.yaml
make deploy # Deploy RBAC, launcher, and catalog to cluster
make undeploy # Remove launcher and catalog from cluster
make rollout # Restart the launcher deployment and wait for readiness
make release # Build, push, deploy, and rollout (full release cycle)
make dist # Regenerate dist/mcp-launcher.yaml from deploy/ manifests
```

## 📁 Project Structure

```
├── main.go # HTTP server, routes, kubeconfig
├── main.go # HTTP server, routes, kubeconfig
├── catalog/
│ ├── types.go # MCP Registry-aligned structs
│ └── catalog.go # ConfigMap-backed catalog store
│ ├── types.go # MCP Registry-aligned structs
│ ├── types_test.go
│ ├── catalog.go # ConfigMap-backed catalog store
│ └── catalog_test.go
├── handlers/
│ └── handlers.go # HTTP handlers (catalog, configure, run, delete)
├── templates/ # Go HTML templates (htmx)
│ ├── handlers.go # HTTP handlers (catalog, configure, deploy, delete, gateway)
│ └── handlers_test.go
├── templates/ # Go HTML templates (htmx)
│ └── partials/ # htmx partial fragments
├── deploy/
│ ├── catalog/ # Sample catalog ConfigMaps (5 servers)
│ ├── deployment.yaml # Deployment + Service
│ └── rbac/ # ServiceAccount, ClusterRole, ClusterRoleBinding
│ ├── catalog/ # Sample catalog ConfigMaps (5 servers)
│ ├── deployment.yaml # Deployment + Service
│ └── rbac/ # ServiceAccount, ClusterRole, ClusterRoleBinding
├── dist/
│ └── mcp-launcher.yaml # Single-file install (all resources)
├── Dockerfile # Multi-stage: ubi9/go-toolset → ubi9-micro
│ └── mcp-launcher.yaml # Single-file install (all resources)
├── docs/ # Architecture and design documentation
├── Dockerfile # Multi-stage: ubi9/go-toolset → ubi9-micro
└── Makefile
```

Expand Down
Loading