All plugins

DSH / BUNDLE / CLIENT-UI

dsh-mcp-skill-panel

v0.6.0lilyblessing / dsh-mcp-skill-panel3c060253d1

InstallableBundlesUI & client pluginsCommunity · Topic auto-analysisWeb UI

Overview

dsh-mcp-skill-panel

MCP 与技能管理面板:设置页展示 MCP 服务器与 Skill 目录,随时启停释放上下文占用;可选 AI 中间层(dsh_mcp_search/dsh_mcp_call)按需使用 MCP。

README / EN

Package documentation

Registry summary

MCP 与技能管理面板:设置页展示 MCP 服务器与 Skill 目录,随时启停释放上下文占用;可选 AI 中间层(dsh_mcp_search/dsh_mcp_call)按需使用 MCP。

dsh.pub verifies the pinned bundle contract, runtime facts, and distribution semantics. The complete README remains in the source repository.

Read the full README on GitHub

LIMITATIONS

Known limitations

- 启停作用于 preset 层:一个服务器/技能的开关影响该 preset 下所有会话。 - 无 frontmatter 的 SKILL.md 无法切换(provider 本身会忽略此类文件)。 - 工具数/token 为估算值(`JSON.stringify(parameters).length / 4`),与模型注入面真实值近似。 - 停用后工具立即消失,但**当前回合的请求缓存**(如有)可能仍引用旧 schema;下一请求自然刷新。 - **持久化时滞**:启停实时生效;跨重启保持依赖下次启动的物化 —— 插件在「已有会话运行」期间被热更新时,本次进程不物化,下一次重启生效。 - **手动编辑预设组合文件的 mcp 行**(如手动移除 `disabled: true`)会令该行退出插件的**启停持久化管理**(下次启动尊重你的改动,不再写 `disabled`);但**配置意图(「更多配置」改的字段)仍会继续物化**,两者是正交字段。 - **未注册 ≠ 未启用**:`status=failed / tools=0 / unregistered=true` 表示该行**已启用且在跑**,但子进程一个工具都没注册(多为配置问题:缺项目索引、端点不可达、可执行文件不存在)。卡片下方列出的工具来自目录快照,只是"可被 `dsh_mcp_search` 检索",不代表当前可用。 - **工具级禁用边界**:禁用拦截作用于模型可见性(装配过滤)、`dsh_mcp_search` 检索与中间层 `dsh_mcp_call`;对已注册工具的直接原生调用(绕过中间层)不做运行时拦截。 - **有效统计是「工具级启用数」,不等于「实际进入上下文」**:它只扣「工具级禁用」(谓词与装配过滤同源)。**口径边界**:不扣 server 级隐藏(`dsh_mcp_call` 保活中的 AI 临时启用 server、`middleLayerHides='all'` 下的全部 server),也不扣 project-mcp 的工作区过滤 —— 它回答的是「该 server 有多少工具处于启用态」,不是「模型这一回合实际看到多少」。 - **工具预算的上限数字只是可配置默认值/示例**:`toolBudget` 与面板输入框占位符里的数字(如 Grok 350)是**示例值/默认提示**,不是对任何 provider 的真实断言或硬约束(各家上限随模型与账号变化,请按实测填)。预算比较用的「全部工具数」是**请求面口径优先**:`toolsAllSource='request'`(会话上一次已落盘请求的装配后工具表,有一轮延迟);取不到时回退注册表口径 `'registry'` 并在卡片上标注来源,后者不扣 server 级隐藏与项目工作区过滤,是近似值。 - **控制工具的 `arguments` 必须是 JSON 对象**:`dsh_mcp_call` 的 `arguments` 声明为对象类型,**字符串形态会被参数校验前置拒绝**(报 `invalid arguments: "arguments" must be an object`)。这是有意的收紧(0.6.0 起)—— 旧版会把 JSON 字符串透明解析,现在按工具描述要求的对象形态传入即可。 - 运行期写 SKILL.md 安全(skill-filesystem 的 watcher 本就预期文件被改);运行期写预设组合文件会触发 dsh-agent-presets 的 stamp 重挂事故,插件刻意不做。 - 能力摘要表(`dsh_mcp_search` 空查询)只覆盖有 catalog 快照或配置了 `serverSummary` 的 server;从未成功启动过的 server(如 codegraph)不会列出。**口径提示**:`middleLayerHides='all'` 时该表按「经中间层取用」表述,不再宣称 server「对模型可见」—— 可见与否以装配结果为准(此时连已启用的 server 也从模型面隐藏)。 - **按模型覆盖的数据源(v0.6.0 补齐)**:面板**会**拉 provider/模型目录(`GET /models`,**60s TTL + 单飞**)—— 「无鉴权读端点不该把每次请求都放大到 adapter」仍是这条缓存的理由,但不再是「不拉目录」的理由。覆盖卡的行集合 = **可折叠的目录**(provider 行 + 模型行)∪ 其它已存在的键(运行期 ∪ 持久化(`autoManageByRoutePersisted`);未被目录吃掉的键落在「其它键」区),因此**可以为任意 provider/模型预置规则,不必先切到它**;目录拉取失败时降级为「只列键」的旧行为,键照旧全部可见、可删(挂载失败后运行期表被清空的键,按「已保存,未生效」标注)。目录只影响**可点范围**,不影响 gate 语义(查表序 `provider/model` → `provider` → `autoManage` 与生效判定原样)。**会话口径(0.6.0 会话透传)**:面板**可用时**把当前会话一并带上(`/state`、`/models` 带 `?session=`;`/skill/toggle`、`/mcp/toolBulk` 带 body 的 `session`),host 就按该会话解析 —— 高亮、`toolsAll*` 计数、preset/cwd 等**随会话的读数**跟随你正在用的那个会话(**解析成功时**:卡片以 host 回显的 `sessionId` 为准,措辞据此在「跟随当前会话」/「面板绑定会话」之间切换)。注意 per-server 的 tools/tokens 聚合走**进程级** standing scope,不随会话。两个写端点用的是该会话的**作用域**:`/skill/toggle` 据此决定改哪个技能域(同名技能在不同会话下可能落到不同文件),`/mcp/toolBulk` 据此把工具名解析成实际目标。**取不到会话时**(宿主未提供该能力)请求与旧版**逐字节相同**,host 仍按 `roots[0]` 解析(见下条)。 - 面板是**进程级全局**设置区块:**可用时**它会带上当前会话(0.6.0 会话透传,见上条),高亮与随会话的读数(`toolsAll*` 计数、preset/cwd)跟随你正在用的会话(**解析成功时**,以 host 回显的 `sessionId` 为准);**取不到会话时**才回退旧行为 —— `/state` 不带 `session`,host 侧按 `roots[0]` 解析归属会话。两种情形下卡片都会把 host 回显的 `sessionId`(没有则 `—`)显示出来供核对。 - **控制端点鉴权**:写操作由进程级随机令牌(`x-panel-token`)保护,仅面板同源客户端自动携带;GET 只读开放。宿主 webServer 本身无鉴权层,若将监听地址改为 `0.0.0.0` 对外暴露,建议同时依赖外层网络隔离。