@treedy/lsp-mcp 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/index.js +162 -4
- package/dist/index.js.map +6 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -97,6 +97,7 @@ Replace `{lang}` with `python` or `typescript`.
|
|
|
97
97
|
|------|-------------|
|
|
98
98
|
| `list_backends` | List available backends and their status |
|
|
99
99
|
| `start_backend` | Install and start a backend (downloads if needed) |
|
|
100
|
+
| `update_backend` | Update a backend to the latest version |
|
|
100
101
|
| `status` | Overall server and backend status with versions |
|
|
101
102
|
| `check_versions` | Detailed version info for server and all backends |
|
|
102
103
|
| `switch_python_backend` | Switch Python provider |
|
|
@@ -120,6 +121,11 @@ Replace `{lang}` with `python` or `typescript`.
|
|
|
120
121
|
typescript_definition file=/path/to/file.ts line=15 column=10
|
|
121
122
|
```
|
|
122
123
|
|
|
124
|
+
4. **Update a backend** (when new version is available):
|
|
125
|
+
```
|
|
126
|
+
update_backend language=python
|
|
127
|
+
```
|
|
128
|
+
|
|
123
129
|
## Available Prompts (Skills)
|
|
124
130
|
|
|
125
131
|
The server exposes skill documentation as MCP prompts that agents can request:
|
package/dist/index.js
CHANGED
|
@@ -19843,6 +19843,7 @@ function loadConfig() {
|
|
|
19843
19843
|
const pythonEnabled = getEnvBool("LSP_MCP_PYTHON_ENABLED", true);
|
|
19844
19844
|
const pythonProvider = getEnvString("LSP_MCP_PYTHON_PROVIDER", "python-lsp-mcp");
|
|
19845
19845
|
const typescriptEnabled = getEnvBool("LSP_MCP_TYPESCRIPT_ENABLED", true);
|
|
19846
|
+
const vueEnabled = getEnvBool("LSP_MCP_VUE_ENABLED", true);
|
|
19846
19847
|
const autoUpdate = getEnvBool("LSP_MCP_AUTO_UPDATE", true);
|
|
19847
19848
|
return {
|
|
19848
19849
|
python: {
|
|
@@ -19852,6 +19853,9 @@ function loadConfig() {
|
|
|
19852
19853
|
typescript: {
|
|
19853
19854
|
enabled: typescriptEnabled
|
|
19854
19855
|
},
|
|
19856
|
+
vue: {
|
|
19857
|
+
enabled: vueEnabled
|
|
19858
|
+
},
|
|
19855
19859
|
autoUpdate
|
|
19856
19860
|
};
|
|
19857
19861
|
}
|
|
@@ -19890,6 +19894,14 @@ function getBackendCommand(language, config2) {
|
|
|
19890
19894
|
command: "npx",
|
|
19891
19895
|
args: autoUpdate ? ["--yes", "@treedy/typescript-lsp-mcp@latest"] : ["@treedy/typescript-lsp-mcp@latest"]
|
|
19892
19896
|
};
|
|
19897
|
+
} else if (language === "vue") {
|
|
19898
|
+
if (!config2.vue.enabled)
|
|
19899
|
+
return null;
|
|
19900
|
+
return {
|
|
19901
|
+
enabled: true,
|
|
19902
|
+
command: "npx",
|
|
19903
|
+
args: autoUpdate ? ["--yes", "@treedy/vue-lsp-mcp@latest"] : ["@treedy/vue-lsp-mcp@latest"]
|
|
19904
|
+
};
|
|
19893
19905
|
}
|
|
19894
19906
|
return null;
|
|
19895
19907
|
}
|
|
@@ -20673,6 +20685,8 @@ class BackendManager {
|
|
|
20673
20685
|
languages.push("python");
|
|
20674
20686
|
if (this.config.typescript.enabled)
|
|
20675
20687
|
languages.push("typescript");
|
|
20688
|
+
if (this.config.vue.enabled)
|
|
20689
|
+
languages.push("vue");
|
|
20676
20690
|
await Promise.all(languages.map(async (lang) => {
|
|
20677
20691
|
try {
|
|
20678
20692
|
const tools = await this.getTools(lang);
|
|
@@ -20702,6 +20716,9 @@ class BackendManager {
|
|
|
20702
20716
|
if (this.config.typescript.enabled && !this.backends.has("typescript")) {
|
|
20703
20717
|
status["typescript"] = { status: "not_started", tools: 0, restartCount: 0 };
|
|
20704
20718
|
}
|
|
20719
|
+
if (this.config.vue.enabled && !this.backends.has("vue")) {
|
|
20720
|
+
status["vue"] = { status: "not_started", tools: 0, restartCount: 0 };
|
|
20721
|
+
}
|
|
20705
20722
|
return status;
|
|
20706
20723
|
}
|
|
20707
20724
|
getVersions() {
|
|
@@ -20711,6 +20728,8 @@ class BackendManager {
|
|
|
20711
20728
|
languages.push("python");
|
|
20712
20729
|
if (this.config.typescript.enabled)
|
|
20713
20730
|
languages.push("typescript");
|
|
20731
|
+
if (this.config.vue.enabled)
|
|
20732
|
+
languages.push("vue");
|
|
20714
20733
|
for (const lang of languages) {
|
|
20715
20734
|
const backendConfig = getBackendCommand(lang, this.config);
|
|
20716
20735
|
const state = this.backends.get(lang);
|
|
@@ -20724,6 +20743,24 @@ class BackendManager {
|
|
|
20724
20743
|
}
|
|
20725
20744
|
return versions2;
|
|
20726
20745
|
}
|
|
20746
|
+
async restartBackend(language) {
|
|
20747
|
+
const existing = this.backends.get(language);
|
|
20748
|
+
const oldVersion = existing?.serverInfo?.version ?? null;
|
|
20749
|
+
if (existing) {
|
|
20750
|
+
console.error(`[BackendManager] Stopping ${language} for update...`);
|
|
20751
|
+
try {
|
|
20752
|
+
await existing.transport.close();
|
|
20753
|
+
await existing.client.close();
|
|
20754
|
+
} catch (error2) {
|
|
20755
|
+
console.error(`[BackendManager] Error closing ${language}:`, error2);
|
|
20756
|
+
}
|
|
20757
|
+
this.backends.delete(language);
|
|
20758
|
+
}
|
|
20759
|
+
console.error(`[BackendManager] Starting fresh ${language} backend...`);
|
|
20760
|
+
const state = await this.startBackend(language);
|
|
20761
|
+
const newVersion = state.serverInfo?.version ?? null;
|
|
20762
|
+
return { oldVersion, newVersion };
|
|
20763
|
+
}
|
|
20727
20764
|
async shutdown() {
|
|
20728
20765
|
console.error("[BackendManager] Shutting down all backends...");
|
|
20729
20766
|
const shutdownPromises = Array.from(this.backends.entries()).map(async ([lang, state]) => {
|
|
@@ -20767,6 +20804,9 @@ async function status(backendManager, config2) {
|
|
|
20767
20804
|
typescript: {
|
|
20768
20805
|
enabled: config2.typescript.enabled
|
|
20769
20806
|
},
|
|
20807
|
+
vue: {
|
|
20808
|
+
enabled: config2.vue.enabled
|
|
20809
|
+
},
|
|
20770
20810
|
autoUpdate: config2.autoUpdate
|
|
20771
20811
|
},
|
|
20772
20812
|
backends: backendStatus,
|
|
@@ -20824,6 +20864,13 @@ async function checkVersions(backendManager, config2) {
|
|
|
20824
20864
|
registry: "npm",
|
|
20825
20865
|
command: "npx --yes @treedy/typescript-lsp-mcp@latest"
|
|
20826
20866
|
}
|
|
20867
|
+
},
|
|
20868
|
+
vue: {
|
|
20869
|
+
"vue-lsp-mcp": {
|
|
20870
|
+
registry: "npm",
|
|
20871
|
+
command: "npx --yes @treedy/vue-lsp-mcp@latest",
|
|
20872
|
+
description: "Vue SFC support via Volar"
|
|
20873
|
+
}
|
|
20827
20874
|
}
|
|
20828
20875
|
},
|
|
20829
20876
|
howToUpdate: config2.autoUpdate ? "Restart the server to fetch latest backend versions automatically." : "Set LSP_MCP_AUTO_UPDATE=true and restart, or manually update with commands above."
|
|
@@ -20866,13 +20913,21 @@ async function listBackends(backendManager, config2) {
|
|
|
20866
20913
|
tools: backendStatus.typescript?.tools || 0,
|
|
20867
20914
|
description: "TypeScript/JavaScript code intelligence",
|
|
20868
20915
|
startCommand: "Use start_backend tool with language='typescript'"
|
|
20916
|
+
},
|
|
20917
|
+
{
|
|
20918
|
+
name: "vue",
|
|
20919
|
+
enabled: config2.vue.enabled,
|
|
20920
|
+
status: backendStatus.vue?.status || "not_started",
|
|
20921
|
+
tools: backendStatus.vue?.tools || 0,
|
|
20922
|
+
description: "Vue Single File Component (.vue) code intelligence via Volar",
|
|
20923
|
+
startCommand: "Use start_backend tool with language='vue'"
|
|
20869
20924
|
}
|
|
20870
20925
|
];
|
|
20871
20926
|
const result = {
|
|
20872
20927
|
backends,
|
|
20873
20928
|
usage: {
|
|
20874
|
-
start: "Call start_backend with language='python' or '
|
|
20875
|
-
tools: "Once started, backend tools will be available as {language}_{tool} (e.g., python_hover)"
|
|
20929
|
+
start: "Call start_backend with language='python', 'typescript', or 'vue' to install and start a backend",
|
|
20930
|
+
tools: "Once started, backend tools will be available as {language}_{tool} (e.g., python_hover, vue_hover)"
|
|
20876
20931
|
}
|
|
20877
20932
|
};
|
|
20878
20933
|
return {
|
|
@@ -20880,7 +20935,7 @@ async function listBackends(backendManager, config2) {
|
|
|
20880
20935
|
};
|
|
20881
20936
|
}
|
|
20882
20937
|
var startBackendSchema = {
|
|
20883
|
-
language: exports_external.enum(["python", "typescript"]).describe("The backend to start")
|
|
20938
|
+
language: exports_external.enum(["python", "typescript", "vue"]).describe("The backend to start")
|
|
20884
20939
|
};
|
|
20885
20940
|
async function startBackend(language, backendManager, config2, registerToolsCallback) {
|
|
20886
20941
|
if (language === "python" && !config2.python.enabled) {
|
|
@@ -20907,6 +20962,18 @@ async function startBackend(language, backendManager, config2, registerToolsCall
|
|
|
20907
20962
|
}]
|
|
20908
20963
|
};
|
|
20909
20964
|
}
|
|
20965
|
+
if (language === "vue" && !config2.vue.enabled) {
|
|
20966
|
+
return {
|
|
20967
|
+
content: [{
|
|
20968
|
+
type: "text",
|
|
20969
|
+
text: JSON.stringify({
|
|
20970
|
+
success: false,
|
|
20971
|
+
error: "Vue backend is disabled",
|
|
20972
|
+
hint: "Set LSP_MCP_VUE_ENABLED=true to enable"
|
|
20973
|
+
}, null, 2)
|
|
20974
|
+
}]
|
|
20975
|
+
};
|
|
20976
|
+
}
|
|
20910
20977
|
try {
|
|
20911
20978
|
const toolCount = await registerToolsCallback(language);
|
|
20912
20979
|
const backendStatus = backendManager.getStatus();
|
|
@@ -20940,6 +21007,80 @@ async function startBackend(language, backendManager, config2, registerToolsCall
|
|
|
20940
21007
|
};
|
|
20941
21008
|
}
|
|
20942
21009
|
}
|
|
21010
|
+
var updateBackendSchema = {
|
|
21011
|
+
language: exports_external.enum(["python", "typescript", "vue"]).describe("The backend to update")
|
|
21012
|
+
};
|
|
21013
|
+
async function updateBackend(language, backendManager, config2, updateCallback) {
|
|
21014
|
+
if (language === "python" && !config2.python.enabled) {
|
|
21015
|
+
return {
|
|
21016
|
+
content: [{
|
|
21017
|
+
type: "text",
|
|
21018
|
+
text: JSON.stringify({
|
|
21019
|
+
success: false,
|
|
21020
|
+
error: "Python backend is disabled",
|
|
21021
|
+
hint: "Set LSP_MCP_PYTHON_ENABLED=true to enable"
|
|
21022
|
+
}, null, 2)
|
|
21023
|
+
}]
|
|
21024
|
+
};
|
|
21025
|
+
}
|
|
21026
|
+
if (language === "typescript" && !config2.typescript.enabled) {
|
|
21027
|
+
return {
|
|
21028
|
+
content: [{
|
|
21029
|
+
type: "text",
|
|
21030
|
+
text: JSON.stringify({
|
|
21031
|
+
success: false,
|
|
21032
|
+
error: "TypeScript backend is disabled",
|
|
21033
|
+
hint: "Set LSP_MCP_TYPESCRIPT_ENABLED=true to enable"
|
|
21034
|
+
}, null, 2)
|
|
21035
|
+
}]
|
|
21036
|
+
};
|
|
21037
|
+
}
|
|
21038
|
+
if (language === "vue" && !config2.vue.enabled) {
|
|
21039
|
+
return {
|
|
21040
|
+
content: [{
|
|
21041
|
+
type: "text",
|
|
21042
|
+
text: JSON.stringify({
|
|
21043
|
+
success: false,
|
|
21044
|
+
error: "Vue backend is disabled",
|
|
21045
|
+
hint: "Set LSP_MCP_VUE_ENABLED=true to enable"
|
|
21046
|
+
}, null, 2)
|
|
21047
|
+
}]
|
|
21048
|
+
};
|
|
21049
|
+
}
|
|
21050
|
+
try {
|
|
21051
|
+
const { oldVersion, newVersion } = await updateCallback(language);
|
|
21052
|
+
const backendStatus = backendManager.getStatus();
|
|
21053
|
+
const status2 = backendStatus[language];
|
|
21054
|
+
const updated = oldVersion !== newVersion;
|
|
21055
|
+
return {
|
|
21056
|
+
content: [{
|
|
21057
|
+
type: "text",
|
|
21058
|
+
text: JSON.stringify({
|
|
21059
|
+
success: true,
|
|
21060
|
+
language,
|
|
21061
|
+
updated,
|
|
21062
|
+
oldVersion,
|
|
21063
|
+
newVersion,
|
|
21064
|
+
serverName: status2?.serverName,
|
|
21065
|
+
tools: status2?.tools,
|
|
21066
|
+
message: updated ? `${language} backend updated from ${oldVersion} to ${newVersion}.` : `${language} backend is already at the latest version (${newVersion}).`
|
|
21067
|
+
}, null, 2)
|
|
21068
|
+
}]
|
|
21069
|
+
};
|
|
21070
|
+
} catch (error2) {
|
|
21071
|
+
return {
|
|
21072
|
+
content: [{
|
|
21073
|
+
type: "text",
|
|
21074
|
+
text: JSON.stringify({
|
|
21075
|
+
success: false,
|
|
21076
|
+
language,
|
|
21077
|
+
error: String(error2),
|
|
21078
|
+
hint: "Check network connection and try again"
|
|
21079
|
+
}, null, 2)
|
|
21080
|
+
}]
|
|
21081
|
+
};
|
|
21082
|
+
}
|
|
21083
|
+
}
|
|
20943
21084
|
|
|
20944
21085
|
// src/prompts.ts
|
|
20945
21086
|
var skillsContent = {
|
|
@@ -21540,6 +21681,19 @@ async function startAndRegisterBackend(language) {
|
|
|
21540
21681
|
throw error2;
|
|
21541
21682
|
}
|
|
21542
21683
|
}
|
|
21684
|
+
async function updateAndRestartBackend(language) {
|
|
21685
|
+
console.error(`[lsp-mcp] Updating ${language} backend...`);
|
|
21686
|
+
const result = await backendManager.restartBackend(language);
|
|
21687
|
+
if (startedBackends.has(language)) {
|
|
21688
|
+
console.error(`[lsp-mcp] ${language} backend updated, tools still available`);
|
|
21689
|
+
} else {
|
|
21690
|
+
const tools = await backendManager.getTools(language);
|
|
21691
|
+
registerBackendTools(language, tools);
|
|
21692
|
+
startedBackends.add(language);
|
|
21693
|
+
console.error(`[lsp-mcp] ${language} backend updated and ${tools.length} tools registered`);
|
|
21694
|
+
}
|
|
21695
|
+
return result;
|
|
21696
|
+
}
|
|
21543
21697
|
server.registerTool("status", { description: "Get status of all LSP backends and server configuration" }, async () => status(backendManager, config2));
|
|
21544
21698
|
server.registerTool("check_versions", { description: "Check versions of all backends and server. Shows installed versions and how to check for updates." }, async () => checkVersions(backendManager, config2));
|
|
21545
21699
|
server.registerTool("switch_python_backend", {
|
|
@@ -21553,6 +21707,10 @@ server.registerTool("start_backend", {
|
|
|
21553
21707
|
description: "Start a backend and register its tools. This will download and install the backend if needed, then make its tools available.",
|
|
21554
21708
|
inputSchema: startBackendSchema
|
|
21555
21709
|
}, async ({ language }) => startBackend(language, backendManager, config2, startAndRegisterBackend));
|
|
21710
|
+
server.registerTool("update_backend", {
|
|
21711
|
+
description: "Update a backend to the latest version. This will restart the backend with the newest version available.",
|
|
21712
|
+
inputSchema: updateBackendSchema
|
|
21713
|
+
}, async ({ language }) => updateBackend(language, backendManager, config2, updateAndRestartBackend));
|
|
21556
21714
|
async function gracefulShutdown(signal) {
|
|
21557
21715
|
console.error(`
|
|
21558
21716
|
[lsp-mcp] Received ${signal}, shutting down gracefully...`);
|
|
@@ -21589,4 +21747,4 @@ main().catch((error2) => {
|
|
|
21589
21747
|
process.exit(1);
|
|
21590
21748
|
});
|
|
21591
21749
|
|
|
21592
|
-
//# debugId=
|
|
21750
|
+
//# debugId=0931320CB6D5336A64756E2164756E21
|