{"id":"6c8a8c83-8408-4658-9a7a-35797679ada5","slug":"contrib-virtual-workspaces","kind":"mcp","name":"contrib-virtual-workspaces","summary":"Contrib VirtualWorkspaces repo","owner":"kcp-dev","repoUrl":"https://github.com/kcp-dev/contrib-virtual-workspaces","license":"Apache-2.0","licenseTier":"permissive","trust":"community","stars":1,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-09-03T10:42:55.000Z","addedAt":"2026-10-21T21:49:04.015Z","logoUrl":"https://avatars.githubusercontent.com/u/76848170?v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["utilities"],"tags":[],"runtime":"go","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-26T09:16:23.531Z","sample":false,"url":"https://conduits.dev/tools/contrib-virtual-workspaces","language":"Go","transports":["stdio"],"install":{},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# contrib-virtual-workspaces\n\nContrib virtual workspaces for [kcp](https://github.com/kcp-dev/kcp).\n\n| Component | What it serves | Image |\n|---|---|---|\n| [access/](access/) | **SelfClusterAccessReview** — \"which workspaces can this user access?\" in one call | `ghcr.io/kcp-dev/contrib-virtual-workspaces/access-vw` |\n| [mcp/](mcp/) | [Model Context Protocol](https://modelcontextprotocol.io) as a virtual workspace, scoped to what the caller can see (uses the access VW) | `ghcr.io/kcp-dev/contrib-virtual-workspaces/mcp-vw` |\n| [ephemeral/](ephemeral/) | Non-persisted resources: `POST` in, a provider webhook answers, nothing reaches etcd | `ghcr.io/kcp-dev/contrib-virtual-workspaces/ephemeral-vw` |\n| [tenancy/](tenancy/) | Tenants, projects and memberships as kcp workspaces and RBAC, plus **SelfTenancyReview** — \"which tenants am I in?\" — and the `tenancyctl` client | `ghcr.io/kcp-dev/contrib-virtual-workspaces/tenancy-vw` |\n\nEach component's README documents its design, deployment and limits.\n\n## Layout\n\n- One `go.mod` at the root. The kcp Kubernetes fork replace block lives here\n  once, and `hack/verify-fork-pin.sh` checks it against\n  virtual-workspace-framework's.\n- One `Dockerfile` with a shared builder stage and one final stage per\n  component; images are selected with `--target access-vw|mcp-vw|ephemeral-vw|tenancy-vw`.\n- The root `Makefile` owns building, testing and verification\n  (`make build`, `make test`, `make verify`, `make images`,\n  `make test-e2e-<component>`). Component Makefiles keep only the local\n  development targets that need to run next to their manifests.\n- CI runs one verify job, one build/test job, and one e2e job per component\n  (`.github/workflows/ci.yaml`); images build as a matrix over the\n  Dockerfile targets (`.github/workflows/images.yaml`).\n\n## Building\n\n```sh\nmake build              # all binaries into bin/\nmake build-access       # or per component\nmake images             # all three container images\nmake image-mcp          # or per component\n```\n\n## Testing\n\nAn identity provider is shared by every component: [hack/dex/](hack/dex/)\nruns Dex and writes the `AuthenticationConfiguration` that kcp and the\nvirtual workspaces both consume, so a username cannot drift between them.\nThe tenancy e2e uses it by default (`DEX=false` falls back to client\ncertificates where docker is unavailable).\n\n```sh\nmake test               # unit tests\nmake verify             # gofmt, vet, fork pin, manifest rendering, tidy -diff\nmake test-e2e-access    # kind + kcp-operator\nmake test-e2e-mcp       # kind + kcp-operator + both VWs from this checkout\nmake test-e2e-ephemeral # local processes against a real kcp\nmake test-e2e-tenancy   # local processes against a real kcp\n```\n\n## History\n\nThis repository merges three formerly separate repositories, imported with\nfull history:\n\n- [contrib-access-virtual-workspace](https://github.com/kcp-dev/contrib-access-virtual-workspace) → `access/`\n- [contrib-mcp-virtual-workspace](https://github.com/kcp-dev/contrib-mcp-virtual-workspace) → `mcp/`\n- [contrib-virtual-ephemeral-resources-virtual-workspace](https://github.com/kcp-dev/contrib-virtual-ephemeral-resources-virtual-workspace) → `ephemeral/`\n"}