GitHub Actions: Automatisierte Veröffentlichungen
GitHub Actions: Automatisierte Veröffentlichungen
Richten Sie mit GitHub Actions einen automatisierten Veröffentlichungs‑Workflow für MCP‑Server ein.
Lernziele
Nach diesem Tutorial verfügen Sie über:
- Einen GitHub‑Actions‑Workflow zur automatischen Server‑Veröffentlichung
- Verständnis von GitHub‑OIDC‑Authentifizierung
- Best‑Practices für automatisierte Veröffentlichungen
- Funktionierende Beispiele für Node.js‑, Python‑ und Docker‑Projekte
Voraussetzungen
- Kenntnis der allgemeinen Veröffentlichungsanforderungen (Paketvalidierung; siehe Veröffentlichungshandbuch)
- Ein GitHub‑Repository mit Ihrem MCP‑Server‑Code
GitHub‑Actions einrichten
Schritt 1: Workflow‑Datei anlegen
Erstellen Sie .github/workflows/publish-mcp.yml
. Nachfolgend ein Beispiel für ein NPM‑Paket; die Schritte für die MCP‑Registry sind für alle Pakettypen identisch:
name: Publish to MCP Registry
on:
push:
tags: ["v*"] # Bei Version-Tags (z. B. v1.0.0) auslösen
jobs:
publish:
runs-on: ubuntu-latest
permissions:
id-token: write # Für OIDC-Authentifizierung erforderlich
contents: read
steps:
- name: Checkout code
uses: actions/checkout@v5
- name: Setup Node.js # Je nach Sprache/Stack anpassen
uses: actions/setup-node@v5
with:
node-version: "lts/*"
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm run test --if-present
- name: Build package
run: npm run build --if-present
- name: Publish to npm
run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Install MCP Publisher
run: |
curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v1.0.0/mcp-publisher_1.0.0_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
- name: Login to MCP Registry
run: ./mcp-publisher login github-oidc
- name: Publish to MCP Registry
run: ./mcp-publisher publish
Schritt 2: Secrets konfigurieren
Für Veröffentlichungen zur MCP‑Registry per GitHub‑OIDC sind keine Secrets erforderlich.
Für Ihre Paket‑Registry benötigen Sie ggf. Secrets. Im obigen Workflow z. B. ein NPM_TOKEN
(unter Einstellungen → Secrets und Variablen → Actions hinzufügen).
Schritt 3: Taggen und veröffentlichen
Erstellen Sie ein Version‑Tag, um den Workflow zu triggern:
git tag v1.0.0
git push origin v1.0.0
Der Workflow führt Tests aus, baut Ihr Paket, veröffentlicht zu npm und veröffentlicht zur MCP‑Registry.
Authentifizierungsmethoden
GitHub Actions OIDC (empfohlen)
- name: Login to MCP Registry
run: mcp-publisher login github-oidc
Diese Methode wird empfohlen, weil sie:
- Keine geheimen Schlüssel speichern
- Integrierte GitHub‑Authentifizierung nutzen
- Automatischer Zugriff auf Ihren GitHub‑Namensraum
GitHub Personal Access Token
- name: Login to MCP Registry
run: mcp-publisher login github --token ${{ secrets.GITHUB_TOKEN }}
env:
GITHUB_TOKEN: ${{ secrets.MCP_GITHUB_TOKEN }}
Fügen Sie ein GitHub‑PAT mit Repo‑Zugriff als Secret MCP_GITHUB_TOKEN
hinzu.
DNS‑Authentifizierung
Für Domain‑Namensräume (com.yourcompany/*
):
- name: Login to MCP Registry
run: |
echo "${{ secrets.MCP_PRIVATE_KEY }}" > key.pem
mcp-publisher login dns --domain yourcompany.com --private-key-file key.pem
Fügen Sie Ihren Ed25519‑Private‑Key als Secret MCP_PRIVATE_KEY
hinzu.
Beispiele für mehrere Sprachen
Node.js/NPM‑Projekt
name: Publish NPM MCP Server
on:
push:
tags: ["v*"]
jobs:
publish:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: "lts/*"
registry-url: "https://registry.npmjs.org"
- run: npm ci
- run: npm test
- run: npm run build --if-present
- name: Publish to NPM
run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Install MCP Publisher
run: |
curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v1.0.0/mcp-publisher_1.0.0_linux_amd64.tar.gz" | tar xz mcp-publisher
- name: Publish to MCP Registry
run: |
./mcp-publisher login github-oidc
./mcp-publisher publish
Python/PyPI‑Projekt
name: Publish Python MCP Server
on:
push:
tags: ["v*"]
jobs:
publish:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install build twine
- name: Build package
run: python -m build
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.PYPI_API_TOKEN }}
- name: Install MCP Publisher
run: |
curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v1.0.0/mcp-publisher_1.0.0_linux_amd64.tar.gz" | tar xz mcp-publisher
- name: Publish to MCP Registry
run: |
./mcp-publisher login github-oidc
./mcp-publisher publish
Docker/OCI‑Projekt
name: Publish Docker MCP Server
on:
push:
tags: ["v*"]
jobs:
publish:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
packages: write
steps:
- uses: actions/checkout@v5
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: |
${{ steps.meta.outputs.labels }}
io.modelcontextprotocol.server.name=io.github.${{ github.repository_owner }}/my-server
- name: Install MCP Publisher
run: |
curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v1.0.0/mcp-publisher_1.0.0_linux_amd64.tar.gz" | tar xz mcp-publisher
- name: Publish to MCP Registry
run: |
./mcp-publisher login github-oidc
./mcp-publisher publish
NuGet/.NET‑Projekt
name: Publish NuGet MCP Server
on:
push:
tags: ["v*"]
jobs:
publish:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v5
- uses: actions/setup-dotnet@v4
with:
dotnet-version: "8.0.x"
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --configuration Release --no-restore
- name: Test
run: dotnet test --no-restore --verbosity normal
- name: Pack
run: dotnet pack --configuration Release --no-build --output ./artifacts
- name: Publish to NuGet
run: dotnet nuget push ./artifacts/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json
- name: Install MCP Publisher
run: |
curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v1.0.0/mcp-publisher_1.0.0_linux_amd64.tar.gz" | tar xz mcp-publisher
- name: Publish to MCP Registry
run: |
./mcp-publisher login github-oidc
./mcp-publisher publish
Tipps zur Versionssynchronisierung
Mit den folgenden Methoden halten Sie Paketversion und server.json
automatisch synchron:
- name: Update server.json version
run: |
VERSION=${GITHUB_REF#refs/tags/v}
jq --arg v "$VERSION" '.version = $v' server.json > tmp && mv tmp server.json
Erweiterte Konfiguration
Bedingte Veröffentlichung
Nur unter bestimmten Bedingungen zur Registry veröffentlichen:
- name: Publish to MCP Registry
if: startsWith(github.ref, 'refs/tags/v') && !contains(github.ref, '-')
run: |
./mcp-publisher login github-oidc
./mcp-publisher publish
Veröffentlichung für mehrere Umgebungen
Für unterschiedliche Umgebungen unterschiedliche Konfiguration verwenden:
- name: Publish to MCP Registry
run: |
./mcp-publisher login github-oidc
if [[ "${{ github.ref }}" == *"-alpha"* ]]; then
./mcp-publisher publish --file=server-alpha.json
else
./mcp-publisher publish
fi
Fehlermeldungen/Benachrichtigungen
Benachrichtigung bei Fehlschlägen hinzufügen:
- name: Notify on failure
if: failure()
uses: actions/github-script@v7
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '❌ Veröffentlichung zur MCP Registry fehlgeschlagen. Bitte prüfen Sie die Actions‑Logs.'
})
Best Practices
1. Release‑Tags verwenden
# Nur auf Release‑Tags triggern
on:
push:
tags: ["v*"]
2. Nach Validierung veröffentlichen
- name: Validate before publish
run: |
./mcp-publisher publish --dry-run
3. Abhängigkeiten cachen
- name: Cache dependencies
uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
4. Matrix‑Builds
Für mehrere Versionen testen:
strategy:
matrix:
node-version: [18, 20, 22]
Fehlerbehebung
“Authentication failed” (Authentifizierung fehlgeschlagen)
- Stellen Sie
id-token: write
für OIDC ein - Secret‑Konfiguration prüfen
“Package validation failed” (Paketvalidierung fehlgeschlagen)
- Stellen Sie sicher, dass Ihr Paket zunächst erfolgreich in Ihrem Registry (NPM, PyPI usw.) veröffentlicht wurde
- Stellen Sie sicher, dass Sie die erforderlichen Prüfschritte im Veröffentlichungstutorial abgeschlossen haben
“Version mismatch” (Versionskonflikt)
- Stellen Sie sicher, dass die Version in
server.json
der Paketversion entspricht - Versions‑Sync‑Skript verwenden
“Rate limiting” (Ratenbegrenzung)
- Schnell aufeinanderfolgende Releases vermeiden
- Geeignete Retry‑Logik implementieren
Praxisbeispiele
Sehen Sie sich diese realen Workflows für automatisierte Veröffentlichungen an: