Preflight Checklist
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 list prints Source: URL (https://user:PASSWORD@host/...).
/plugin then 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:
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 with s3cr3t.p4ssw0rd visible.
-
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 while
claude 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.
Preflight Checklist
What's Wrong?
claude mcp addmasks a secret header value as[REDACTED]before printing it. Pluginmarketplaces 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, wrappedover several lines.
There is no setting to suppress it.
For a
urlsource marketplace no git remote is involved, so a credential helper never appliesand 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.
/pluginis also thescreen 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:
Two things worth covering in the same fix:
marketplace list,marketplace info, and any error orstatus message that echoes the source URL.
token,access_token,api_key,key,password,sig. A marketplace behind a signed URL carries its secret there instead of inthe userinfo part.
Error Messages/Logs
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:
claude plugin marketplace add "https://ci-user:s3cr3t.p4ssw0rd@marketplace.example.com/claude-marketplace.json"Adding it through
/pluginthen Add Marketplace behaves the same, and that prompt offershttps://example.com/marketplace.jsonas 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 getprinting raw header values whileclaude mcp addmasks them, and #64043 reported it formcp getenv values. Marketplace URLslook 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.