A lightweight, Azure-hosted Trusted MCP Registry for VS Code on Windows 11 and GitHub Enterprise Cloud. Built as a teaching example by Tim Warner.
Phase 1 MVP — a policy plane for MCP, not a runtime. JSON over HTTPS, an allowlist file in Git, a PowerShell sync script that materializes
.vscode/mcp.json. Cost target: ~$0/month on SWA Free tier.
This is a metadata + governance control plane, not a runtime. The registry
publishes JSON manifests over HTTPS; an allowlist file (PR-reviewed, Git-tracked)
declares which servers are trusted; a PowerShell sync script materializes
.vscode/mcp.json from the registry, filtered by policy.
Honest disclosure. VS Code MCP clients read
mcp.json(workspace or user scope), not a remote registry URL. The bridge isscripts/Sync-McpClient.ps1. Running that script is the governance demo on camera.
trusted-mcp-registry/
├── registry/
│ ├── index.json # manifest of manifests
│ ├── allowlist.json # allowed + blocked server IDs
│ └── servers/ # one manifest per MCP server
├── schemas/ # JSON Schema (Draft 2020-12)
├── scripts/
│ ├── validate-registry.ps1 # CI gate
│ └── Sync-McpClient.ps1 # registry → .vscode/mcp.json bridge
├── staticwebapp.config.json # SWA routes, CORS, MIME
├── infra/main.bicep # SWA resource as IaC
├── .github/workflows/ # validate.yml, deploy.yml
└── docs/ # PRD, architecture, teaching guide
pwsh ./scripts/validate-registry.ps1 -Strictnpx @azure/static-web-apps-cli start ./
# then in another terminal
Invoke-RestMethod http://localhost:4280/registry/index.json./scripts/Sync-McpClient.ps1 -RegistryUrl http://localhost:4280Open the workspace in VS Code on Windows 11. The MCP client picks up
.vscode/mcp.json. Servers in blockedServers are excluded; servers not in
allowedServers are excluded.
# 1. Provision the SWA (Free tier, ~$0/month)
az group create -n rg-trusted-mcp-registry -l eastus2
az deployment group create -g rg-trusted-mcp-registry -f infra/main.bicep
# 2. Capture the deployment token and store it as a repo Action secret
$swa = (az deployment group show -g rg-trusted-mcp-registry -n main --query properties.outputs.staticWebAppName.value -o tsv)
$token = az staticwebapp secrets list -n $swa -g rg-trusted-mcp-registry --query properties.apiKey -o tsv
gh secret set AZURE_STATIC_WEB_APPS_API_TOKEN -R timothywarner-org/trusted-mcp-registry --body $token
# 3. Push to main — validate.yml + deploy.yml take it from here
git pushAfter the deploy job goes green, point the camera at:
$host = (az staticwebapp show -n $swa -g rg-trusted-mcp-registry --query defaultHostname -o tsv)
Invoke-RestMethod "https://$host/registry/index.json"See docs/trusted_mcp_registry_prd_tim_warner.md
for the PRD, docs/architecture.md for the design,
and docs/teaching-guide.md for the demo runbook.
MIT. See LICENSE.