dsh-mcp-connector 0.2.55 → 0.2.57

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/CHANGELOG.md CHANGED
@@ -4,6 +4,18 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.2.57] - 2026-09-22
8
+
9
+ ### Fixed
10
+
11
+ - 打开插件及手动检查更新时刷新版本检测,新增常驻检查入口、检查时间和 npm 检测失败提示;更新服务已发现新版时不再被旧版本缓存隐藏按钮。
12
+
13
+ ## [0.2.56] - 2026-09-22
14
+
15
+ ### Documentation
16
+
17
+ - 补充 macOS/Linux 与 Windows PowerShell 的 stdio 启动排查示例,说明 PATH、command/args、cwd、退出码及无 shell 启动的安全边界(#29)。
18
+
7
19
  ## [0.2.55] - 2026-09-22
8
20
 
9
21
  ### Fixed
package/README.en.md CHANGED
@@ -190,7 +190,7 @@ npm run dev:ui
190
190
 
191
191
  Every Registry merge regenerates `catalog-stats.json`; an hourly workflow in this repository synchronizes the Chinese and English product copy plus a local stats snapshot. The static npm README updates with package releases, while the live badges above read the Registry directly and therefore stay current without another npm release.
192
192
 
193
- The current public version is [`dsh-mcp-connector@0.2.55`](https://www.npmjs.com/package/dsh-mcp-connector), with [GitHub Release v0.2.55](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.55).
193
+ The current public version is [`dsh-mcp-connector@0.2.57`](https://www.npmjs.com/package/dsh-mcp-connector), with [GitHub Release v0.2.57](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.57).
194
194
 
195
195
  See [CHANGELOG.md](CHANGELOG.md) for version history and [docs/DESKTOP-E2E.md](docs/DESKTOP-E2E.md) for the Desktop release checklist.
196
196
 
package/README.md CHANGED
@@ -185,7 +185,7 @@ npm run dev:ui
185
185
 
186
186
  公共 Registry 每次合并后会生成 `catalog-stats.json`;本仓库的定时工作流每小时同步中英文介绍和统计快照。npm 页面中的静态正文随版本发布更新,上方动态统计徽标则直接读取 Registry,可在不发布新 npm 版本时保持实时数量一致。
187
187
 
188
- 当前公开版本为 [`dsh-mcp-connector@0.2.55`](https://www.npmjs.com/package/dsh-mcp-connector),对应 [GitHub Release v0.2.55](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.55)。
188
+ 当前公开版本为 [`dsh-mcp-connector@0.2.57`](https://www.npmjs.com/package/dsh-mcp-connector),对应 [GitHub Release v0.2.57](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.57)。
189
189
 
190
190
  版本能力与变更记录见 [CHANGELOG.md](CHANGELOG.md)。
191
191
  Desktop 发版回归见 [docs/DESKTOP-E2E.md](docs/DESKTOP-E2E.md)。
@@ -297,6 +297,71 @@ OAuth 断开时,插件会尽力调用服务商的撤销端点;无撤销端
297
297
 
298
298
  页面会在有限时间内结束等待,并区分命令不存在、进程退出、初始化失败或启动超时。先在终端确认命令本身可执行、软件包可信、Node/运行时版本满足要求,并检查 `cwd`、参数和环境变量;随后查看 Host 日志并点击“重新检查”。不要把本机凭据写入公开 Registry descriptor。
299
299
 
300
+ #### 1. 确认命令与运行环境
301
+
302
+ stdio 会以当前用户权限在 DSH 所在机器上启动进程,只运行你信任的软件包和命令。先从连接配置记录 `command`、每个 `args` 元素、`cwd` 和所需环境变量名称;不要复制或公开凭据值。以下使用 Node 演示,其他运行时请替换为实际命令。
303
+
304
+ macOS / Linux(终端):
305
+
306
+ ```sh
307
+ command -v node
308
+ node --version
309
+ pwd
310
+ ```
311
+
312
+ Windows(PowerShell):
313
+
314
+ ```powershell
315
+ Get-Command node -All | Select-Object CommandType, Source
316
+ node --version
317
+ Get-Location
318
+ ```
319
+
320
+ 若找不到命令,先按可信软件的官方安装说明配置运行时,再重新打开终端和 DSH。核对服务要求的运行时版本。终端能找到命令,不代表桌面启动的 DSH 具有相同的 `PATH`;版本管理器、别名或 shell 函数也不一定对 DSH 可见。此时可将 `command` 改为本机实际可执行文件的绝对路径,不要填终端别名。
321
+
322
+ #### 2. 在相同目录复现同一 command + args
323
+
324
+ 以下路径是占位符,必须替换为本机已安装、可信服务的实际路径;示例不下载软件、不需要账号或凭据。假设配置的 `command` 是 Node 的绝对路径,`args` 仅包含服务入口文件的绝对路径:
325
+
326
+ macOS / Linux:
327
+
328
+ ```sh
329
+ (
330
+ cd '/absolute/path/to/trusted-server' || exit 1
331
+ '/absolute/path/to/node' '/absolute/path/to/trusted-server/server.js'
332
+ result=$?
333
+ printf 'exit code: %s\n' "$result"
334
+ )
335
+ ```
336
+
337
+ Windows PowerShell:
338
+
339
+ ```powershell
340
+ Push-Location -LiteralPath 'C:\path\to\trusted-server' -ErrorAction Stop
341
+ try {
342
+ & 'C:\path\to\node.exe' 'C:\path\to\trusted-server\server.js'
343
+ Write-Output "exit code: $LASTEXITCODE"
344
+ } finally {
345
+ Pop-Location
346
+ }
347
+ ```
348
+
349
+ 按自己的配置逐项替换参数,不要把整条终端命令塞进 `command`,也不要把所有参数合并成一个字符串。带空格的路径在终端中需要引用;在配置的 `command` 或 `args` 字符串值中保留路径本身,不额外添加 shell 引号。只有服务依赖相对路径时,才需特别核对配置中的 `cwd` 是否存在、可访问且符合服务要求。所需环境变量应在本机安全配置,不要在反馈中粘贴完整 `env` 或包含密钥的命令行。
350
+
351
+ Windows 下 `.cmd` / `.bat` 是脚本包装器,不等同于可直接启动的 `.exe`;PowerShell 中能运行包装器,不代表无 shell 的进程启动也能运行它。若诊断指向包装器,按该服务文档选择原生可执行文件,或用 Node 运行其可信 JavaScript 入口。不要通过设置 `shell: true`、关闭安全检查或执行策略绕过来解决。
352
+
353
+ #### 3. 根据结果定位,再回到页面复查
354
+
355
+ | 观察结果 | 排查方法 |
356
+ |---|---|
357
+ | 命令不存在 / 路径不存在 | 核对运行时安装、绝对路径及 DSH 进程的 `PATH`;同时确认 `cwd` 存在 |
358
+ | 进程立即非零退出 | 查看本地标准错误输出和退出码,核对参数、依赖、运行时版本、文件权限及所需环境变量 |
359
+ | 进程退出码为 0,但没有工具 | 确认启动的是 MCP stdio 服务,不是版本查询、安装器或一次性命令;退出成功不代表 MCP 初始化成功 |
360
+ | 进程一直等待、没有输出 | stdio 服务可能正在等待客户端输入,这是正常可能性;终端启动只能验证进程,不证明 MCP 握手成功。可按 Ctrl+C 结束,再由 DSH 发起检查 |
361
+ | 终端能启动,页面初始化失败 / 超时 | 对比 DSH 的 command/args/env/cwd,查看 Host 日志;确认服务支持 MCP stdio,且普通日志未污染用于协议通信的 stdout(日志应写 stderr) |
362
+
363
+ 修正后重新启动 DSH(如变更了进程环境),在连接详情点击“重新检查”,确认工具发现结果。反馈时只提交版本、脱敏后的诊断代码、退出码和必要日志;不要上传 Token、API Key、完整环境变量或个人路径。
364
+
300
365
  ### 为什么显示“状态未知”
301
366
 
302
367
  这表示插件没有足够证据确认健康或失败,常见于 DSH 刚重启、尚未执行健康检查,或当前 Host 无法读取 stdio 工具注册状态。点击“刷新连接器目录”或进入详情重新检查;若仍为未知,根据诊断的 `code` 和建议查看 Host 日志或升级 Host。不要把“状态未知”理解为“已连接”。
package/lib/client.js CHANGED
@@ -448,11 +448,11 @@ window.__ModuleLoader__.load({
448
448
  return mount;
449
449
  }
450
450
 
451
- async function fetchVersionStatus() {
451
+ async function fetchVersionStatus(force = false) {
452
452
  const response = await window.fetch("/mcp-connector/api", {
453
453
  method: "POST",
454
454
  headers: { "content-type": "application/json" },
455
- body: JSON.stringify({ method: "versionStatus", params: {} })
455
+ body: JSON.stringify({ method: "versionStatus", params: { force } })
456
456
  });
457
457
  const result = await response.json();
458
458
  if (!response.ok || result.ok !== true || result.detail === void 0) {
@@ -1069,6 +1069,9 @@ window.__ModuleLoader__.load({
1069
1069
  const [rollbackRunning, setRollbackRunning] = (0, react.useState)(false);
1070
1070
  const [restarting, setRestarting] = (0, react.useState)(false);
1071
1071
  const [manualCommandCopied, setManualCommandCopied] = (0, react.useState)(false);
1072
+ const [versionCheckRequest, setVersionCheckRequest] = (0, react.useState)(0);
1073
+ const [versionCheckBusy, setVersionCheckBusy] = (0, react.useState)(false);
1074
+ const [versionCheckFailed, setVersionCheckFailed] = (0, react.useState)(false);
1072
1075
  const frameRef = (0, react.useRef)(null);
1073
1076
  const closeRef = (0, react.useRef)(null);
1074
1077
  (0, react.useEffect)(() => {
@@ -1125,10 +1128,13 @@ window.__ModuleLoader__.load({
1125
1128
  window.clearTimeout(pollTimer);
1126
1129
  pollTimer = window.setTimeout(check, Math.max(1e3, delayMs));
1127
1130
  };
1128
- const check = () => {
1129
- fetchVersionStatus().then((status) => {
1131
+ const check = (force = false) => {
1132
+ setVersionCheckBusy(true);
1133
+ fetchVersionStatus(force).then((status) => {
1130
1134
  if (disposed) return;
1131
1135
  setVersionStatus(status);
1136
+ setVersionCheckBusy(status.checking === true);
1137
+ setVersionCheckFailed(!status.checking && status.sources?.npm?.ok !== true);
1132
1138
  if (status.checking) {
1133
1139
  schedule(1e3);
1134
1140
  return;
@@ -1140,15 +1146,19 @@ window.__ModuleLoader__.load({
1140
1146
  schedule(delay);
1141
1147
  }, (error) => {
1142
1148
  console.warn("[mcp-connector] plugin update check failed:", error);
1143
- if (!disposed) schedule(VERSION_CHECK_RETRY_MS);
1149
+ if (!disposed) {
1150
+ setVersionCheckBusy(false);
1151
+ setVersionCheckFailed(true);
1152
+ schedule(VERSION_CHECK_RETRY_MS);
1153
+ }
1144
1154
  });
1145
1155
  };
1146
- check();
1156
+ check(true);
1147
1157
  return () => {
1148
1158
  disposed = true;
1149
1159
  window.clearTimeout(pollTimer);
1150
1160
  };
1151
- }, [open]);
1161
+ }, [open, versionCheckRequest]);
1152
1162
  (0, react.useEffect)(() => {
1153
1163
  if (open) setManualCommandCopied(false);
1154
1164
  }, [open, versionStatus?.latestVersion]);
@@ -1175,7 +1185,7 @@ window.__ModuleLoader__.load({
1175
1185
  setUpdateProviderState("unavailable");
1176
1186
  });
1177
1187
  return () => { disposed = true; };
1178
- }, [open]);
1188
+ }, [open, versionCheckRequest]);
1179
1189
  (0, react.useEffect)(() => {
1180
1190
  const operationId = updateOperation?.operationId;
1181
1191
  const provider = updateProviderSelection?.provider;
@@ -1319,7 +1329,9 @@ window.__ModuleLoader__.load({
1319
1329
  const activationPendingVersion = updateProviderState === "ready"
1320
1330
  ? pendingActivationVersion(versionStatus, providerUpdateCheck)
1321
1331
  : null;
1322
- if (!versionStatus?.updateAvailable && activationPendingVersion === null
1332
+ if (!versionStatus?.updateAvailable
1333
+ && !(updateProviderState === "ready" && providerUpdateCheck?.updateAvailable === true)
1334
+ && activationPendingVersion === null
1323
1335
  && updateOperation === null && updateError === null) return null;
1324
1336
  if (updateRunning) {
1325
1337
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -1573,6 +1585,19 @@ window.__ModuleLoader__.load({
1573
1585
  children: versionStatus === null ? "v…" : `v${versionStatus.installedVersion}`
1574
1586
  }),
1575
1587
  renderUpdateControls(),
1588
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1589
+ type: "button",
1590
+ className: "mcpConnectorUpdateButton",
1591
+ disabled: versionCheckBusy || updateRunning,
1592
+ title: versionStatus?.checkedAt ? `上次检查:${new Date(versionStatus.checkedAt).toLocaleString()}` : "尚未完成版本检查",
1593
+ onClick: () => setVersionCheckRequest((value) => value + 1),
1594
+ children: versionCheckBusy ? "正在检查更新…" : "检查更新"
1595
+ }),
1596
+ versionCheckFailed && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1597
+ className: "mcpConnectorUpdateStatus",
1598
+ "data-tone": "error",
1599
+ children: "暂时无法确认 npm 最新版本,请重试"
1600
+ }),
1576
1601
  versionStatus?.releasePending && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1577
1602
  className: "mcpConnectorVersion",
1578
1603
  title: "GitHub Release 已发布,等待 npm 同步后即可更新",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-mcp-connector",
3
- "version": "0.2.55",
3
+ "version": "0.2.57",
4
4
  "description": "DeepSeek Harness MCP Connector: connect servers, search tools across active connections, and troubleshoot discovery. Includes a continuously updated catalog; supports OAuth 2.0 PKCE, API keys, Streamable HTTP/stdio, and mcpServers JSON import.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",