[BUG] Marketplace URL credentials printed in cleartext in `/plugin` and `claude plugin marketplace list`

Status Open
Reported on v2.1.228
Maintainer reply None cached
Activity 2 comments · opened Aug 12, 2026

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:

  1. claude plugin marketplace list prints Source: URL (https://user:PASSWORD@host/...).
  2. /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

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

  1. Run claude plugin marketplace list. The full URL is printed with s3cr3t.p4ssw0rd visible.
  1. 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.

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗