🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

Obscura 接入管家 SodiumLayer/dsh-obscura

DeepSeek Harness
SodiumLayer26 天前有提交已提供中文文档扫描:含敏感能力

自动拉起 Obscura MCP 服务并检测接入状态

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/8 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add SodiumLayer/dsh-obscura
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · browser
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 26 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 54 处,展示前 54 条)
  • 发起网络请求
    client.js:223
    const response = await fetch(`${API}${path}`, {
  • 读取本地文件
    lib/binary.js:114
    const readdir = deps.readdir ?? ((dir) => readdirSync(dir))
  • 读取本地文件
    lib/binary.js:117
    return statSync(file).isDirectory()
  • 执行外部命令来自配置/变量
    lib/binary.js:196
    execFile(file, args, { windowsHide: true, timeout: 10_000, maxBuffer: 1024 * 1024 }, (error, stdout, stderr) => {
  • 读取本地文件
    lib/mcp-config.js:357
    if (!existsSync(file)) return { present: false }
  • 读取本地文件
    lib/mcp-config.js:358
    return parseMcpRow(readFileSync(file, 'utf8'))
  • 写入本地文件
    lib/mcp-config.js:384
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    lib/mcp-config.js:386
    writeFileSync(temporary, text, 'utf8')
  • 写入本地文件
    lib/mcp-config.js:387
    renameSync(temporary, file)
  • 读取本地文件
    lib/mcp-config.js:405
    const existingText = existsSync(file) ? readFileSync(file, 'utf8') : ''
  • 读取本地文件
    lib/mcp-config.js:405
    const existingText = existsSync(file) ? readFileSync(file, 'utf8') : ''
  • 读取本地文件
    lib/mcp-config.js:547
    if (!existsSync(file)) return { written: false, outcome: 'absent', row: { present: false } }
  • 读取本地文件
    lib/mcp-config.js:548
    const existingText = readFileSync(file, 'utf8')
  • 读取本地文件
    lib/paths.js:39
    if (existsSync(join(current, 'package.json'))) return current
  • 写入本地文件
    lib/process.js:171
    mkdirSync(dirname(this.logPath), { recursive: true })
  • 写入本地文件
    lib/process.js:172
    appendFileSync(this.logPath, stamp, 'utf8')
  • 读取本地文件
    lib/routes.js:232
    binDirExists: existsSync(paths.binDir),
  • 读取本地文件
    lib/settings.js:231
    if (existsSync(this.file)) {
  • 读取本地文件
    lib/settings.js:232
    mtimeMs = statSync(this.file).mtimeMs
  • 读取本地文件
    lib/settings.js:233
    text = readFileSync(this.file, 'utf8')
  • 写入本地文件
    lib/settings.js:262
    mkdirSync(dirname(this.file), { recursive: true })
  • 写入本地文件
    lib/settings.js:264
    writeFileSync(temporary, `${JSON.stringify(merged, null, 2)}\n`, 'utf8')
  • 写入本地文件
    lib/settings.js:265
    renameSync(temporary, this.file)
  • 读取本地文件
    lib/settings.js:268
    this.cachedMtimeMs = statSync(this.file).mtimeMs
  • 读取本地文件
    lib/system.js:31
    if (!statSync(target).isDirectory()) return { opened: false, path: target, error: `${target} 不是一个目录` }
  • 读取本地文件
    lib/system.js:61
    if (!statSync(dir).isDirectory()) return false
  • 读取本地文件
    lib/system.js:62
    accessSync(dir, constants.W_OK)
  • 读取本地文件
    src/binary.js:114
    const readdir = deps.readdir ?? ((dir) => readdirSync(dir))
  • 读取本地文件
    src/binary.js:117
    return statSync(file).isDirectory()
  • 执行外部命令来自配置/变量
    src/binary.js:196
    execFile(file, args, { windowsHide: true, timeout: 10_000, maxBuffer: 1024 * 1024 }, (error, stdout, stderr) => {
  • 发起网络请求
    src/client/index.js:223
    const response = await fetch(`${API}${path}`, {
  • 读取本地文件
    src/mcp-config.js:357
    if (!existsSync(file)) return { present: false }
  • 读取本地文件
    src/mcp-config.js:358
    return parseMcpRow(readFileSync(file, 'utf8'))
  • 写入本地文件
    src/mcp-config.js:384
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    src/mcp-config.js:386
    writeFileSync(temporary, text, 'utf8')
  • 写入本地文件
    src/mcp-config.js:387
    renameSync(temporary, file)
  • 读取本地文件
    src/mcp-config.js:405
    const existingText = existsSync(file) ? readFileSync(file, 'utf8') : ''
  • 读取本地文件
    src/mcp-config.js:405
    const existingText = existsSync(file) ? readFileSync(file, 'utf8') : ''
  • 读取本地文件
    src/mcp-config.js:547
    if (!existsSync(file)) return { written: false, outcome: 'absent', row: { present: false } }
  • 读取本地文件
    src/mcp-config.js:548
    const existingText = readFileSync(file, 'utf8')
  • 读取本地文件
    src/paths.js:39
    if (existsSync(join(current, 'package.json'))) return current
  • 写入本地文件
    src/process.js:171
    mkdirSync(dirname(this.logPath), { recursive: true })
  • 写入本地文件
    src/process.js:172
    appendFileSync(this.logPath, stamp, 'utf8')
  • 读取本地文件
    src/routes.js:232
    binDirExists: existsSync(paths.binDir),
  • 读取本地文件
    src/settings.js:231
    if (existsSync(this.file)) {
  • 读取本地文件
    src/settings.js:232
    mtimeMs = statSync(this.file).mtimeMs
  • 读取本地文件
    src/settings.js:233
    text = readFileSync(this.file, 'utf8')
  • 写入本地文件
    src/settings.js:262
    mkdirSync(dirname(this.file), { recursive: true })
  • 写入本地文件
    src/settings.js:264
    writeFileSync(temporary, `${JSON.stringify(merged, null, 2)}\n`, 'utf8')
  • 写入本地文件
    src/settings.js:265
    renameSync(temporary, this.file)
  • 读取本地文件
    src/settings.js:268
    this.cachedMtimeMs = statSync(this.file).mtimeMs
  • 读取本地文件
    src/system.js:31
    if (!statSync(target).isDirectory()) return { opened: false, path: target, error: `${target} 不是一个目录` }
  • 读取本地文件
    src/system.js:61
    if (!statSync(dir).isDirectory()) return false
  • 读取本地文件
    src/system.js:62
    accessSync(dir, constants.W_OK)
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 启动并健康检查服务
  • 解析可执行文件路径
  • 同步配置档条目

DeepSeek Harness 的 Obscura 设置页插件:启动并健康检查 obscura MCP 服务器,从 PATH 或 bin/ 解析其可执行文件,并保持配置档里的 mcp-obscura 条目同步。

README

由 DeepSeek 最新模型翻译生成
dsh-obscura-plugin DeepSeek Harness 的 Obscura 懒人插件:DeepSeek Harness 启动时自动拉起 obscura 的 MCP 服务 安装与使用的详细说明见 INSTALL.md。 dsh plugin --profile web add github:SodiumLayer/dsh-obscura 它做什么 | 需求 | 实现 | | DSH 启动时自动启动 obscura 的 MCP 服务 | 宿主半在启动序列里解析可执行文件并 spawn obscura mcp --http --port <port>,轮询 MCP 握手确认真的可用,随 DSH 退出停止(只停自己启动的进程) | | 报告 obscura 是否可用 + 不可用时的下载入口 | 面板只显示一条 版本 信息,来自真实执行的 obscura --version ;拿不到版本就显示「不可用」| | 插件目录内放置可执行文件 + 一键跳转 | 包内 bin\ 目录 + 面板「打开文件夹」按钮;解析优先级:自定义路径 → 系统 PATH → 插件 bin\(含解压出的子目录)。
展开完整文档(README 剩余 1 节)
dsh-obscura-plugin

DeepSeek Harness 的 Obscura 懒人插件:DeepSeek Harness 启动时自动拉起 obscura 的 MCP 服务

安装与使用的详细说明见 INSTALL.md。

dsh plugin --profile web add github:SodiumLayer/dsh-obscura

它做什么

| 需求 | 实现 |
| DSH 启动时自动启动 obscura 的 MCP 服务 | 宿主半在启动序列里解析可执行文件并 spawn obscura mcp --http --port <port>,轮询 MCP 握手确认真的可用,随 DSH 退出停止(只停自己启动的进程) |
| 报告 obscura 是否可用 + 不可用时的下载入口 | 面板只显示一条 版本 信息,来自真实执行的 obscura --version ;拿不到版本就显示「不可用」|
| 插件目录内放置可执行文件 + 一键跳转 | 包内 bin\ 目录 + 面板「打开文件夹」按钮;解析优先级:自定义路径 → 系统 PATH → 插件 bin\(含解压出的子目录)。自定义路径既接受可执行文件,也接受它所在的文件夹 |
| 一键测试 harness 是否已接入 obscura MCP | 「测试接入」分两段:服务段直接请求面板上那个 MCP 接入地址做 initialize + tools/list;接入段读 loader 条目与 mcp__obscura__ 工具数 —— 分开才能区分「服务没跑」与「服务在跑但没接入」 |
| MCP 配置开关 + 接入地址 | 开关:开 = 在 profile 的 cordis.patch.yml 写入/复用它的一行 mcp-obscura;关 = 移除该行。接入地址文本框留空则随 --port 自动生成 http://localhost:<端口>/mcp,填写则用你的地址;端口/地址变化时配置行自动跟随,手工改错了则会被明确提示不一致 |
| 服务控制 | 启动服务 / 重启服务 / 停止服务 三个按钮,外加一个自定义启动参数文本框:插件只固定子命令 mcp,host、port、stealth 等全部由这个框决定(默认 --http --host 127.0.0.1 --port 3000) |

设计要点(为什么这样写)

- 零运行时依赖:宿主半只用 node 内置模块。面板不依赖任何前端库(只用宿主注入的 react)。
- patch 文件逐行编辑:cordis.patch.yml 是你拥有的文件。本插件只替换/删除/追加 mcp-obscura 那一行,文件头注释、其他插件行、以及它无法解释的 !!js 表达式逐字节保留(有往返不变性单测)。
- 绝不假装成功:文件存在 ≠ 能运行(要真执行 --version);进程在跑 ≠ 服务健康(要真发 MCP 请求);写入配置 ≠ 已生效(挂载发生在启动时,面板会说要重启)。
- 不越界:不结束别人的进程(端口被占就报冲突)、不接管外部实例的生命周期、不联网下载其他文件、open-folder 只允许打开自己的 bin。
- 所有权由子进程句柄决定,不由一个布尔标志决定:只要本实例持有子进程句柄,那个进程就是「我们的」,停止服务一定杀得掉。曾经额外依赖一个 owned 标志,导致重复点「启动服务」时把自己刚拉起的监听误判成外部实例、清掉标志,从此停止服务也杀不掉它 —— 这是已修复的真实缺陷。
- 参数框是唯一控制面:插件只固定 mcp 子命令与「按参数里的 --port 连接」这件事,主机/端口/stealth/proxy 全部来自参数框;--port 决定健康检查与 harness 接入地址,因此改端口会跟着改,缺 --http 会明确报错而不是静默跑 stdio。
- 配置行是设置的投影,不是第二个真源:cordis.patch.yml 里那一行由 effectiveMcpUrl() 生成并随设置自动重写。曾经两者各自演化,导致面板测的是新端口、harness 指着旧端口 —— 面板现在还会在两者不一致时明确报警,而不是把旧值当「服务段」显示出来。
- 状态只有一个真源:MCP 开关反映的是 cordis.patch.yml 里那一行是否存在,而不是「是否已挂载」;挂载与否由「测试接入」的接入段报告。两者不混为一谈。
- 一个开关只留一处:stealth 曾是独立设置项,现在被折算进启动参数(旧的 stealth: true 会自动迁移),面板上每个能改变行为的项都看得见、改得动。
- 不阻断 DSH:Obscura 的任何失败都收敛为面板上的一个状态与一行原因,而不是启动异常。
- 采用宿主事实:profile 的 dir / patchPath 取自主机的 profileContext,不靠猜 —— 否则自定义 profile 会改错文件。

许可

MIT

非官方声明

本项目是第三方插件,与 DeepSeek(DeepSeek Harness)及 Obscura 上游均无隶属关系,亦未获其背书;相关名称与商标归各自所有者

本仓库不包含、也不分发 obscura 的任何二进制或源码:bin/.exe 请自行从上游获取,并自行遵循其许可条款
预览分享卡片长什么样 ↓SodiumLayer/dsh-obscura
分享 · DeepSeek Harness Hub
SodiumLayer/dsh-obscura

自动拉起 Obscura MCP 服务并检测接入状态

这是你的仓库?认领条目

回到顶部