This document explains how to configure the GitHub infrastructure for the Windows MCP Server release pipeline.
The release workflow (.github/workflows/release-unified.yml) is a unified workflow that builds and publishes all Windows MCP Server components (standalone binaries and VS Code extension) with a single version number.
LLM integration tests are intentionally manual-only. They are never invoked by PR, CI, or release workflows; run them separately through the dedicated LLM Integration Tests workflow when needed.
The release workflow requires the GitHub Secrets configuration for VS Code Marketplace publishing described below.
┌─────────────────────┐ Manual Trigger ┌─────────────────────┐
│ GitHub Actions │ ──(workflow_dispatch)│ Release Workflow │
│ (windows-latest) │ │ (unified) │
└─────────────────────┘ └─────────────────────┘
│ │
│ Version Calculation │
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ Build Standalone │ │ Build VS Code Ext │
│ (x64, ARM64) │ │ (VSIX + Publish) │
└─────────────────────┘ └─────────────────────┘
│ │
│ │
└────────────────┬───────────────────────────┘
│
▼
┌─────────────────────┐
│ Create Git Tag │
│ (v1.2.3) │
└─────────────────────┘
│
▼
┌─────────────────────┐
│ GitHub Release │
│ (with artifacts) │
└─────────────────────┘
Go to your GitHub repository → Settings → Secrets and variables → Actions.
| Secret Name | Value | Description |
|---|---|---|
VSCE_TOKEN |
xxxxxxxx... |
VS Code Marketplace Personal Access Token (required for publishing) |
- Go to Azure DevOps
- Click your profile → Personal Access Tokens
- Create new token:
- Name:
vsce-mcp-windows - Organization: All accessible organizations
- Scopes: Marketplace → Manage
- Name:
- Copy the token (shown only once!)
LLM tests run against GPT-5.5 via GitHub Copilot. They are intentionally isolated from releases and all automatic workflows. To run them, open GitHub Actions, select LLM Integration Tests, choose Run workflow, and optionally specify one scenario. The model is configured in tests/Sbroenne.WindowsMcp.LLM.Tests/conftest.py.
The new release process uses a unified workflow that is triggered manually via workflow_dispatch:
- Go to GitHub Actions → "Release All Components"
- Click "Run workflow"
- Select version bump type:
- patch: 1.2.3 → 1.2.4 (bug fixes)
- minor: 1.2.3 → 1.3.0 (new features)
- major: 1.2.3 → 2.0.0 (breaking changes)
- Or enter a custom version (e.g., "1.5.0")
- Click "Run workflow"
The workflow will:
- Calculate the next version from the latest
v*tag - Build standalone binaries (win-x64, win-arm64)
- Build VS Code extension (VSIX)
- Create and push the git tag (e.g.,
v1.2.4) - Publish to VS Code Marketplace
- Create GitHub release with all artifacts
To test the workflow without publishing:
- Go to GitHub Actions → "Release All Components"
- Run with a custom version like "0.0.0-test"
- The workflow will build everything but create a test tag
- You can then manually delete the test tag and release:
git tag -d v0.0.0-test git push origin :refs/tags/v0.0.0-test gh release delete v0.0.0-test --yes
After setup, verify the configuration:
Only needed if you want to run LLM tests locally:
# Authenticate with GitHub (Copilot access required)
gh auth login
# or set a token directly:
$env:GITHUB_TOKEN = "<your-copilot-enabled-token>"
# Run a quick test
cd tests/Sbroenne.WindowsMcp.LLM.Tests
uv run pytest -vFor local runs, confirm gh auth status succeeds or that GITHUB_TOKEN is set to a Copilot-enabled token. For GitHub-hosted runs, use the dedicated manual LLM Integration Tests workflow.
GitHub Actions windows-latest runners have a desktop session by default. If tests fail with GUI errors:
- Ensure tests don't require interactive user input
- Check that target applications (Notepad, Paint, etc.) are available on the runner
- No secrets in code — All credentials are in GitHub Secrets
- Manual approval — Releases are triggered manually via workflow_dispatch, not automatically on push
- Test isolation — LLM tests can only be started through their dedicated workflow_dispatch trigger
If you were using the old tag-based release workflows (release.yml, release-mcp-server.yml, release-vscode-extension.yml), you need to:
-
Clean up old tags: The old process created separate tags for MCP server (
mcp-v*) and VS Code extension (vscode-v*). The new unified process uses onlyv*tags.Run the cleanup script to remove old tags:
# Dry run first to see what will be deleted .\.github\scripts\cleanup-old-tags.ps1 -DryRun # Actually delete the tags .\.github\scripts\cleanup-old-tags.ps1
This will delete:
- All
mcp-v*tags (e.g.,mcp-v1.1.0,mcp-v1.2.0) - All
vscode-v*tags (e.g.,vscode-v1.1.0,vscode-v1.2.0) - Keep all
v*tags (e.g.,v1.3.6)
- All
-
Remove old workflows: Delete the old workflow files:
git rm .github/workflows/release.yml git rm .github/workflows/release-mcp-server.yml git rm .github/workflows/release-vscode-extension.yml
-
Use the new workflow: Going forward, use "Release All Components" workflow from the Actions tab. It will automatically calculate the next version from the latest
v*tag.
The old process had several issues:
- Version inconsistency: Separate tags (
v*,mcp-v*,vscode-v*) could get out of sync - Complex: Three separate workflows with duplicated logic
- Error-prone: Manual tag creation required, easy to make mistakes
- Inefficient: Required multiple releases to publish both components
The new unified workflow:
- ✅ Single version for all components
- ✅ Automatic versioning with semantic version bumps
- ✅ Single workflow for all release steps
- ✅ Manual trigger with clear version bump options
- ✅ Consistent with mcp-server-excel for easier maintenance
- Publishing VS Code Extensions
- pytest-skill-engineering — LLM testing framework