LSP action surface for DeepSeek Harness providing diagnostics, formatting, rename, code actions, and symbols over real language servers.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-tool-lsp
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:Jaylor-Wang/dsh-tool-lsp
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
English | 中文
An LSP tool surface for DeepSeek Harness: real language-server diagnostics, formatting, rename, code actions and symbol navigation, exposed as five tools the model can call directly.
Tools
| Tool | What it does | Writes to disk |
|---|---|---|
lsp_diagnostics |
File diagnostics, merging the pull and push channels | no |
lsp_format |
Whole-file or range formatting | yes |
lsp_rename |
Semantic rename, across files when the server says so | yes |
lsp_code_action |
Fixes the language server is willing to apply | yes (when an action is applied) |
lsp_symbols |
Document outline / workspace symbol search | no |
Writes go through the Harness filesystem observation policy: a file changed by someone
else since this call read it fails with LSP_WRITE_CONFLICT rather than being
silently overwritten.
Install
dsh plugin --profile web add dsh-tool-lsp
Enable it from dshmarket. The plugin is off by default — click the switch when you want it, and it takes effect immediately with no restart. The enabled state does not survive a restart.
Configuration
The language-server table lives in the user profile's patch layer
($DSH_HOME/profiles/<name>/cordis.patch.yml), never in the plugin package: the
package's own cordis.patch.yml has to stay plain insert rows, or dshmarket cannot
hot-mount or hot-unmount this plugin.
- id: lsp
config:
servers:
vtsls:
command: vtsls
args: ["--stdio"]
extensionToLanguage:
".ts": typescript
".tsx": typescriptreact
".js": javascript
".jsx": javascriptreact
projectMarkers: ["package.json", "tsconfig.json"]
configuration: # the answer to workspace/configuration
typescript:
preferences:
includePackageJsonAutoImports: "on"
rust:
command: rust-analyzer
extensionToLanguage:
".rs": rust
projectMarkers: ["Cargo.toml"]
biome:
command: biome
args: ["lsp-proxy"]
extensionToLanguage:
".json": json
".css": css
projectMarkers: ["biome.json"]
# The switch needs its own row: same-id rows merge key by key, and folding them
# into one row breaks the market's toggle
- id: lsp
disabled: true
Server entry fields
| Field | Required | Default | Meaning |
|---|---|---|---|
command |
✅ | — | Executable name, resolved on PATH at mount; a typo fails there, not on first call |
extensionToLanguage |
✅ | — | Extension → LSP language id |
fileGlobs |
[] |
Path globs, highest routing priority | |
projectMarkers |
[] |
Project file names, used to split one extension across servers | |
args |
[] |
Launch arguments | |
env |
{} |
Extra environment entries | |
initializationOptions |
null |
initializationOptions sent with initialize |
|
configuration |
null |
Answer to workspace/configuration, resolved per requested section |
|
formattingOptions |
null |
Overrides the global formatting options (tabSize / insertSpaces) |
Routing
Matched in order, first hit wins:
fileGlobsprojectMarkers— the marker file in the file's nearest ancestor; only chooses among entries that already map the extensionextensionToLanguage— first match in configuration order
Top-level options
maxDiagnostics (200), maxSymbols (100), maxCodeActions (50), maxResultChars
(16000), maxDiffLines (60), maxDocumentBytes (8 MiB), timeoutMs (60000).
Positions
Tool arguments take 1-based UTF-16 line / character, matching editors. The
0-based wire form and the utf-8 / utf-32 encodings some servers negotiate are
converted internally — the model never has to think about it.
Requirements
The language servers themselves must be on PATH; this plugin does not install them.
vtsls, biome, rust-analyzer, ty, ruff, or any other LSP server.
Known limitations
biomeandruffdo not implementtextDocument/documentSymbol, solsp_symbolsreturnsLSP_UNSUPPORTEDfor them. They serve diagnostics and formatting only.- A cold server (
rust-analyzeris the usual example) may answer a first diagnostic pull with nothing at all while it indexes. The plugin retries with backoff and, once out of attempts, reports what it has.
Development
npm test # 121 unit tests, including protocol coverage over a fake server
npm run verify:servers # every server configured in the patch layer, over real requests
verify:servers reads the servers: table out of the profile patch, starts each real
server, and issues one request per advertised capability. Usage:
node test/verify-servers.mjs [profileDir].
Restart the process after changing plugin source. The market switch changes whether the plugin is mounted, immediately — but it does not load new code from disk into a running process (ESM module cache, confirmed by measurement).
License
MIT
Links
More in this category
DayuanJiang/next-ai-draw-io#dsh-plugin★ 36548
Draws draw.io diagrams in DeepSeek Harness through the next-ai-drawio MCP server: the link in the reply opens a live preview in the right sidebar, you can edit the diagram by hand, and each AI change is a version you can restore. Node.js 18+; npx downloads the MCP server on first use.
Tencent/WeKnora#dsh-weknora★ 36201
Four read-only tools over a WeKnora knowledge base: list knowledge bases, hybrid passage search, reassemble one document's chunks in order, and WeKnora's own cited RAG or ReAct-agent answer with a resumable session id.
superdesigndev/treg★ 6962
Tool catalog for agents: search ~2,600 external endpoints (SEO and SERP, backlinks, social, people and company enrichment, ad libraries, scraping) by the task you want done, read each one's parameters and per-call price, then call it with the credential injected server-side. Ships the skill plus an MCP row that stays disabled until TREG_TOKEN is set.
T-Auto/dsh-ops★ 5011
Provides bash, PowerShell 7, and high-performance Rust tools for DSH on Windows to reduce token usage.
sixtysevenlf/dsh-blender-plugin★ 1536
Lets a DSH agent drive a local Blender over a direct TCP channel with 15 tools: viewport frames, custom-angle renders, Python execution, headless and job offload, transaction rollback, and a planning layer of 228 ops across 34 families.
TencentCloudBase/CloudBase-AI-Toolkit#dsh-plugin★ 1153
Tencent CloudBase backend for DeepSeek Harness — scaffold and deploy full-stack apps from chat, render query results as table cards with paging, sorting and CSV export, preview a deployment on its domain, and call the CloudBase MCP toolset (`mcp__cloudbase__*`) with device-code login.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.