[BUG] Desktop SSH sessions: pyright-lsp / typescript-lsp sync to the remote without their lspServers config
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 (Claude Desktop 2.37337.1, which bundles Claude Code 2.1.295)
What's Wrong?
In Claude desktop (Code tab) SSH sessions, pyright-lsp and typescript-lsp from claude-plugins-official load as empty plugins on the remote host, so the LSP tool never appears there. ToolSearch for "LSP" finds nothing. The same two plugins work in local sessions on the Mac: hover, go-to-definition and diagnostics all come back.
pyright-langserver and typescript-language-server are on PATH on both remote hosts. Run by hand with --stdio, both start and return diagnostics.
The desktop app syncs each enabled plugin's folder to ~/.claude/remote/plugins/<id>/<hash>/ on the host and passes it with --plugin-dir (see #83643). For these two plugins the synced folder contains only README.md and LICENSE. Their lspServers config lives in the plugin's entry in .claude-plugin/marketplace.json ("strict": false), not in the plugin folder, so it never reaches the host. Plugins that ship their own .claude-plugin/plugin.json (claude-code-setup, claude-md-management) sync and work in the same SSH sessions.
What Should Happen?
SSH sessions should get the same lspServers config as local sessions, for example by syncing the resolved manifest (marketplace entry merged with plugin.json) instead of the raw plugin folder. Any strict: false plugin that defines its components only in the marketplace entry is probably affected the same way.
Error Messages/Logs
# On the remote host, the synced folders for the two LSP plugins:
$ ls -A ~/.claude/remote/plugins/*/a90073fcddc6fd38/
.in_use .synced LICENSE README.md # README: "# pyright-lsp"
$ ls -A ~/.claude/remote/plugins/*/3089073a27df2400/
.in_use .synced LICENSE README.md # README: "# typescript-lsp"
# A working plugin synced in the same session, for comparison:
$ ls -A ~/.claude/remote/plugins/*/38c1b26aa7ed7309/
.claude-plugin .in_use .synced LICENSE README.md automation-recommender-example.png skills
No error is shown in the session; the LSP tool is simply absent.
Steps to Reproduce
- On the Mac, install and enable
pyright-lsp@claude-plugins-official(user scope). Confirm it works in a local Code tab session (LSP hover on a.pyfile). - On a Linux host, install pyright so
pyright-langserveris on PATH (uv tool install pyright). - In the desktop app, open an SSH session to that host and ask Claude to use the LSP tool (hover) on a symbol in a
.pyfile. The LSP tool is not available. - On the host, list
~/.claude/remote/plugins/*/*/and find the folder whose README starts with# pyright-lsp: it has no.claude-plugin/plugin.jsonand no.lsp.json.
Claude Model
Opus
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
Claude Desktop 2.37337.1 (macOS), bundled Claude Code 2.1.295; remote CLI ~/.claude/remote/ccd-cli/2.1.295-8b2928c330c4
Platform
Anthropic API
Operating System
macOS (desktop app); remote hosts are Ubuntu 26.04
Terminal/Shell
Other (Claude desktop app, Code tab, SSH session)
Additional Information
Related but distinct: #83643 (the same remote plugin sync omits hooks/) and #78604 (LSP plugins loading as empty shells locally after the lspServers move into the marketplace entry).