DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Xiaozhi — DeepSeek Harness 插件(DSH Plugin)
← Plugins
X

dsh-xiaozhi

Xiaozhi

通过 MCP 向小智语音助手提供 DeepSeek Harness (DSH) Web 能力:一个自包含的 DSH bundle,可在小智 MCP endpoint 上将 DSH 注册为 MCP 工具提供方(或作为可连接小智的 MCP server),并提供 DSH Web 设置页面。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:toddpan/dsh-xiaozhi#8cc29e2044ab30a75cd8ecc8758cc5bfed325cf3
README兼容性版本

说明

通过 MCP 向小智(Xiaozhi)语音助手提供 DeepSeek Harness (DSH) Web 能力:一个自包含的 DSH bundle,可在小智 MCP endpoint 上将 DSH 注册为 MCP 工具提供方(或作为可连接小智的 MCP server),并提供 DSH Web 设置页面。通过 MCP 协议将 DSH Web 的工作区、会话、模型、设置、文件等能力封装为工具,供小智语音调用。

兼容性与来源证明

Xiaozhi 以 dsh-xiaozhi 发布,当前版本为 0.1.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/9/25

版本

0.1.0stable
2026/9/25

相关插件

正在加载相关插件…

最新版
0.1.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
BSD-3-Clause
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/9/25
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录

相关插件

继续浏览 integrations-communication 分类下经过校验的插件。

Acp App@deepseek-ai/dsh-acp-appdsh ACP 配置文件包:基于 dsh-base 的仅限自动化的 JSON-RPC stdio 和进程生命周期管理Remote Web Ui@linxin666/dsh-remote-web-ui通过扫码配对访问 dsh Web GUI,共享一个官方界面:设置按钮旁的二维码可将手机和 PC 配对到同一个 Web GUI(手机采用竖屏触控适配层,PC 使用完整桌面界面),通过一次性令牌和 rUniver Officedsh-univer-officeDSH × Univer 集成,内置协作 Gateway 和 Viewer:内联预览、实时浮动 Worktree 窗口,以及 DeepSeek Harness 中的会话结束审查操作。DSCODE@toddzheng024/dscode-bundle完整的 DeepSeek 编码代理,支持持久化 shell、Ultra 协作和自动权限审查。

README

dsh-xiaozhi · drive DSH by voice with the Xiaozhi assistant

Connects the Xiaozhi (小智) voice assistant to DeepSeek Harness (DSH) Web: DSH acts as the MCP tool provider, exposing workspaces, sessions, models, settings and files as tools a voice assistant can call over JSON-RPC 2.0 on a WebSocket.

English · 中文文档 · Install & verify · Tool reference

Connect the Xiaozhi voice assistant to DSH Web: DSH is the MCP tool provider, exposing 35 DSH Web endpoints as 16 voice-friendly tools, with a DSH Web settings page. 把小智(Xiaozhi)语音助手接入 DSH Web:DSH 作为 MCP 工具提供方,把 35 个接口封装成 16 个语音友好工具,自带设置页。

The pre-implementation design proposals (architecture ADR, v2 review, settings UX walkthrough) are archived in docs/design/ with every divergence from the shipped code listed.


1. What it solves

DSH's capabilities live behind HTTP REST endpoints; Xiaozhi only speaks MCP. This plugin sits between them:

 you say a sentence
        │
        ▼
┌─────────────┐   MCP (JSON-RPC 2.0 / WebSocket)  ┌──────────────────────────┐
│  Xiaozhi     │ ◄──────────────────────────────► │ dsh-xiaozhi (Host half)   │
│ App / device │  initialize / tools/list / call   │ ├ MCP session + registry  │
└─────────────┘                                    │ ├ capability → REST map   │
                                                   │ └ LocalInvoker (in-proc)  │
                                                   └───────────┬──────────────┘
                                                               │ no network hop
                                                               ▼
                                                   ┌──────────────────────────┐
                                                   │ DSH Web REST routes (copy)│
                                                   └──────────────────────────┘

Three deliberate decisions:

  1. DSH is always the MCP server / tool provider. In both transports it answers initialize, ping, tools/list and tools/call, and never initiates them.
  2. Outbound by default (endpoint mode). DSH dials out to the Xiaozhi MCP access point, so it needs no public IP, port forwarding or reverse proxy.
  3. In-process invocation, not loopback HTTP. Tool calls go straight to the bundled DSH REST routes through LocalInvoker, so there is no host/port/auth guessing and no dependency on an external service.

2. Quick start (3 steps)

Requirements: DSH Web running (dsh web, default http://127.0.0.1:3080), a Xiaozhi account, and its MCP access point page open.

  1. Install from this directory:

    dsh plugin add /Users/tsbj/feyanggit/DHS-test/dsh-xiaozhi
    

    Or use "install from a local directory" under Settings → Plugins in DSH Web.

  2. Paste the access point: DSH Web → Settings → Xiaozhi → Connection, put the WebSocket address from the Xiaozhi console (like wss://api.xiaozhi.me/mcp/?token=…) into "Xiaozhi MCP access point", then press Save and reload.

  3. Check the status tab: the connection should read connected with a client count. Press Test connection to perform a real handshake.

    Then say to Xiaozhi: "ask DSH for my session list".

The access point URL carries a token. When the page reads the config back it shows token=***, and saving treats that sentinel as "unchanged" rather than writing it over the real secret. See §7.


3. Two transports

endpoint (default, recommended)server (self-hosted)
Who connectsDSH dials out to the Xiaozhi access pointThe Xiaozhi server connects to DSH
Public reachabilitynot neededneeded (or a reverse proxy / same LAN)
Main settingsendpointUrl, endpointHeadersserverPath, serverPort, serverToken
Fitsthe official Xiaozhi MCP access pointa self-hosted xiaozhi-esp32-server

Both can run at once: mode picks the primary channel, and serverPort > 0 additionally listens on 0.0.0.0.

Reconnect in endpoint mode uses exponential backoff (reconnectMinMs → reconnectMaxMs, ±20% jitter) plus a heartbeatMs ping. The Status tab and the log show every attempt.


4. Tool exposure: grouped (default) or flat

Xiaozhi sanitises tool names to [A-Za-z0-9_\-CJK]. Every name this plugin exposes is a fixed point of that rule (e.g. dsh_session_history), so no platform-side renaming occurs.

ModeToolsNotes
grouped (default)16 (fewer with groups disabled)merged by capability area, an action argument picks the operation
flat35one tool per endpoint, named after it

Grouped is the default because a voice model picks the right tool far more reliably from 16 options than from 35; the settings page warns past 24 tools. Full mapping: docs/TOOLS.md.

Groups can be disabled per area (e.g. docs, files). allowWriteTools = false refuses create/update/delete/send operations with a speakable message while keeping read operations usable, even inside a grouped tool that mixes both.


5. Capability coverage

All 35 endpoints are reachable, and both tool modes cover 35/35:

Area#Endpoints
System1GET /system/status
Workspaces6/workspaces, /workspaces/:id, /workspaces/:id/sessions
Sessions13/sessions, /sessions/:id, history, stats, todos, skills, questions, answers, cancel, events
Files3/sessions/:id/files, /files/download
Conversation3/sessions/:id/prompt, /prompt-stream, /chat/completions
Models5/models, /models/default, /providers, /presets
Settings2/settings, /settings/:namespace
Docs2/docs, /openapi.json

Four of them are degraded under MCP semantics. Read the next section before relying on them.


6. MCP semantic degradations (please read)

tools/call is strictly request/response with no incremental channel, while several source endpoints stream. This plugin keeps as much semantics as possible and says so, instead of pretending:

CapabilityNative formOver MCPWhat it means for you
conversation.promptStream (dsh_say)text/event-stream, incrementalDSH collects the whole stream and returns the result text onceThe voice side is not incremental; promptTimeoutMs bounds the wait, and a timeout answers "submitted, still running" instead of an error
sessions.events (dsh_session_watch)long-lived SSEcollects events for a bounded window (1–30 s) then returnsA peek at recent activity, not a live subscription; poll sessions.stats to follow progress
files.downloadbinary streamtext files return their body (clipped to maxVoiceChars); binaries return a summary (size, type, path)Reading binary bytes aloud is meaningless; fetch the real file from the DSH Web UI or the bundled REST layer
docs.openapifull OpenAPI JSONa structure summary (openapi, title, path count, up to 100 paths, bytes, URL)Open apiBase/openapi.json for the full document

Also:

  • dsh_say(wait=false) hands a sentence to a session without waiting: it submits prompt-stream with a ~1.5 s budget and, on timeout, quietly reports "submitted" plus the session status.
  • Every tool result is clipped to maxVoiceChars and delivered as a single text block so speech stays short.

7. Security model

SurfaceDefaultProtection
Settings API /dsh-xiaozhi/adminloopback only (DSH binds 127.0.0.1)① cross-site Origin refused ② sec-fetch-site: cross-site refused ③ every request (reads included) must carry x-dsh-xiaozhi-admin: 1; cross-site forms/images cannot set a custom header and a cross-origin fetch preflights, which this cors: false router never approves ④ when the Host exposes a connection service, it judges the request first (browser cookie + Host/Origin → 401/403)
Bundled DSH REST layer /dsh-xiaozhi/api/v1onSet apiKey to require Authorization: Bearer … or X-API-Key; a warning is shown while it is unset
MCP toolson, writes allowedallowWriteTools=false blocks all writes; disabledGroups shrinks the surface
server mode extra portoff (serverPort=0)A port number listens on 0.0.0.0, so serverToken becomes mandatory; the page warns when it is empty

Secret masking: reading the config masks apiKey, serverToken, the token= value inside the access point URL, and every endpointHeaders value (•••••• / ***) while keeping header names. Saving treats those sentinels as "unchanged" and drops them, so a sentinel can never overwrite a real secret.

endpointHeaders can be added or overwritten from the page but not deleted (the write is a merge). Edit settings.json by hand to remove a header.


8. Configuration

Precedence, lowest first:

  1. code defaults (DEFAULTS in src/config.ts)
  2. the plugin row's config (the profile's cordis.patch.yml)
  3. overrides saved by the settings page (<homeDir>/settings.json)
OptionDefaultMeaning
enabledtruewhile off, no tool can run
modeendpointendpoint / server
endpointUrl''Xiaozhi MCP access point (ws:///wss://, must contain /mcp/)
endpointHeaders{}extra request headers (merged on write)
serverPath/mcp/xiaozhiserver-mode path (must contain /mcp/)
serverPort00 reuses the DSH web server; >0 also listens on 0.0.0.0
serverToken''strongly recommended whenever serverPort > 0
toolModegroupedgrouped / flat
disabledGroups[]disabled capability areas
allowWriteToolstrueallow write operations
promptTimeoutMs120000voice wait limit (must stay below the REST layer's 180000)
maxVoiceChars700reply clipping length
listLimit10list page size
heartbeatMs30000ping interval
reconnectMinMs / reconnectMaxMs1000 / 30000reconnect backoff bounds
apiPathPrefix/dsh-xiaozhi/apibundled REST layer prefix (the settings API is fixed at )

Why is homeDir not on the settings page? It decides where the override file lives, so honouring it from that file is circular — the page would show a new directory while overrides kept being written to the old one. homeDir therefore comes only from the plugin row config (or the DSH_XIAOZHI_HOME environment variable) and the page shows it read-only.


9. Settings page

DSH Web → Settings → Xiaozhi, five tabs:

  • Status — connection badge, transport, masked access point, client count, reconnects, last error, warnings, public addresses, tool/capability counts, per-group state; with Test connection, Reconnect now and Refresh.
  • Connection — basics, tool-group switches, and a collapsed advanced form. Save and reload writes the override file and restarts the runtime; Restore defaults clears every override.
  • Tools — the tools actually exposed, their read/write nature and capability counts.
  • Capabilities — all 35 capabilities by area, with method and path.
  • Logs — the plugin ring log (300 lines) with an optional 5-second auto refresh.

The page styles itself with DSH theme tokens (--dsw-alias-*) only, imports no dsh-client-ui-primitives, and therefore follows the host in light and dark without clashing.


10. Development

cd dsh-xiaozhi
bash scripts/build.sh                     # needs a DSH source checkout for tsc (auto-probed)
node --test --test-timeout=30000 "test/*.test.mjs"

107 test cases across:

FileCovers
test/protocol.test.mjsMCP messages, tool-name sanitiser fixed points, envelope parsing
test/ws.test.mjsRFC 6455 framing, mask direction, fragmentation, closing handshake
test/config.test.mjsthree-layer merge, secret masking, homeDir not overridable
test/coverage.test.mjsall 35 endpoints pinned verbatim; both weavings cover everything; names are sanitiser fixed points
test/dispatcher.test.mjsin-process invocation: JSON, query strings, request bodies, streaming, 404, 504 timeout
test/mcp-session.test.mjshandshake → tools/list → tools/call over a real socket, with concurrency and protocol errors
test/routes.test.mjsevery capability resolves on the real route table; grouped tools end to end
test/client.test.mjsbrowser-half constant parity, bilingual dictionary completeness, helpers, react-dom/server renders
test/admin.test.mjssettings API: every route the page calls is reachable with the right method; the three guards; masked-secret stripping
test/docs.test.mjsdoc/code consistency: names, counts and routes cannot drift

src/dshapi/ is a verbatim copy of @dsh-external/dsh-web-service v0.1.11 (BSD-3-Clause); the only new file is src/dshapi/service.ts, which assembles it into one router, so an upstream update stays a clean three-way diff. See NOTICE.


11. Troubleshooting

SymptomCause and fix
Status stays disconnectedThe access point is empty or malformed (must be ws:///wss://, contain /mcp/, and avoid the substrings key/call). Check the first error in the Logs tab
Xiaozhi sees the tools but calls failCheck allowWriteTools; a blocked write returns an explicit message
Xiaozhi sees no tools at allenabled=false, or every tool group is disabled
Ids are hard to say aloudGrouped tools shorten ids (like sess-123); you can also address things by name
A LAN self-hosted Xiaozhi cannot connectIn server mode with serverPort=0 only the DSH server listens (loopback by default); set a port and a serverToken
Changing apiPathPrefix did not move the settings pageExpected: the settings API is fixed at /dsh-xiaozhi/admin; apiPathPrefix only shapes the bundled REST layer

12. License

BSD-3-Clause. Derived from @dsh-external/dsh-web-service v0.1.11 (Copyright © 2026 toddpan 潘祖继) under the same license. See LICENSE and NOTICE.

/dsh-xiaozhi/admin
exposeDshApitruemount the bundled DSH REST layer
apiKey''auth key for the bundled layer
corsfalseallow cross-origin calls to the bundled layer
defaultCwd''default directory for created sessions
maxUploadBytes104857600upload limit
homeDir''row config only (see below)
logToolCallstruelog every tool call
sendInitializedNotificationtruesend notifications/initialized after the handshake
serverNameDSHannounced service name