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

DOT 桥接 xuanmingguo/dot-deepseek-harness-mcp

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

在 DOT 聊天里派任务给 Harness 并核对结果

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · tool
装得上吗
本站尚未做安装检查
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 17 天前
档位由哪些信号合成

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 60 处,展示前 56 条)
  • 删除本地文件
    src/authority/authority-registry-facade.ts:198
    await unlink(ownerPath)
  • 写入本地文件
    src/authority/registry-guard.ts:23
    await mkdir(dirname(path), { recursive: true })
  • 删除本地文件
    src/authority/registry-guard.ts:40
    await unlink(temporary)
  • 删除本地文件
    src/authority/registry-guard.ts:44
    try { await unlink(temporary) } catch (cleanupError) { if (!isCode(cleanupError, 'ENOENT')) throw cleanupError }
  • 删除本地文件
    src/authority/registry-guard.ts:94
    await unlink(path)
  • 执行外部命令来自配置/变量
    src/browser-opener.ts:14
    const child = spawn(executable, [url.href], { stdio: 'ignore', windowsHide: true })
  • 读取本地文件
    src/config.ts:82
    : readFileSync(env.DSH_RELAY_EXTERNAL_PATHS_FILE, 'utf8')
  • 读取本地文件
    src/external-paths.ts:68
    try { info = await stat(target) }
  • 读取本地文件
    src/external-paths.ts:91
    const path = await realpath(current)
  • 读取本地文件
    src/external-paths.ts:92
    const info = await stat(path)
  • 读取本地文件
    src/external-paths.ts:103
    if ((await lstat(current)).isSymbolicLink()) {
  • 读取本地文件
    src/external-paths.ts:105
    current = resolve(dirname(current), await readlink(current))
  • 删除本地文件
    src/harness-entry.ts:352
    if (input.removeEndpoint) await attempt(() => unlink(input.endpointDescriptorFile).catch(ignoreMissing))
  • 发起网络请求
    src/harness-entry.ts:361
    const response = await fetch(url, {
  • 读取本地文件
    src/harness-entry.ts:443
    const value = JSON.parse(readFileSync(join(directory, 'package.json'), 'utf8')) as { name?: string; version?: string }
  • 发起网络请求
    src/harness-gateway/in-process-dispatch-handler.ts:27
    if (scope === undefined) return this.delegate.fetch(input, init)
  • 发起网络请求
    src/harness-gateway/in-process-dispatch-handler.ts:39
    return this.delegate.fetch(input, init)
  • 写入本地文件
    src/mcp-http/token-store-facade.ts:18
    await mkdir(dirname(source.tokenFile), { recursive: true })
  • 删除本地文件
    src/mcp-http/token-store-facade.ts:34
    await unlink(temporary)
  • 删除本地文件
    src/mcp-http/token-store-facade.ts:38
    try { await unlink(temporary) } catch (cleanupError) {
  • 读取本地文件
    src/native-control/native-control-facade.ts:236
    if (await realpath('/proc/self/fd/' + directory.fd) !== root) fail('ARTIFACT_PATH_DENIED', 'Artifact root changed during resolution')
  • 读取本地文件
    src/native-control/native-control-facade.ts:243
    const openedPath = await realpath('/proc/self/fd/' + file.fd)
  • 读取本地文件
    src/native-control/native-control-facade.ts:257
    if (before.size !== after.size || before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs || await realpath('/proc/self/fd/' + file.fd) !
  • 读取本地文件
    src/native-control/native-control-facade.ts:280
    const path = await realpath(registered.path)
  • 读取本地文件
    src/native-control/native-control-facade.ts:281
    if (!(await stat(path)).isDirectory()) fail('WORKSPACE_DENIED', 'Registered workspace must be a project directory')
  • 读取本地文件
    src/native-control/native-control-facade.ts:283
    const roots = await Promise.all(this.options.allowedWorkspaceRoots.map(root => realpath(root)))
  • 读取本地文件
    src/native-control/project-files.ts:54
    if (await realpath('/proc/self/fd/' + handle.fd) !== expected) changed()
  • 读取本地文件
    src/native-control/project-files.ts:61
    const stream = await opendir('/proc/self/fd/' + directory!.fd, { encoding: 'buffer' as BufferEncoding, bufferSize: 1 })
  • 读取本地文件
    src/native-control/project-files.ts:82
    if (await realpath('/proc/self/fd/' + pinned.handle.fd) !== pinned.path || identity(await pinned.handle.stat({ bigint: true })) !== pinned.identity) c
  • 读取本地文件
    src/native-control/project-search.ts:78
    if (await realpath('/proc/self/fd/' + handle.fd) !== expected) changed()
  • 读取本地文件
    src/native-control/project-search.ts:160
    const stream = await opendir('/proc/self/fd/' + directory.handle.fd, { encoding: 'buffer' as BufferEncoding, bufferSize: 1 })
  • 读取本地文件
    src/native-control/project-search.ts:242
    if (await realpath('/proc/self/fd/' + pinned.handle.fd) !== pinned.path || identity(await pinned.handle.stat({ bigint: true })) !== pinned.identity) c
  • 读取本地文件
    src/native-control/project-text.ts:58
    if (await realpath('/proc/self/fd/' + handle.fd) !== expected) changed()
  • 读取本地文件
    src/native-control/project-text.ts:142
    if (await realpath('/proc/self/fd/' + pinned.handle.fd) !== pinned.path || identity(await pinned.handle.stat({ bigint: true })) !== pinned.identity) c
  • 写入本地文件
    src/relay-runtime/path-resolver.ts:171
    await mkdir(directory, { recursive: true })
  • 读取本地文件
    src/relay-runtime/path-resolver.ts:172
    await access(directory, constants.W_OK)
  • 写入本地文件
    src/state-repository/atomic-json-file.ts:15
    await mkdir(directory, { recursive: true })
  • 写入本地文件
    src/state-repository/atomic-json-file.ts:27
    await rename(temporary, path)
  • 删除本地文件
    src/state-repository/atomic-json-file.ts:31
    await unlink(temporary)
  • 写入本地文件
    src/state-repository/file-lock-facade.ts:71
    await mkdir(dirname(lockPath), { recursive: true })
  • 删除本地文件
    src/state-repository/file-lock-facade.ts:95
    await unlink(temporary)
  • 删除本地文件
    src/state-repository/file-lock-facade.ts:99
    try { await unlink(temporary) } catch (cleanupError) { if (!isCode(cleanupError, 'ENOENT')) throw cleanupError }
  • 写入本地文件
    src/state-repository/file-lock-facade.ts:185
    await rename(lockPath, tombstone)
  • 删除本地文件
    src/state-repository/file-lock-facade.ts:200
    await unlink(tombstone)
  • 删除本地文件
    src/state-repository/file-lock-facade.ts:210
    await unlink(tombstone)
  • 删除本地文件
    src/state-repository/file-lock-facade.ts:244
    await unlink(tombstone)
  • 写入本地文件
    src/state-repository/file-permissions.ts:97
    await chmod(path, 0o600)
  • 读取本地文件
    src/state-repository/file-permissions.ts:123
    const mode = (await stat(path)).mode & 0o777
  • 执行外部命令来自配置/变量
    src/state-repository/file-permissions.ts:170
    const child = spawn(command, args, {
  • 读取本地文件
    src/state-store.ts:186
    entries = await readdir(directory, { withFileTypes: true })
  • 写入本地文件
    src/state-store.ts:206
    await rename(this.path, quarantined)
  • 读取本地文件
    src/stdio-proxy/host-autostart-facade.ts:50
    this.accessPath = dependencies.accessPath ?? (path => access(path, constants.F_OK))
  • 执行外部命令来自配置/变量
    src/stdio-proxy/host-autostart-facade.ts:179
    const child = spawn(launcher.command, launcher.args, backgroundSpawnOptions(launcher))
  • 读取本地文件
    src/strict-utf8.ts:40
    bytes = await readFile(path)
  • 读取本地文件
    src/workspace-routing/workspace-routing-facade.ts:68
    const resolved = await realpath(input)
  • 读取本地文件
    src/workspace-routing/workspace-routing-facade.ts:69
    if (!(await stat(resolved)).isDirectory()) throw new Error('workspace must be a directory')
扫描于 2026/11/3(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent-presets@deepseek-ai/dsh-api-gateway@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-api-settings-controller@deepseek-ai/dsh-api-workspace-controller@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-permission-presets@deepseek-ai/dsh-session@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

在 DOT 主聊天中操控已有 DeepSeek Harness:派任务、查历史、搜文件、核对结果。MCP bridge for existing Harness.

README

由 DeepSeek 最新模型翻译生成
DOT × DeepSeek Harness 中文首页 · 简体中文 · English · 安装指南 · 工具说明 · MIT 许可证 让 DOT 主聊天直接操控已有的 DeepSeek Harness:派任务、查进度、找历史、搜文件,并核对真实结果。复用现有项目、模型与会话,不另起 Harness Host,也不创建 Work/Codex 聊天。 DOT 通过私有 MCP Tunnel 连接已有 Harness 的功能总览 可以用它做什么 | 你想做的事 | 它提供的能力 | | 把任务交给 Harness | 提交任务、查看进度、续接会话、排队、引导和取消,保留原始任务与操作编号 | | 找回以前做过的工作 | 按项目、会话、状态筛选任务;关键词检索原始历史,展开命中消息及前文 | | 在项目中找到文件和代码 | 浏览目录、搜索文件内容,返回真实路径、匹配行和片段,再按行或末尾读取 | | 核对结果与处理断线 | 用文件 SHA-256 校验内容;查询原请求和原生历史,避免不确定时重复派发 | 可以直接在 DOT 中描述目标,例如: “找一下这个项目之前做过的分页修复,把原来的结果给我。” “搜索项目里包含这个关键词的文件,告诉我文件名和具体行号。” “把这项修改交给 Harness,完成后读回结果并核对文件。
展开完整文档(README 剩余 1 节)
DOT × DeepSeek Harness

中文首页 · 简体中文 · English · 安装指南 · 工具说明

· MIT 许可证

让 DOT 主聊天直接操控已有的 DeepSeek Harness:派任务、查进度、找历史、搜文件,并核对真实结果。复用现有项目、模型与会话,不另起 Harness Host,也不创建 Work/Codex 聊天。

DOT 通过私有 MCP Tunnel 连接已有 Harness 的功能总览

可以用它做什么

| 你想做的事 | 它提供的能力 |
| 把任务交给 Harness | 提交任务、查看进度、续接会话、排队、引导和取消,保留原始任务与操作编号 |
| 找回以前做过的工作 | 按项目、会话、状态筛选任务;关键词检索原始历史,展开命中消息及前文 |
| 在项目中找到文件和代码 | 浏览目录、搜索文件内容,返回真实路径、匹配行和片段,再按行或末尾读取 |
| 核对结果与处理断线 | 用文件 SHA-256 校验内容;查询原请求和原生历史,避免不确定时重复派发 |

可以直接在 DOT 中描述目标,例如:

“找一下这个项目之前做过的分页修复,把原来的结果给我。”

“搜索项目里包含这个关键词的文件,告诉我文件名和具体行号。”

“把这项修改交给 Harness,完成后读回结果并核对文件。”

版本 0.2.18-dsh021a2.14 在兼容 Host 中提供 48 个工具,已适配 Harness 0.2.1-alpha.2。实际工具、模型和权限以运行中的 tools/list 与 get_operational_capabilities 为准。

看一次实际搜索与读回

下面使用通用演示文件,展示本轮原 DOT 的真实只读返回:搜索关键词,定位 notes/task-notes.md 第 3 行,再用本次命中的 SHA-256 校验读回。

实际搜索命中、原行号与 SHA 校验读回的可视化演示

这是真实返回的可视化整理,并非原始聊天截图;仅保留相对搜索目录的文件路径和通用内容。脱敏结果摘录可直接查看。演示文件共 4 行,本次只读回命中行,返回的续读位置是第 4 行。

它如何连接

DOT 主聊天 → OpenAI Secure MCP Tunnel → 本地 stdio proxy → 已有 Harness Host 内的 Relay 插件 → 原生项目、会话与任务

基于固定版本的 Harness Relay MCP,通过 Harness 公共插件 API 接入,不修改上游 Harness。固定来源及版本见 UPSTREAM.json。

使用前需要已有 Harness,以及账号、工作空间与 Platform 组织允许的 DOT / 自定义 MCP / Tunnel 权限。开源代码本身不授予这些产品权限。请参考官方连接说明。

从源码开始

需要 Node.js >=22.19;CI 使用 pnpm 12.11.2:

git clone https://github.com/xuanmingguo/dot-deepseek-harness-mcp.git
cd dot-deepseek-harness-mcp
pnpm install --frozen-lockfile
pnpm run prepack
pnpm test
pnpm run test:package
npm pack --ignore-scripts

prepack 包含类型检查、构建与包内容校验。最后生成 harness-relay-mcp-0.2.18-dsh021a2.14.tgz,按安装与运维指南接入已有 Harness profile,再配置自己的 Tunnel。

保留上游 npm 包名是为了兼容。本 fork 尚未发布到 npm;直接安装 registry 包或运行 npx harness-relay-mcp 不会选中这里的修改。

文档与验证

| 文档 | 内容 |
| 安装与运维 | 构建、已有 profile 接入、Tunnel、工具刷新、诊断与回滚 |
| 工具说明 · 完整目录 | 输入、输出、权限与恢复约定 |
| 历史搜索 · 消息上下文 | 找到旧任务后核对原始消息 |
| 目录发现 · 文本读取 · 内容搜索 | 文件查询、范围、扫描覆盖与校验边界 |
| 验证记录与复测方法 | 区分本地测试、已安装插件和原 DOT 实测 |
| 同类项目对照 | 功能来源、重合与边界 |

公开版本已通过原生测试、类型/构建/打包与隐私检查;原 DOT 也完成过任务、历史和文件读回验证。具体结果与适用边界见验收文档,持续检查见上方 CI。

权限与隐私

start_run 缺省为只读。示例保持 DSH_RELAY_TRUSTED_OPERATOR=false;文件范围属于任务指令与准入校验,不是 OS 逐路径隔离。需要写入或部署时,按实际授权明确指定范围与权限,详见权限约定和部署契约。

项目不提供模型凭据或订阅。Token、Tunnel 配置、原聊天历史、任务 journal、个人路径、备份和原始回执留在私有环境。发生超时或断线,先查原 runId / operationId,不要换键重派。

许可与贡献

采用 MIT;保留上游 LICENSE 与固定来源,维护归属见 NOTICE。这是独立维护的集成,不代表 OpenAI 或 DeepSeek 官方支持。

欢迎提供可复现的问题与改进,提交前请移除个人信息。见 贡献说明与安全报告。图示提供 PNG 与可编辑 SVG,均使用通用展示内容。
预览分享卡片长什么样 ↓xuanmingguo/dot-deepseek-harness-mcp
分享 · DeepSeek Harness Hub
xuanmingguo/dot-deepseek-harness-mcp

在 DOT 聊天里派任务给 Harness 并核对结果

这是你的仓库?认领条目

回到顶部