自动拉起 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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 26 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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 请自行从上游获取,并自行遵循其许可条款
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
SodiumLayer/dsh-obscura
自动拉起 Obscura MCP 服务并检测接入状态
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目