Wer Agent Plugins im Team verteilen will, braucht einen Marketplace – im einfachsten Fall ein Git-Repository mit einer Katalogdatei. Bei GitHub und GitLab funktioniert das reibungslos. Wer seine Repositories aber auf einem Azure DevOps Server (oder in Azure DevOps Services) hostet, läuft in eine Falle, die auf den ersten Blick völlig unverständlich ist: Die Marketplace-URL wird schlicht nicht akzeptiert. Wir sind beim Verteilen unserer LaTeX-Schreibstube selbst hineingelaufen und fanden die Lösung nirgends dokumentiert — hier der vollständige Befund.
Das Problem: eine Heuristik trifft auf ein URL-Schema von 2013
Claude Code entscheidet am .git-Suffix einer URL, ob es sich um ein Git-Repository oder einen HTTP-Endpunkt handelt. Azure-DevOps-URLs haben aber nie ein .git-Suffix – sie folgen dem Schema:
https://server/DefaultCollection/Projekt/_git/repo
ssh://git@server:22/DefaultCollection/Projekt/_git/repo
Ohne Suffix behandelt Claude Code die Adresse als HTTP-Endpunkt und scheitert. Hängt man .git einfach an, lehnt der DevOps Server ab, weil er repo.git als wörtlichen Repository-Namen interpretiert. Eine Sackgasse in beide Richtungen:
flowchart LR
U["Marketplace-URL"] --> H{"endet auf<br/>.git?"}
H -->|nein| E1["als HTTP-Endpunkt<br/>behandelt → Fehler"]
H -->|"ja<br/>(angehängt)"| E2["DevOps sucht Repo<br/>namens repo.git → Fehler"]
H -->|"ja + Rewrite"| OK["git clone läuft →<br/>Marketplace funktioniert"]
style OK stroke:#cc171a,stroke-width:2.5px
Die Pointe für Versionsverwaltungs-Veteranen: Das _git-Pfadsegment stammt aus der Zeit, als Microsoft Git in den damaligen Team Foundation Server nachrüstete – es unterscheidet seit 2013 Git-Repositories von TFVC-Pfaden. Eine zwanzig Jahre alte Architekturlinie kollidiert mit einer Heuristik von 2026. Das zugehörige Issue im Claude-Code-Tracker wurde geschlossen, ohne dass ein Fix erkennbar wäre; GitLab-URLs erhielten Unterstützung, Azure DevOps bislang nicht.
Die Auswege im Vergleich
Wir haben die Optionen durchgespielt – je nach Setup ist eine andere die richtige:
| Weg | Idee | Geeignet wenn |
|---|---|---|
| Lokaler Clone | Repo clonen, Pfad als Marketplace registrieren | Einzelmaschine, maximale Robustheit |
| Command-Quelle | Skript macht git pull und liefert den Pfad |
wie oben, plus eingebautes Auto-Update |
| Archive-Quelle | Zip per HTTPS, z. B. als Pipeline-Artefakt | Team-Verteilung ohne Git-Zugriff der Clients |
| Spiegel-Repo | GitHub/Gitea als Verteilspiegel | externe Erreichbarkeit gewünscht |
| HTTP-Rewrite am Reverse Proxy | Proxy übersetzt eine gewöhnliche .git-URL aufs _git-Schema |
HTTPS-Git aktiv, Proxy vorhanden |
insteadOf-Rewrite |
Git schreibt die URL clientseitig um | SSH-only-Server |
Der Reverse-Proxy-Weg verdient eine Anmerkung: Gits Smart-HTTP-Protokoll ist rein pfadbasiert, deshalb genügt tatsächlich eine Rewrite-Regel. Bei SSH funktioniert das nicht – dort reist der Repository-Pfad verschlüsselt im SSH-Kanal, ein Proxy kann ihn nicht umschreiben. Das ist kein Mangel, sondern der Sinn von Ende-zu-Ende-Verschlüsselung.
Unsere Lösung: der insteadOf-Einzeiler
Unser DevOps Server ist bewusst nur per SSH erreichbar – reine Schlüssel-Authentifizierung ist eine kleinere Angriffsfläche als ein HTTPS-Endpunkt mit Token-Verwaltung, und diese Härtung wollten wir nicht für eine URL-Heuristik aufweichen. Für SSH gibt es einen Weg, der den Server komplett unangetastet lässt: Gits eingebauter URL-Rewrite.
git config --global \
url."ssh://git@devops.intern:22/DefaultCollection/Projekt/_git/agent-extensions".insteadOf \
"ssh://git@devops.intern/agent-extensions.git"
Claude Code bekommt die gewöhnliche .git-URL und ist zufrieden; Git schreibt sie vor dem Verbindungsaufbau auf die echte Adresse um. Kein zusätzlicher Dienst, kein Token, eine Zeile Konfiguration auf der Maschine, auf der Claude Code läuft. Zwei Dinge sollte man wissen: Der Platzhalter wird als Präfix verglichen – er muss spezifisch genug sein, um genau dieses Repository zu meinen. Und pro Repository braucht es einen eigenen Eintrag.
Der Lackmustest ist erfreulich simpel und braucht Claude Code gar nicht: Läuft git clone <gewöhnliche-URL> im Terminal durch, läuft auch der Marketplace – denn Claude Code ruft für die Quelle schlicht Git auf.
Einordnung
Nichts davon ist schön, alles davon ist pragmatisch. Wir haben uns für den Rewrite entschieden und halten den lokalen Clone als Fallback bereit – und sobald die Heuristik upstream repariert ist, fliegt der Einzeiler ersatzlos raus, ohne dass sich am Repository etwas ändert. Bis dahin gilt: Die Investition in Plugins, Skills und MCP-Server bleibt davon unberührt – das Format ist unabhängig vom Verteilweg.
Sie planen eine eigene Toolchain-Verteilung im Unternehmen – mit eigenem Git-Server, eigenen Richtlinien? Auf unserer Seite MCP-Integrationen für Unternehmen zeigen wir, wie wir Werkzeugketten sicher und wartbar aufsetzen.