[BUG] Desktop SSH sessions: pyright-lsp / typescript-lsp sync to the remote without their lspServers config

Status Open
Reported on v2.1.295
Maintainer reply None cached
Activity 0 comments · opened Oct 14, 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 (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

  1. 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 .py file).
  2. On a Linux host, install pyright so pyright-langserver is on PATH (uv tool install pyright).
  3. 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 .py file. The LSP tool is not available.
  4. On the host, list ~/.claude/remote/plugins/*/*/ and find the folder whose README starts with # pyright-lsp: it has no .claude-plugin/plugin.json and 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).

View original on GitHub ↗