[BUG] Plugin userConfig never collected on VS Code extension or Desktop app: no install prompt and no way to set it afterward

Status Open
Reported on v2.1.233
Maintainer reply None cached
Activity 0 comments · opened Aug 26, 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?

A plugin that declares userConfig with required: true values is never asked for those values when installed from the VS Code extension (/plugins → Install) or the Desktop app Code tab (+ → Plugins → Add plugin).

#39455 reported this same symptom and was closed as fixed — verified on 2.1.233, where the terminal flow now opens a Configure dialog right after the install-scope choice. That fix does not reach either graphical surface. Reproduced on 2.1.246, on fresh install and on update.

There is also no way to supply the values afterward:

  • VS Code: the installed-plugin row in the Manage plugins dialog has only an enable/disable toggle and an uninstall (trash) icon. There is no "Configure options" entry — the manual fallback #39455 describes.
  • Desktop: opening the plugin shows its MCP server as a read-only detail panel (command, args, environment variables) with no edit control.

Consequence: the install completes, the plugin shows as enabled, and any bundled MCP server referencing ${user_config.*} never starts. Its tools are simply absent from the session.

A second, smaller defect is visible on that Desktop panel: it masks every environment value, including ones whose userConfig field is not declared sensitive. A masked row looks identical whether the value is set, empty, or an unresolved placeholder, so the one screen that shows the MCP configuration cannot answer "is this configured?".

What Should Happen?

After the install-scope choice, a Configure dialog should collect the declared userConfig values, masking only the fields marked sensitive: true — the same flow the terminal surface runs.

Failing that, the installed-plugin row on both surfaces should expose a way to set them later, and the Desktop MCP panel should distinguish a set value from an unset one.

Error Messages/Logs

# There is no error output. That is the defect.
# After installing the repro plugin from either GUI surface:

$ claude mcp list
# ...other servers...
# no `plugin:hello-config:demo` line at all

# A required userConfig value being unset stops the server from starting,
# so it never reaches an auth failure. Nothing is logged, nothing is shown
# in the UI, and the plugin still displays as enabled.

Steps to Reproduce

Minimal marketplace, one plugin, no external service required. claude plugin validate passes on both manifests.

1. Create .claude-plugin/marketplace.json:

{
  "$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
  "name": "userconfig-repro",
  "description": "Minimal reproduction for plugin userConfig prompt behavior across surfaces",
  "owner": { "name": "repro" },
  "plugins": [
    {
      "name": "hello-config",
      "description": "Minimal repro: plugin whose MCP server needs a userConfig secret",
      "source": "./plugins/hello-config",
      "author": { "name": "repro" }
    }
  ]
}

2. Create plugins/hello-config/.claude-plugin/plugin.json:

{
  "name": "hello-config",
  "description": "Minimal repro: plugin whose MCP server needs a userConfig secret",
  "version": "1.0.0",
  "author": { "name": "repro" },
  "userConfig": {
    "service_url": {
      "type": "string",
      "title": "Service URL",
      "description": "Base URL of the service.",
      "default": "https://example.invalid",
      "required": true
    },
    "api_key": {
      "type": "string",
      "title": "API key",
      "description": "Secret token. Should be prompted for and masked.",
      "sensitive": true,
      "required": true
    }
  }
}

3. Create plugins/hello-config/.mcp.json:

{
  "mcpServers": {
    "demo": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-everything"],
      "env": {
        "SERVICE_URL": "${user_config.service_url}",
        "API_KEY": "${user_config.api_key}"
      }
    }
  }
}

4. Add any placeholder skill at plugins/hello-config/skills/hello/SKILL.md so the plugin has a visible component.

5. Add the marketplace (a local path works).

6. Install hello-config from the VS Code extension (/plugins → Plugins tab → Install), or from the Desktop app Code tab (+ → Plugins → Add plugin). Choose any scope.

7. Restart when prompted.

8. Run claude mcp list.

Observed: no Configure dialog appears at step 6 on either surface, and no way to reach one afterward. At step 8 there is no plugin:hello-config:demo line.

Also observed: open the installed plugin in the Desktop app. The demo server's environment block renders both SERVICE_URL and API_KEY as masked dots, although only api_key is declared sensitive: true.

For contrast, installing the same plugin from the CLI does prompt, and the server then starts.

Claude Model

Not sure / Multiple models — the behavior is not model-dependent.

Is this a regression?

I don't know

Last Working Version

No response

Claude Code Version

2.1.246 (Claude Code)

Platform

Anthropic API

Operating System

macOS

Terminal/Shell

Other — not terminal-specific. The defect is in the VS Code extension GUI and the Desktop app GUI. The CLI surface (Terminal.app) is where it works correctly.

Additional Information

Workaround. Setting the values once from any terminal fixes every surface on that machine, since the storage is shared:

claude plugin install hello-config@userconfig-repro \
  --config service_url=https://example.invalid \
  --config api_key=REDACTED

Per claude plugin install --help:

--config <key=value> Set a userConfig option declared in the plugin's manifest (repeatable). Values are validated against the schema and stored via the same path as the interactive /plugin configure flow.

VS Code's integrated terminal and the Desktop app's integrated terminal (local sessions) both work, so users need not leave the app — but they do have to know the command exists. In practice this means any plugin requiring a credential cannot be set up from the GUI alone, and its setup documentation has to send people to a terminal.

Diagnosability. claude plugin details <name> does not report whether userConfig values are set, so a missing line in claude mcp list is the only available signal. That is easy to misread as a connectivity or server problem.

Related issues, and how this differs.

  • #39455 — same symptom in the terminal flow. Closed as fixed, verified on 2.1.233. This report is that symptom persisting on the two graphical surfaces at 2.1.246.
  • #88529 — different failure: ${user_config.*} values that were entered fail to substitute in Desktop CCD sessions. Here the values are never collected at all.
  • #80904 — the terminal install TUI does chain into the configure form, which is exactly the step missing on the graphical surfaces.

Documentation. Both GUI pages document the install flow including scope selection, but neither mentions userConfig entry or /plugin configure:

Suggestions.

  1. Run the same Configure step after scope selection in the VS Code extension and Desktop install flows.
  2. Failing that, expose a manual entry point on both surfaces — the equivalent of "Configure options" on the installed-plugin row.
  3. In the Desktop MCP detail panel, mask only fields declared sensitive: true, and distinguish "set" from "unset".
  4. Have claude plugin details <name> report whether required userConfig values are set.
  5. If GUI entry is not planned, state that on the two documentation pages above.

View original on GitHub ↗