[BUG] Marketplace URL credentials printed in cleartext in `/plugin` and `claude plugin marketplace list`
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
claude mcp add masks a secret header value as [REDACTED] before printing it. Plugin
marketplaces get no such treatment, so a marketplace added over HTTPS basic auth has its
password printed in full in both places where marketplaces are listed:
claude plugin marketplace listprintsSource: URL (https://user:PASSWORD@host/...)./pluginthen the Marketplaces tab prints the same URL under the marketplace name, wrapped
over several lines.
There is no setting to suppress it.
For a url source marketplace no git remote is involved, so a credential helper never applies
and basic auth in the URL is the only way to reach a protected marketplace document. That makes
this the normal path for a private marketplace rather than a corner case. /plugin is also the
screen people open when a plugin misbehaves, which is often while sharing a screen or capturing
a screenshot for a bug report.
What Should Happen?
Mask the credential wherever a marketplace source URL is rendered, reusing the [REDACTED]
string the CLI already prints elsewhere. The rest of the URL keeps marketplaces identifiable and
should stay visible:
❯ acme-internal
Source: URL (https://ci-user:[REDACTED]@marketplace.example.com/claude-marketplace.json)
Two things worth covering in the same fix:
- All render paths, so the TUI list,
marketplace list,marketplace info, and any error or
status message that echoes the source URL.
- Query parameters named like credentials, such as
token,access_token,api_key,key,
password, sig. A marketplace behind a signed URL carries its secret there instead of in
the userinfo part.
Error Messages/Logs
$ claude mcp add --transport http example https://example.com/mcp --header "Authorization: Bearer sk-not-a-real-token"
Added HTTP MCP server example with URL: https://example.com/mcp to local config
Headers: {
"Authorization": "[REDACTED]" <- masked here
}
$ claude plugin marketplace list
Configured marketplaces:
❯ acme-internal
Source: URL (https://ci-user:s3cr3t.p4ssw0rd@marketplace.example.com/claude-marketplace.json)
^^^^^^^^^^^^^^^^ not masked here
Steps to Reproduce
- Add a marketplace whose URL carries basic auth credentials. Any host works, and the fetch
does not have to succeed for the entry to be listed afterwards:
``bash``
claude plugin marketplace add "https://ci-user:s3cr3t.p4ssw0rd@marketplace.example.com/claude-marketplace.json"
Adding it through /plugin then Add Marketplace behaves the same, and that prompt offers
https://example.com/marketplace.json as an accepted source.
- Run
claude plugin marketplace list. The full URL is printed withs3cr3t.p4ssw0rdvisible.
- Start
claude, run/plugin, open the Marketplaces tab. Same unmasked URL on screen.
Claude Model
None
Is this a regression?
No, this never worked
Last Working Version
_No response_
Claude Code Version
2.1.228 (Claude Code)
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
iTerm2
Additional Information
#41438 reported this for the marketplace menu but had no reproduction steps, was written against
an SSH style source, and went stale at v2.1.88 before being closed and locked. Its closing
comment asks that a new issue be opened referencing it. #46018 was closed as a duplicate of
#44888, and both of those concern MCP connector URLs rather than plugin marketplaces.
#82351 makes the same point about claude mcp get printing raw header values whileclaude mcp add masks them, and #64043 reported it for mcp get env values. Marketplace URLs
look like the surface where this convention has not been applied yet.
This is only about what gets printed. Storage of the credential is a separate topic, already
discussed in #49694.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗