在聊天中把 MCP 工具结果渲染成可交互应用
30/100
综合分
0
GitHub 星标
425
npm 周下载
—/5
用户评分
数据截至 2026/9/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-mcp-appsnpm 源 · dsh-mcp-apps 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/dsh-agent@deepseek-ai/dsh-user-approval@deepseek-ai/cordis@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-client-ui-tool@deepseek-ai/dsh-subprocess给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 渲染MCP工具结果为应用
- 提供可交互界面
- 承载MCP应用宿主
最近更新
在 GitHub 查看全部 →v0.2.42026-09-30
对比 v0.2.3...v0.2.4
· 新增
· 远程 MCP 服务器 OAuth 2.0 / PKCE 支持:
- 安全的文件存储 OAuth token 存储(~/.dsh/mcp-apps/oauth/.json),文件系统权限受限(目录 0700,token 文件 0600),在 DSH 重启后仍保留访问 token、刷新 token 和动态客户端注册记录。
- 完整的 OAuth 2.0 授权码流程,支持 PKCE(RFC 7636)和元数据发现(RFC 8414 / RFC 9728)。
- 支持动态客户端注册(RFC 7591),同时兼容预配置的静态客户端凭据。
- 专用 Web 路由 /api/mcp-apps/oauth/callback,通过 window.opener.postMessage 协调弹窗认证窗口。
- 断开 / 登出端点(/api/mcp-apps/oauth/disconnect),以及插件界面状态区的「断开」按钮,可干净地吊销 token 并注销工具。
- externalUrl 配置项,供反向代理或外部 URL 部署使用,确保 OAuth 重定向 URI 准确。
· 更稳健的远程服务器生命周期与错误处理:
- 简洁的单行网络错误报告:解开嵌套的 Node.js/Undici 原因(ConnectTimeoutError、UND_ERR_CONNECT_TIMEOUT、ECONNREFUSED),不再向 stdout/stderr 打印原始多行堆栈。
- 连接断开或启动失败时自动重连,采用带抖动的指数退避。
- 手动重试 RPC 端点(/api/mcp-apps/servers/retry),以及插件界面中已断开服务器行上的交互式「重试」按钮。
- 生命周期立即关闭:把 lifecycleController.signal 转发到远程传输层,按下 ^C 或关闭 DSH 时立即中止进行中的请求,无需等待 HTTP socket 超时。
· 界面与客户端状态增强:
- 详细的服务器连接状态:「需要授权」「已认证」「已连接」「已断开」。
- 服务器卡片上的交互式「连接账户」「断开」「重试」按钮,具备无障碍 ARIA 语义和响应式设计。
v0.2.32026-09-28
对比 v0.2.2...v0.2.3
· 新增
· 配置 schema 元数据:Config 里每个字段都带上了可读的 .description(),超时字段带 .role('ms'),env/headers 字典值带 .role('secret')——DSH 由 schema 驱动的设置表单现在能显示文档,并在密钥到达浏览器之前先做脱敏,校验、默认值和类型都不变。
· 只读的 servers/status 端点,以及 DSH 插件界面里插件页面上对应的状态区:每个服务商的连接状态、工具数量,还有一份可展开、可筛选的单个工具名列表,按可见性分组(模型可见 / 仅应用 / 两者)。绝不暴露 command、args、env、headers 或 url。
· 包现在会作为 DSH bundle 自动激活:dsh plugin add dsh-mcp-apps 会自动插入它的 mcp-apps 行(通过 dsh/cordis.patch.yml),在 DSH 插件界面里给它一张卡片和详情页——图标用官方 MCP 标志。以前得手动用 insert: 补丁条目接进去,在那个界面里完全没有存在感。
· 变更
· README 的安装和配置两节按 bundle 流程重写:用 DSH Harness 界面或命令行安装,然后在配置档的 cordis.patch.yml 里用补丁(而不是 insert:)改 mcp-apps 行来配置。新增「从 0.2.x 迁移」一节,面向现有的 insert: 配置。
· 对等依赖范围升到 ^0.1.7-rc.2,对齐最新 DSH;新增 @deepseek-ai/dsh-client-ui-plugin-manager 作为可选对等依赖,故意不放进 dsh.client.inject,这样没装插件管理器的部署不会卡住本插件自己的工具视图加载。
· scripts/smoke-dsh.mjs 现在改 bundle 自己的 mcp-apps 行,不再插入第二行。
· 常见传递依赖通过 pnpm overrides 改走 @socketregistry 的即插即用替代包。
· 安全
· 经 servers/status 暴露的连接错误消息在存储前先做清理:去掉 URL 里的用户信息、查询串和片段,任何配置的密钥值(连同 Bearer 风格的子 token 及其百分号编码变体)都脱敏,结果截断到 300 个字符。少于 3 个字符的配置密钥不脱敏,避免误伤常见的短子串——已作为已知限制记录在案。
v0.2.22026-09-28内容较长已截断
· v0.2.2
· 概要
恢复与 DSH 0.1.7-rc.2 的兼容(0.2.1 在该运行时上被判为不兼容),修复了在无头 DSH 主机上工具无法注册的问题,并合并了一批此前未发布的生命周期、审批和客户端可靠性修复。本次发布还修复了发布流水线自身的两个 bug,它们曾让 0.2.2 的前两次发布尝试都卡住。
· 兼容 DSH 0.1.7-rc.2
DSH 0.1.7-rc.2 拒绝加载插件(Plugin dsh-mcp-apps@0.2.1 is incompatible with dsh 0.1.7-rc.2: peerDependencies {...}),原因是 @deepseek-ai/dsh-* 的 peer 范围被钉死成精确的 0.1.5-rc.3 字符串。DSH 的兼容性检查器(@deepseek-ai/dsh-app-boot 里的 evaluatePluginCompatibility)只检查名为 @deepseek-ai/dsh 或以 @deepseek-ai/dsh- 开头的 peerDependencies 键,并调用 semver.satisfies(runtimeVersion, requirement, { includePrerelease: true });不带范围运算符的裸版本会被当作精确相等,所以旧钉法在 0.1.7-rc.2 上直接失败。
现在每个 @deepseek-ai/dsh-* peer 都改成插入符范围 ^0.1.7-rc.2,并按检查器自身的逻辑验证过:0.1.7-rc.3 及之后的 0.1.x 预发布版仍能满足它(因为 includePrerelease: true),而 0.2.0 的 DSH 运行时仍会正确触发不兼容。对应的 devDependencies(以及钉在 4.0.4 的 @deepseek-ai/cordis)精确钉死,让 CI 构建和测试跑在与 peer 范围目标相同的运行时上;cordis 的 peerDependency 本身仍保持宽松的 ^4.0.2,因为它不在 DSH 检查器的覆盖范围内。完整说明见 docs/dsh-compatibility.md。
· 修复
· 无头主机上工具注册失败:src/index.ts 之前把 'webServer' 和 'tools'、'connection' 一起注入,但本插件的路由走的是公开的 ctx.connection.fetch.register 契约(HostConnectionFetch),根本不会碰 ctx.webServer。由于 Cordis 4.x 的每个 inject 条目都是硬性要求,要求 webServer 会让插件的 fiber 在无头 DSH 主机上永久停在 PENDING,于是主机侧的 MCP 工具一个都注册不上。webServer 已从 inject 中移除(现在只有 ['tools', 'connection']);新增回归测试会搭一棵真实的 Cordis 树,带 tools 和 connection 但没有 webServer 服务商,断言 fiber 仍能激活。
· 公开的 DSH 主机连接生命周期:插件改为通过公开的 HostConnectionFetch.register(route) 契约注册 /api/mcp-apps/* 端点,不再伪造 Context.connection 形状、也不再在运行时探测原型,每条路由都返回公开的 ConnectionRpcResult 响应信封。关闭时先等待每条路由的 unregister 调用(走各路由自己的 disposer),再分别拆掉工具池和会话存储。
· 按需注入可选审批服务并检查服务是否过期:只有当某个服务器配置真的设了 allowAppToolCalls: 'approve' 时才注入 approval 和 agents(Object.values(config.servers).some(server => server.allowAppToolCalls === 'approve')),不再是无条件的硬性要求。审批和智能体服务的引用通过 ctx.inject 的 disposer 模式捕获,服务被替换或拆掉时就清空——进行中的审批调用在请求返回后会重新检查捕获的引用,若服务已在底下换掉,就以 unavailable 失败,而不是继续用过期引用。
· 客户端工具发现支持重连:客户端(src/client/index.tsx、McpAppToolView.tsx)在主机重连后会重新发现 MCP 应用工具,不再只在初次加载时发现。
· 浏览器安全的客户端产物:./client 包现在构建并验证过不依赖 No
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成dsh-mcp-apps
npm
Downloads
TypeScript
React
Cordis
Tests
License: MIT
在 DeepSeek Harness (DSH) 网页聊天中,将 MCP Apps 渲染为沙箱化的交互式 iframe。
这是什么?
MCP 服务器可以返回的不仅仅是文本:MCP Apps 扩展(SEP-1865)允许工具结果携带一个 ui:// 资源——一个小巧、自包含的 Web 应用,例如仪表盘、地图或表单。默认情况下,DSH 不知道如何处理这些内容,只会显示原始的工具结果。dsh-mcp-apps 是一个用于 DSH 的 Cordis 4 插件,它能识别这些 ui:// 资源,并将其作为实时、可交互的应用直接渲染在聊天轮次中,置于沙箱化的 iframe 内。该应用还可以回调宿主以运行更多工具(例如“刷新”按钮),此功能受每个服务器显式审批策略的控制。
功能特性
- 在 DSH 聊天中直接将 MCP Apps(ui:// 资源)渲染为交互式仪表盘、图表、地图和表单。
- 每个应用都在带有自动生成的内容安全策略(Content Security Policy)的 iframe 中沙箱化运行——没有 allow-same-origin,也无法随意访问宿主页面。
展开完整文档(README 剩余 1 节)
dsh-mcp-apps
npm
Downloads
TypeScript
React
Cordis
Tests
License: MIT
在 DeepSeek Harness (DSH) 网页聊天中,将 MCP Apps 渲染为沙箱化的交互式 iframe。
这是什么?
MCP 服务器可以返回的不仅仅是文本:MCP Apps 扩展(SEP-1865)允许工具结果携带一个 ui:// 资源——一个小巧、自包含的 Web 应用,例如仪表盘、地图或表单。默认情况下,DSH 不知道如何处理这些内容,只会显示原始的工具结果。dsh-mcp-apps 是一个用于 DSH 的 Cordis 4 插件,它能识别这些 ui:// 资源,并将其作为实时、可交互的应用直接渲染在聊天轮次中,置于沙箱化的 iframe 内。该应用还可以回调宿主以运行更多工具(例如“刷新”按钮),此功能受每个服务器显式审批策略的控制。
功能特性
- 在 DSH 聊天中直接将 MCP Apps(ui:// 资源)渲染为交互式仪表盘、图表、地图和表单。
- 每个应用都在带有自动生成的内容安全策略(Content Security Policy)的 iframe 中沙箱化运行——没有 allow-same-origin,也无法随意访问宿主页面。
- 可通过 stdio、SSE 或 Streamable HTTP 连接到任何 MCP 服务器,并支持自动重连。
- 应用可以回调宿主工具(例如“刷新数据”按钮),默认关闭,并可按服务器配置(deny / approve / allow)。
- 渲染出的应用带有 Interactive App 徽章,并会抵抗 DSH 的自动折叠行为,因此当模型完成流式输出时它们不会折叠消失。
- 安全地处理机密信息:针对环境变量和 headers 块的 ${VAR} 展开会阻止 DSH 内部及机密形态的变量名,除非你明确允许它们。
要求
- Node.js >= 22
- DSH (DeepSeek Harness)
- web 配置文件。插件的客户端 bundle 仅在 dsh.client.platform 为 web 时注入(参见 package.json),因此即使插件安装在其他配置文件中(例如 tui、headless),其 UI 也不会渲染。
安装
markdown
npx @deepseek-ai/dsh plugin --profile web add dsh-mcp-apps
这会在你的 DSH profile 目录($DSH_HOME/profiles/web)内转发给 pnpm,而不是你当前的项目——它会把 dsh-mcp-apps 添加到该 profile 自己的 package.json 中。不要在一个无关的项目里直接运行 pnpm add dsh-mcp-apps 并指望它对 DSH 起任何作用。
仅安装并不会激活插件——你仍然需要把它添加到你的 profile 配置中(下一节),这样加载器才会拾取它。
配置
将插件添加到你的 profile 补丁文件,例如 ~/.dsh/profiles/web/cordis.patch.yml。该文件是一个顶层 YAML 数组,包含加载器补丁条目;要添加一个新插件(而不是按 id 覆盖已有插件),请将其包裹在 insert: 列表中: yaml
- insert:
- id: mcp-apps
name: 'dsh-mcp-apps'
config:
servers:
一个使用 Streamable HTTP 或 SSE 的远程服务器 my-server: transport: streamable-http url: 'https://your-mcp-server.example.com/mcp'
一个受 OAuth 保护的远程服务器,通过 mcp-remote 代理 my-oauth-server: transport: stdio command: npx
args: [-y, mcp-remote@0.1.37, 'https://your-mcp-server.example.com/mcp']
一个裸的顶层条目(没有 insert:)会被视为对已有 id 的补丁,如果该 id 尚不存在,则会以 entry "" not found 失败——它不会创建新的插件条目。
一个更完整的示例,展示了环境变量展开、请求头和反向工具调用: yaml
- insert:
- id: mcp-apps
name: 'dsh-mcp-apps'
config:
defaultTimeoutMs: 30000
servers:
本地 stdio 子进程(env 值支持 ${VAR} / ${VAR:-default} 展开) local-tool: transport: stdio command: go
args: ['run', 'main.go']
cwd: '/path/to/mcp-server'
env:
DATABASE_URL: '${DATABASE_URL}'
toolCallTimeoutMs: 45000
allowAppToolCalls: approve
带认证请求头的远程 SSE 服务器 remote-analytics: transport: sse url: 'https://mcp.example.com/sse' headers: Authorization: 'Bearer ${MCP_TOKEN}'
allowedVars: [MCP_TOKEN] # 除非列出,否则形似密钥的变量会被阻止
reconnectOptions:
maxRetries: 10
运行并验证 bash
npx @deepseek-ai/dsh web
在已配置的服务器上调用一个返回 ui:// 资源的工具。如果一切连接正常,工具结果会在聊天回合中渲染为一个实时应用,并带有 Interactive App 徽章,而不是原始的 JSON/文本。
反向工具调用安全模型
渲染后的应用可以回调宿主工具(例如一个“Refresh Data”按钮)。该路径默认是锁定的:
- 会话令牌:来自应用的每个 tools/call 请求都必须携带有效的 AppSessionStore 会话令牌,且该令牌的作用域限定为其签发时所针对的工具名称和服务器。缺失、已过期或服务器不匹配的令牌会在工具运行之前就被拒绝(src/index.ts)。
- allowAppToolCalls(按服务器配置,默认 false/'deny'):一个 'deny' | 'approve' | 'allow' 设置(也接受普通 boolean 作为 false/'allow' 的旧式简写)。
- 'deny'(默认):该服务器的应用发起的反向调用不会暴露任何工具。
- 'allow' / true:允许反向调用,无需审批。
- 'approve':每个反向调用都会经由 ctx.approval(@deepseek-ai/dsh-user-approval)路由,并要求发起调用的 agent 有一个打开的轮次(agent.status === 'running');在该窗口之外,或者审批/agent 服务不可用时,调用会以 unavailable 失败,而不是静默允许或挂起。
- 仅应用 / 仅模型可见性:标记为仅应用可见(isToolVisibilityAppOnly)的工具永远不会注册到 LLM 的工具列表中,而标记为仅模型可见(isToolVisibilityModelOnly)的工具会被排除在应用允许回调的集合之外——每个方向都是单向门控。
配置参考
| 选项 | 类型 | 默认值 | 描述 |
| servers | Record | {} | 服务器标识符到传输配置的映射。名称不能包含 __ 或以 _ 结尾。 |
| defaultTimeoutMs | number | 30000 | 工具调用的回退超时时间(毫秒)(必须 >= 1)。 |
| servers..transport | 'stdio' \| 'sse' \| 'streamable-http' | (必填) | 传输机制。仅支持 MCP 规范定义的传输方式:stdio、streamable-http 和 sse(上游已弃用,为较旧的服务器保留)。 |
| servers..command | string | — | 可执行二进制文件路径(用于 stdio)。 |
| servers..args | string[] | [] | 命令参数(用于 stdio)。 |
| servers..cwd | string | — | 工作目录(用于 stdio)。 |
| servers..env | Record | {} | 环境变量,支持 ${VAR} / ${VAR:-default} 展开(用于 stdio)。 |
| servers..url | string | — | 远程端点 URL(用于 sse、streamable-http);必须匹配 http(s)://。纯 http:// 仅允许连接到回环主机(localhost、127.0.0.1、::1)——其他任何情况都会在连接时被拒绝。 |
| servers..headers | Record | {} | 自定义 HTTP 头,支持与 env 相同的 ${VAR} 展开(用于 sse、streamable-http)。 |
| servers..toolCallTimeoutMs | number | 30000 | 每个服务器的工具调用超时时间(毫秒)(必须 >= 1)。 |
| servers..reconnectOptions | { maxRetries?, initialDelayMs?, maxDelayMs?, backoffFactor? } | {5, 1000, 30000, 1.5} | 指数退避重连调优,应用于 stdio 和远程(sse、streamable-http)传输。 |
| servers..allowAppToolCalls | 'deny' \| 'approve' \| 'allow' \| boolean | false ('deny') | 反向工具调用策略——参见反向工具调用安全模型。 |
| servers..allowedPermissions | string[] | [] | 针对资源 UI 元数据所请求的 camera、microphone 和 geolocation iframe 权限的允许列表;除非在此处显式列出,否则这三项均被拒绝。其他权限键会未经筛选地传入 iframe 的 allow 属性。 |
| servers..allowedVars | string[] | [] | 该服务器可通过 ${VAR} 展开(在 env 或 headers 中)读取的环境变量名,尽管这些变量以 DSH_ 为前缀、形似机密(KEY/PASSWORD/SECRET/TOKEN),或是 agent socket(SSH_AUTH_SOCK、GPG_AGENT_INFO)——这些默认均被阻止。例如 allowedVars: ['API_TOKEN'] 可让 headers: { Authorization: 'Bearer ${API_TOKEN}' } 解析成功(适用于 stdio、sse、streamable-http)。 |
| servers..maxMessageBytes | number | 16777216 (16MB) | 来自远程服务器的单条传入消息的最大字节数(适用于 sse、streamable-http;必须 >= 1)。这通过一个围绕 fetch 的字节计数包装器限制每个单独的 SSE 事件(而非整个流的生命周期)。用于防止恶意或行为异常的远程服务器耗尽主机内存。 |
${VAR} / ${VAR:-default} 展开仅适用于 env 和 headers 的值——不适用于 url、args 或 cwd。$$ 是转义后的字面量 $。默认值本身不能包含嵌套的 ${...} 展开(例如 ${MISSING:-${PORT}} 会被按字面量处理,而不会递归展开)。
故障排查
- 工具出现两次:在同一个 MCP 服务器上同时运行 @deepseek-ai/dsh-mcp-client 和此插件,会通过两个插件注册该服务器的工具,导致重复。对于给定的服务器,请只使用其中之一。
- ${VAR} 未展开:以 DSH_ 为前缀以及形似机密(KEY/PASSWORD/SECRET/TOKEN)的变量名,加上 SSH_AUTH_SOCK/GPG_AGENT_INFO,默认均被阻止——请将该名称添加到该服务器的 allowedVars 中。
- 应用的按钮无任何反应:allowAppToolCalls 默认为 deny。请将其设置为 approve 或 allow。在 approve 模式下,该调用还需要一个已打开且正在运行的 agent 轮次来提示批准——在该窗口之外会以 unavailable 失败。
- 远程连接被拒绝:纯 http:// 仅允许连接到回环主机(localhost、127.0.0.1、::1);其他任何地址都必须使用 https://。
- 什么都不渲染:客户端 UI 仅在 web 配置文件(dsh.client.platform: "web")下加载。它不会在 tui、headless 或其他配置文件中渲染。
- 插件似乎没有加载:检查你的 patch 条目是否使用了 insert: 形式(参见配置)——一个裸的顶层 - id: 条目是对现有 id 的 patch,会报错而不是注册新插件。运行 npx @deepseek-ai/dsh --profile web --patch --dump-config 来打印组合后的配置,并确认你的条目出现了。
工作原理
该插件通过基于 postMessage 的 JSON-RPC 在沙箱化 iframe 和 DSH 宿主之间架起桥梁,管理一个 MCP 服务器连接池,并为 LLM 规范化工具名称/可见性。关于完整的内部机制——CSP 合成、postMessage 握手、工具指纹识别、防折叠行为以及 resize 断路器——请参见 docs/how-it-works.md。
开发与测试
Install dependencies
pnpm install
Type-check
pnpm typecheck
Build host and client bundles (tsdown)
pnpm build
Run Vitest test suite
pnpm test
./client(由 DSH 的 window.__ModuleLoader__ 加载的浏览器端 bundle)仅用于 loader:它在 package.json#exports 中没有 types 条目,无法直接从 Node 或打包工具导入——只有 .(宿主)条目会附带类型声明。
许可证
MIT © katticot预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
katticot/dsh-mcp-apps
在聊天中把 MCP 工具结果渲染成可交互应用
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,362已汉化DSH
71.4
终端编码代理esengine/DeepSeek-Reasonix
· 指南 · ACP · 扩展开发 · 规格 · 官方网站 · Discord · QQ
★ 36,076已汉化DSH
71.2
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,814已汉化DSH
71.1
这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。