Skip to main content
Glama
cute-aaa

DS Web Local

by cute-aaa
README.md
# DS Web Local

[![CI](https://github.com/cute-aaa/ds-web-local/actions/workflows/ci.yml/badge.svg)](https://github.com/cute-aaa/ds-web-local/actions/workflows/ci.yml)

可插拔的本地 Agent 能力中台 —— 让【网页版 DeepSeek】获得本地 Agent 能力(MCP / 文件操作 / 技能 / 桌面自动化),也让本地 agent(Hermes / Claude Desktop)复用同一套工具。

> ⚠️ **声明**:本项目仅供个人学习研究使用,不得用于商业用途。本项目通过浏览器油猴脚本桥接实现与 DeepSeek 网页版的交互,使用时请遵守 DeepSeek 官方服务条款。使用者需自行承担因使用本项目而产生的一切风险和责任。

## 特性

- 🔌 **MCP 双角色**:作为 MCP 客户端接入外部 MCP 服务(stdio / streamable-http),聚合后统一暴露
- 🛠️ **24 个内置工具**:文件读写 / 目录 / 搜索 / Git / 终端 / 审批 / 技能加载 / 凭据引用 / Web 搜索
- 🖥️ **Windows 桌面自动化**:窗口管理、点击/输入/截图、注册表、进程、系统通知(windows-mcp)
- 🧩 **技能系统**:SKILL.md 多根发现(bundled / user / custom / hermes 只读源)、按需加载、导入导出
- 🔑 **凭据引用模型**:配置只存引用不存值,环境变量遮蔽,控制台永不显示明文
- 📜 **管理控制台**:React SPA —— MCP 服务 / 技能 / 工具日志 / 凭据 / 审批 / 设置
- 🔁 **高可靠桥接**:fetch/XHR 劫持 + DOM 观察三通道监听、四级 JSON 宽容解析、状态机重连

## 架构

```
┌─────────────────┐   Tampermonkey 油猴脚本    ┌──────────────────┐
│  网页版 DeepSeek │ ◄────────────────────────► │                  │
│  (chat.deepseek)│   start:{...}end 工具协议    │   本地后端 :8088  │
└─────────────────┘                            │  FastAPI + MCP   │
                                               │  工具聚合中心     │
┌─────────────────┐   HTTP (console SPA)      │                  │
│  管理控制台      │ ◄────────────────────────► │  技能 / 凭据      │
│  (React)        │                            │  审批 / 事件流    │
└─────────────────┘                            └────────┬─────────┘
                                                        │ MCP (stdio/http)
                                          ┌─────────────┼─────────────┐
                                          ▼             ▼             ▼
                                    windows-mcp   外部 MCP 服务    Hermes 技能库
```

| 部分 | 目录 | 职责 |
|---|---|---|
| 本地后端 | `backend/` | FastAPI + MCP 工具聚合中心(依赖 Python 3.11+) |
| 桥接层 | `bridge/` | 网页版桥接(站点无关引擎 + DeepSeek 适配器),`build.py` 打包 user.js |
| 管理控制台 | `console/` | React SPA(Vite + Tailwind),构建产物由后端静态托管 |

## 界面预览

![管理控制台](docs/screenshot-console.png)

## 快速开始

> 非开发者/第一次接触?先看 [用户指南(图文步骤)](docs/USER_GUIDE.md)。

### 1. 安装依赖

| 依赖 | 用途 | 安装方式 |
|---|---|---|
| Python 3.11+ | 后端运行 | [python.org](https://www.python.org/) 或 [uv](https://docs.astral.sh/uv/) |
| pip / uv | Python 包管理 | pip 随 Python 自带;uv: `pip install uv` |
| Node.js 20+ | 控制台构建 + 桥接自测 | [nodejs.org](https://nodejs.org/) |
| uvx(可选) | windows-mcp 桌面自动化服务 | 随 uv 安装 |
| Tampermonkey | 油猴脚本宿主(浏览器) | [tampermonkey.net](https://www.tampermonkey.net/) |

后端 Python 依赖(fastapi / uvicorn / mcp / loguru / pydantic / pyyaml / httpx / slowapi 等):

```bash
cd backend
pip install -r requirements.txt        # 或: uv sync --extra dev
```

> windows-mcp 为**可选**(Windows 桌面自动化:窗口/点击/截图/注册表)。不需要桌面自动化的用户可删除 `backend/config/mcp.json` 中的 `windows-mcp` 服务条目,其余功能不受影响。

```bash
# 控制台(可选,若用预构建 dist 可跳过)
cd ../console
npm install
npm run build
```

### 2. 启动后端

```bash
cd backend
python main.py
# 或 Windows: 双击 start.bat
```

启动后:
- 后端: http://127.0.0.1:8088 (`/health` 检查)
- 控制台: http://127.0.0.1:8088/console

### 3. 安装桥接脚本(网页版 DeepSeek)

1. 安装 [Tampermonkey](https://www.tampermonkey.org/) 浏览器扩展
2. 新建脚本,粘贴 `bridge/ds-bridge.user.js` 内容(或重新运行 `python bridge/build.py` 生成最新版)
3. 打开 https://chat.deepseek.com —— 右上角出现状态圆点(灰 → 绿=已连接)
4. **新建对话**:自动注入 role_card(系统规范 + 工具清单 + 调用示例)
5. 直接自然语言对话即可,例如:
   - "查看 G:/Download 目录下最大的文件"
   - "启动 D:/games/xxx.exe"
   - "读取 HKCU:/Environment 的 Path 注册表值"

### 4. 配置 MCP 服务

编辑 `backend/config/mcp.json` 添加服务(或控制台「MCP 服务」页操作):

```json
{
  "services": {
    "my-server": {
      "transport": "stdio",
      "command": "npx",
      "args": ["-y", "my-mcp-server"],
      "auto_start": true
    }
  }
}
```

## 可选:Windows 桌面自动化(windows-mcp)

如需窗口管理、鼠标点击、截图、注册表编辑等桌面自动化能力,可安装 [windows-mcp](https://github.com/anthropics/windows-mcp):

### 安装方式

```bash
# 方式 1:使用 uvx(推荐,随 uv 安装)
uvx windows-mcp

# 方式 2:使用 npx
npx -y windows-mcp

# 方式 3:全局安装
pip install windows-mcp
```

### 配置

在 `backend/config/mcp.json` 中添加服务:

```json
{
  "services": {
    "windows-mcp": {
      "transport": "stdio",
      "command": "uvx",
      "args": ["windows-mcp"],
      "auto_start": true
    }
  }
}
```

### 提供的工具

安装后将获得以下桌面自动化工具:
- **App**: 启动/切换/关闭应用程序
- **Click**: 鼠标点击(坐标或元素)
- **Type**: 键盘输入文本
- **Screenshot**: 截图
- **Registry**: 读写 Windows 注册表
- **Process**: 列出/终止进程
- **Clipboard**: 剪贴板操作
- **FileSystem**: 文件读写(带追加支持)
- 更多...

### 不安装的影响

不安装 windows-mcp 不影响核心功能:
- ✅ 文件读写(read_file / write_file,已内置 append 支持)
- ✅ 目录操作(list_directory)
- ✅ 搜索替换(search_replace / line_edit)
- ✅ Git 操作
- ✅ 终端命令执行
- ✅ 技能系统
- ✅ MCP 服务聚合

缺少:窗口管理、鼠标/键盘自动化、截图、注册表编辑等桌面自动化能力。

## 工作原理(桥接协议)

模型在对话中输出约定格式的工具调用,脚本捕获后调本地后端执行:

```
start:{"name":"list_directory","arguments":{"path":"G:/Download"}}end
```

- **三通道监听**:fetch 劫持 + XHR 劫持 + DOM 观察(DeepSeek 页面怎么改都不怕)
- **四级宽容解析**:SSE 转义反转义 → Windows 路径 `\D` 非法转义修复 → 值内未转义引号状态机 → 流式中间态容错
- **结果回填**:执行结果直接填入输入框,按发送键提交给模型(自动发送可选,注意可能触发风控)
- **超长结果外置**:>20KB 的结果自动落盘 `data/tmp/`,回填摘要 + 路径,模型用 read_file 按需读取

## 常见问题

**Q: 模型不调用工具 / 参数名猜错?**
A: 刷新页面后**新建对话**(role_card 注入到新会话);role_card 已含参数名提示与调用示例,模型应直接照抄。

**Q: 工具结果发送后模型没反应?**
A: 确认输入框出现绿色高亮后**按了发送键**;自动发送开关(面板右上角圆点)开启后无需手按(可能触发 DeepSeek 风控)。

**Q: 想从局域网/其他机器访问?**
A: 改 `backend/config/settings.yaml` 的 `server.host` 为 `0.0.0.0`,并务必开启 `security.auth_enabled: true` + 设置 `auth_token`。

**Q: 改了 role_card / 工具配置不生效?**
A: role_card 在新建对话时注入;后端配置(mcp.json/settings.yaml)改后重启后端;技能目录变更由监听线程 5s 内自动感知。

**Q: 乱码?**
A: 读文本文件请让模型用 read_file(自动检测 UTF-8/GBK);PowerShell Get-Content 在中文 Windows 默认 GBK 会乱码。

## 自定义角色卡(Role Card)

角色卡(Role Card)是注入到 DeepSeek 对话中的系统规范,定义了模型可用的工具、调用格式和行为规则。

### 修改方式

编辑 `backend/rolecard/generator.py` 中的 `template` 字符串即可自定义角色卡内容:

```python
template = """# 系统规范(必须严格遵守)
你是运行在本地环境的工作助理...
...
{tool_lines}

{skills_section}"""
```

**可自定义内容:**
- 系统提示语(角色定义、行为规范)
- 工具调用格式说明
- 通用规则(路径格式、错误处理、响应风格等)
- 调用示例(新增/修改示例以引导模型行为)

**动态内容(自动生成,无需手动修改):**
- `{tool_lines}` — 可用工具清单及参数提示
- `{skills_section}` — 技能系统说明

### 注意事项

- 修改后需**重启后端**或**新建对话**才能生效
- 角色卡内容会占用模型上下文,建议控制在合理长度
- 示例对模型行为影响很大,添加示例是引导模型的有效方式

## 开发

```bash
# 后端测试(151 用例)
cd backend && python -m pytest

# 桥接解析自测(14 用例,Node)
node bridge/selftest.js

# 重新打包油猴脚本(改 bridge/ 源码后)
python bridge/build.py
```

## 安全说明

- 默认仅监听 `127.0.0.1`,凭据文件 `data/.credentials.yaml` 权限 0600,会话事件敏感键递归脱敏
- 局域网/公网暴露前请开启认证(见上);工具审批(terminal 等敏感操作)默认关闭,可在 settings.yaml 开启
- 本项目仅聚合/转发工具调用,**不包含**任何 DeepSeek 服务端能力;网页版行为受其官方条款约束

## License

[MIT](LICENSE)