[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"                                                                                                                                                                                    │
│     ]                                                                                                                                                                                          │
│   }                                                                                                                                                                                            │
│ ]       

View original on GitHub ↗

22 Comments

github-actions[bot] · 5 months ago

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.

Arigatouz · 5 months ago

It is still an issue

CMBaines · 5 months ago

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

  1. Host a valid marketplace on Azure DevOps with .claude-plugin/marketplace.json at the repo root
  2. Try to add the marketplace:

/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

  1. Try with .git suffix (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:

  1. If URL ends with .git → treat as git repo and clone
  2. Otherwise → try HTTP fetch first

The 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 .git
doesn't work either because Azure DevOps interprets it as part of the repository name (unlike GitHub which handles the .git suffix gracefully).

## Evidence

  • git clone https://dev.azure.com/myorg/myproject/_git/my-marketplace works fine from command line
  • git clone https://dev.azure.com/myorg/myproject/_git/my-marketplace.git fails with "repo not found"
  • Local path ./my-marketplace works 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

  • Claude Code version: Latest
  • OS: Windows 11
  • Git host: Azure DevOps

## 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
.git suffix.

---

seba-d-work · 4 months ago

Also experiencing

nickels · 4 months ago

We're experiencing the same issue with Azure DevOps-hosted plugin marketplaces.

Our setup:

  • Azure DevOps URL: https://dev.azure.com/{org}/{project}/_git/{repo}
  • Repository has a valid .claude-plugin/marketplace.json at root
  • HTTPS credentials are configured and working (git ls-remote succeeds)

The core conflict:

  • Without .git suffix → Claude Code treats it as an HTTP endpoint, fetches HTML, fails with Invalid marketplace schema from URL: : Invalid input: expected object, received string
  • With .git suffix → Claude Code correctly tries git clone, but Azure DevOps rejects it: TF401019: The Git repository with name or identifier repo.git does not exist

Azure DevOps categorically rejects the .git suffix in URLs — it interprets repo.git as a literal repository name rather than stripping the suffix like GitHub/GitLab do.

Suggested fixes (any would resolve this):

  1. Detect known git hosting URL patterns (e.g. dev.azure.com/*/_git/*) alongside the .git suffix heuristic
  2. Support an explicit source type flag: /plugin marketplace add --git <url>
  3. Try git ls-remote <url> as a fallback probe when the URL doesn't end in .git but also fails JSON parsing
  4. Support extraKnownMarketplaces in settings with a url source type that doesn't require .git suffix
bubuding0809 · 4 months ago

This is indeed still an issue!

abuchmueller · 4 months ago

Also experiencing this with Azure DevOps. Our marketplace repo at dev.azure.com works fine with git clone and git ls-remote over SSH, but Claude Code's URL detection logic fails in both directions:

  • HTTPS URL without .git → fetched as HTTP, gets HTML instead of JSON → expected object, received string
  • SSH URL with .git appended → Azure DevOps rejects it: TF401019: The Git repository with name or identifier repo.git does not exist

Currently 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.

TDeschampsGenetec · 4 months ago

+1 would be helpful for our team

qlevasseur-genetec · 4 months ago

+1 would be helpful for me as well

jinweili1 · 4 months ago

+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"

bubuding0809 · 4 months ago

+1 please fix this

Nicheen · 4 months ago

TEMPORARY FIX

I was able to get this working by appending .git to the repository name.

For example, renaming:
claude-pluginclaude-plugin.git

It seems like the marketplace expects the .git extension when resolving Azure-hosted repos. Once I made this change, everything worked as expected. Hopefully this helps someone else running into the same issue!

Arigatouz · 4 months ago

@Nicheen, that is exactly how I did it since it was a blocker to me, but it looks silly

imjoem · 4 months ago

+1 would be helpful to have this fixed

rousegavin · 4 months ago

+1

TheMcCann7 · 4 months ago

+1 would be helpful

ryanfk · 3 months ago

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.

ryanfk · 3 months ago
## TEMPORARY FIX I was able to get this working by appending .git to the repository name. For example, renaming: claude-pluginclaude-plugin.git It seems like the marketplace expects the .git extension when resolving Azure-hosted repos. Once I made this change, everything worked as expected. Hopefully this helps someone else running into the same issue!

This worked and did not break copilot-cli either!

lquartier-work · 2 months ago

+1, Still an Issue.

glenn-zarb · 1 month ago

+1, Still an Issue.

AlexPascu001 · 27 days ago

+1, Still an issue

glenn-zarb · 22 days ago

+1, Still an issue