[Bug] Azure-hosted plugins fail in marketplace with HTTP/SSH and `.git` extension requirements
Open 💬 22 comments Opened Dec 18, 2025 by Arigatouz
Bug Description
I have a problem and I don’t know how to fix it. Every time I create a plugin on GitHub and add it to the marketplace, it works fine. But if I host it on Azure, it doesn’t work.
First, it can’t be accessed through HTTP; it must use SSH, and the bash command is disabled in the plugin marketplace.
Second, it requires the end of the link to have .git, and this is not the Azure convention.
Now what should I do?
Environment Info
- Platform: darwin
- Terminal: webstorm
- Version: 2.0.72
- Feedback ID: 28214775-da89-4e69-affc-fd3dc03b7470
Errors
│ • https://example.com/marketplace.json │
│ • ./path/to/marketplace │
│ │
│ git@ssh.dev.azure.com:v3/^^^^^^^ │
│ │
│ Invalid marketplace config: [ │
│ { │
│ "code": "invalid_string", │
│ "validation": { │
│ "endsWith": ".git" │
│ }, │
│ "message": "Invalid input: must end with \".git\"", │
│ "path": [ │
│ "0000000-marketplace-plugin", │
│ "source", │
│ "url" │
│ ] │
│ } │
│ ]
22 Comments
This issue has been inactive for 30 days. If the issue is still occurring, please comment to let us know. Otherwise, this issue will be automatically closed in 30 days for housekeeping purposes.
It is still an issue
When attempting to add a plugin marketplace hosted on Azure DevOps, Claude Code fails to recognize the URL as a git repository. This prevents using Azure DevOps as a remote marketplace source.
## Steps to Reproduce
.claude-plugin/marketplace.jsonat the repo root/plugin marketplace add https://dev.azure.com/myorg/myproject/_git/my-marketplace
Result:
Error: Invalid marketplace schema from URL: : Invalid input: expected object, received string.gitsuffix (as documentation suggests):/plugin marketplace add https://dev.azure.com/myorg/myproject/_git/my-marketplace.git
Result:
Error: Failed to clone marketplace repository... TF401019: The Git repository with name or identifier my-marketplace.git does not exist## Root Cause Analysis
Claude Code's URL detection logic appears to:
.git→ treat as git repo and cloneThe problem: Azure DevOps URLs don't end with
.git, so Claude Code tries HTTP fetch and gets HTML (the web UI) instead of JSON. But adding.gitdoesn't work either because Azure DevOps interprets it as part of the repository name (unlike GitHub which handles the
.gitsuffix gracefully).## Evidence
git clone https://dev.azure.com/myorg/myproject/_git/my-marketplaceworks fine from command linegit clone https://dev.azure.com/myorg/myproject/_git/my-marketplace.gitfails with "repo not found"./my-marketplaceworks after cloning manually## Expected Behavior
Claude Code should recognize Azure DevOps URL patterns and treat them as git repositories:
https://dev.azure.com/{org}/{project}/_git/{repo}https://{org}.visualstudio.com/{project}/_git/{repo}## Workaround
Currently the only workaround is to clone the repo locally and use a local path:
git clone https://dev.azure.com/myorg/myproject/_git/my-marketplace
/plugin marketplace add ./my-marketplace
This defeats the purpose of a remote marketplace for team distribution.
## Environment
## Suggested Fix
Add URL pattern matching for Azure DevOps URLs (similar to how GitHub URLs are handled) so they're recognized as git repositories without requiring the
.gitsuffix.---
Also experiencing
We're experiencing the same issue with Azure DevOps-hosted plugin marketplaces.
Our setup:
https://dev.azure.com/{org}/{project}/_git/{repo}.claude-plugin/marketplace.jsonat rootgit ls-remotesucceeds)The core conflict:
.gitsuffix → Claude Code treats it as an HTTP endpoint, fetches HTML, fails withInvalid marketplace schema from URL: : Invalid input: expected object, received string.gitsuffix → Claude Code correctly triesgit clone, but Azure DevOps rejects it:TF401019: The Git repository with name or identifier repo.git does not existAzure DevOps categorically rejects the
.gitsuffix in URLs — it interpretsrepo.gitas a literal repository name rather than stripping the suffix like GitHub/GitLab do.Suggested fixes (any would resolve this):
dev.azure.com/*/_git/*) alongside the.gitsuffix heuristic/plugin marketplace add --git <url>git ls-remote <url>as a fallback probe when the URL doesn't end in.gitbut also fails JSON parsingextraKnownMarketplacesin settings with aurlsource type that doesn't require.gitsuffixThis is indeed still an issue!
Also experiencing this with Azure DevOps. Our marketplace repo at
dev.azure.comworks fine withgit cloneandgit ls-remoteover SSH, but Claude Code's URL detection logic fails in both directions:.git→ fetched as HTTP, gets HTML instead of JSON →expected object, received string.gitappended → Azure DevOps rejects it:TF401019: The Git repository with name or identifier repo.git does not existCurrently using the local clone workaround (
claude plugin add ~/local-path), but this defeats the purpose of a shared marketplace for team distribution.+1 for any of the suggested fixes, especially detecting
dev.azure.com/*/_git/*as a git repo pattern.+1 would be helpful for our team
+1 would be helpful for me as well
+1 would be helpful for me as well
current mitigation way is to set Git URL rewrite:
git config --global url."https://dev.azure.com/{org}/{project}/_git/{repo}".insteadOf "https://dev.azure.com/{org}/{project}/{repo}.git"
+1 please fix this
TEMPORARY FIX
I was able to get this working by appending
.gitto the repository name.For example, renaming:
claude-plugin→claude-plugin.gitIt seems like the marketplace expects the
.gitextension when resolving Azure-hosted repos. Once I made this change, everything worked as expected. Hopefully this helps someone else running into the same issue!@Nicheen, that is exactly how I did it since it was a blocker to me, but it looks silly
+1 would be helpful to have this fixed
+1
+1 would be helpful
Trying to host plugins for copilot-cli and claude-code out of the same repo. Copliot-cli handles ADO repos natively. Used a pipeline to publish the clause marketplace file to blob storage, and publish the plugins as npm packages. It works but comes with a lot of extra setup.
This worked and did not break copilot-cli either!
+1, Still an Issue.
+1, Still an Issue.
+1, Still an issue
+1, Still an issue