dsh-mcp-connector 0.2.81 → 0.2.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,44 @@
2
2
 
3
3
  本项目遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/);首个公开版本从 `0.1.0` 开始。
4
4
 
5
+ ## [0.2.83] - 2026-10-26
6
+
7
+ ### Fixed
8
+
9
+ - #190 / PR #191:连接范围变更和回退的确认框限制最大高度,正文独立滚动,标题与确认、取消按钮保持可见;工具列表只展示前 12 项并注明总数。
10
+ - 不修改连接范围应用、回退、乐观锁或凭据处理语义。
11
+
12
+ ### Documentation and verification
13
+
14
+ - 同步当前版本文档,并重新采集本版本无凭据 Mock 截图及 GIF;素材不代表真实授权或业务调用成功。
15
+ - macOS 浏览器组件验收覆盖 360×400、640×300、1000×720 视口、8 个 Server 各 125 个长工具名、正文滚动、键盘确认/取消及焦点恢复;不等同于 Windows Desktop 实机验收。
16
+ - #178、#181 保持开放,继续等待原报告者 Windows 复测。
17
+
18
+ ## [0.2.82] - 2026-10-26
19
+
20
+ ### Added
21
+
22
+ - 新增首次使用只读引导,将安装、授权、工具发现/缓存和真实业务调用拆成独立阶段;只读取当前作用域内的状态和缓存,不把“已安装”“有缓存”或“已复制草稿”误判为业务成功。
23
+ - 新增“分享使用体验”草稿编辑器。用户选择公开教程模板、按实际情况填写版本与步骤状态后,只有明确点击才会把脱敏文本带入会话草稿;Host 返回成功前不宣称已带入,失败时保留预览供修正重试。
24
+ - 新增确定性安全连接模板分享。输出只包含白名单允许的固定结构和审核过的公开目录引用;自定义 URL、连接名称、凭据、Header、OAuth Grant、stdio 命令与环境变量不会进入分享结果。
25
+
26
+ ### Changed
27
+
28
+ - 增强外部分发源审计:以 npm `latest` 为规范版本,严格检查 awesome-dsh-plugin/DSH Market、dshopen 及受监控目录的版本与 npm 安装元数据;`stale`、`invalid`、`missing`、`unavailable` 均不能通过同步门禁。
29
+ - 分发漂移继续由单一自动跟踪项维护;已有目录等待同步或元数据修正时,不重复提交外部上架 PR/Issue。
30
+
31
+ ### Security and privacy
32
+
33
+ - 所有分享行为均需用户明确操作;插件不会自动发送消息、调用业务工具、公开发帖或上传业务数据。本版本不新增遥测,也不读取完整对话、真实工具返回、账号、凭据或现有连接配置来推断分享状态。
34
+ - 非法版本或模板输入失败时保持选择器、内容和预览一致,并给出可纠正提示,不以半更新界面继续生成草稿。
35
+
36
+ ### Verification scope and known limitations
37
+
38
+ - 完整 `npm run check`:502 项测试,494 通过、8 项按环境条件跳过、0 失败;99 个发布文件通过白名单以及凭据/本机路径扫描。跳过项不计作通过。
39
+ - 自动化、无凭据 UI harness 与缓存/localhost 合成测试只证明代码路径和安全边界,不替代真实 DSH Host、真实 OAuth、真实连接、付费业务调用或搜索排名验收。
40
+ - 2026-10-16 的企业简介证据只证明当时已有连接完成过一次获准的真实只读调用,不能外推为 v0.2.82 首次安装、首次授权、JSON 迁移、连接恢复或所有业务工具成功。
41
+ - 仓库截图和 GIF 是标注版本的无凭据 Mock 素材;分发版本/安装元数据同步也不等于搜索排名、曝光、安装转化或业务成功。
42
+
5
43
  ## [0.2.81] - 2026-10-25
6
44
 
7
45
  ### Documentation
@@ -1072,7 +1110,9 @@
1072
1110
  - 外部 URL 与导入 Header 执行安全校验。
1073
1111
  - iframe 消息校验同源和消息来源。
1074
1112
 
1075
- [Unreleased]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.48...HEAD
1113
+ [Unreleased]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.83...HEAD
1114
+ [0.2.83]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.82...v0.2.83
1115
+ [0.2.82]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.81...v0.2.82
1076
1116
  [0.2.48]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.47...v0.2.48
1077
1117
  [0.2.47]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.46...v0.2.47
1078
1118
  [0.2.46]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.45...v0.2.46
package/README.en.md CHANGED
@@ -106,7 +106,7 @@ As of 2026-10-24, the public Registry publishes 112 connector descriptors. After
106
106
  | Connection diagnostics and last-success cache | |
107
107
  | ![Connection diagnostics](https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector/main/docs/screenshots/07-connection-diagnostics.png) | |
108
108
 
109
- Assets `01`, `02`, `04`, and `07` are `v0.2.73` demos captured on 2026-10-16; `03` retains a historical `v0.2.37` snapshot; `05`, `06`, and the 43-second GIF retain `v0.2.46` demos. All are credential-free Mock UI harness assets, not evidence of real business acceptance on the current version. They contain no credentials, local paths, or query results. See [`docs/screenshots/README.md`](docs/screenshots/README.md) for provenance.
109
+ <!-- generated:media -->Screenshots and GIF were captured from v0.2.83 (2026-10-26), using the credential-free Mock harness. They demonstrate UI, not real business acceptance; counts are fixtures. See [asset provenance](docs/screenshots/README.md).<!-- /generated:media -->
110
110
 
111
111
  ## Installation
112
112
 
@@ -231,7 +231,7 @@ npm run dev:ui
231
231
 
232
232
  Every Registry merge regenerates `catalog-stats.json`; an hourly workflow in this repository synchronizes the Chinese and English product copy plus a local stats snapshot. The static npm README updates with package releases, while the live badges above read the Registry directly and therefore stay current without another npm release.
233
233
 
234
- The current public version is [`dsh-mcp-connector@0.2.81`](https://www.npmjs.com/package/dsh-mcp-connector), with [GitHub Release v0.2.81](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.81).
234
+ <!-- generated:version -->The current public version is [`dsh-mcp-connector@0.2.83`](https://www.npmjs.com/package/dsh-mcp-connector), with [GitHub Release v0.2.83](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.83).<!-- /generated:version -->
235
235
 
236
236
  See [CHANGELOG.md](CHANGELOG.md) for version history and [docs/DESKTOP-E2E.md](docs/DESKTOP-E2E.md) for the Desktop release checklist.
237
237
 
package/README.md CHANGED
@@ -108,7 +108,7 @@ Desktop 需要完全退出并重新启动应用;Web 需要停止原 `dsh web`
108
108
  | 连接诊断与最后成功缓存 | |
109
109
  | ![连接诊断](https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector/main/docs/screenshots/07-connection-diagnostics.png) | |
110
110
 
111
- `01`、`02`、`04`、`07` 为 2026-10-16 的 `v0.2.73` 演示;`03` 保留 `v0.2.37` 历史快照;`05`、`06` 与 43 秒 GIF 保留 `v0.2.46` 演示。全部来自无凭据 Mock UI harness,不是当前版本的真实业务验收证据,不包含凭据、本机路径或查询结果。详见 [`docs/screenshots/README.md`](docs/screenshots/README.md)。
111
+ <!-- generated:media -->截图与 GIF 采集自 v0.2.83(2026-10-26)无凭据 Mock 页面,展示界面而非真实业务验收;市场数量是测试夹具。来源与更新方法见 [素材说明](docs/screenshots/README.md)。<!-- /generated:media -->
112
112
 
113
113
  ## 安装
114
114
 
@@ -226,7 +226,7 @@ npm run dev:ui
226
226
 
227
227
  公共 Registry 每次合并后会生成 `catalog-stats.json`;本仓库的定时工作流每小时同步中英文介绍和统计快照。npm 页面中的静态正文随版本发布更新,上方动态统计徽标则直接读取 Registry,可在不发布新 npm 版本时保持实时数量一致。
228
228
 
229
- 当前公开版本为 [`dsh-mcp-connector@0.2.81`](https://www.npmjs.com/package/dsh-mcp-connector),对应 [GitHub Release v0.2.81](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.81)。
229
+ <!-- generated:version -->当前公开版本为 [`dsh-mcp-connector@0.2.83`](https://www.npmjs.com/package/dsh-mcp-connector),对应 [GitHub Release v0.2.83](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.83)。<!-- /generated:version -->
230
230
 
231
231
  版本能力与变更记录见 [CHANGELOG.md](CHANGELOG.md)。
232
232
  Desktop 发版回归见 [docs/DESKTOP-E2E.md](docs/DESKTOP-E2E.md)。
@@ -0,0 +1,60 @@
1
+ # 数据 MCP 贡献与验收模板
2
+
3
+ ## 原则
4
+
5
+ 自动发现分数、`initialize`、`tools/list` 或元数据工具成功,都不等于业务数据验收通过。新卡片只能在官方证据、条款、去重、限定范围真实只读调用与具名人工批准都完成后进入 Registry PR。
6
+
7
+ ## 禁止推荐清单
8
+
9
+ 以 Registry `docs/DEFERRED-CONNECTORS.md` 为当前人工决策依据,本轮继续保留全部 5 项,不因自动发现命中而重新推荐:
10
+
11
+ - `dsh-qixin-insight-mcp-oauth`
12
+ - `dsh-plugin-xparse`
13
+ - `shuididata/mcp-server`(机器规则中的稳定身份为 `shuidi-enterprise-data`)
14
+ - `mcp-cnbs`
15
+ - `chinese-law-mcp`
16
+
17
+ 注:`discovery-sources/exclusions.json` 当前只稳定阻断后 3 类身份;启信慧眼与 TextIn xParse 仍需在 Registry 的独立变更中补齐机器规则和回归测试。本工作线不修改 Registry。
18
+
19
+ ## 候选提交字段
20
+
21
+ ```text
22
+ 候选名称:
23
+ 提供方与国内/海外属性:
24
+ 用途与数据范围:
25
+ 官方页面 / 官方仓库 / Official Registry / 包或端点:
26
+ 鉴权、付费与额度:
27
+ 代码许可证、数据许可与服务条款:
28
+ 维护状态(是否归档、最近更新、版本):
29
+ 重复关系(稳定身份、端点、上游数据、已上架卡片):
30
+ 协议验收(initialize / tools/list / 只读注解):
31
+ 业务验收(指定工具、最小参数、返回字段、来源、单位、时间范围、缺失值):
32
+ 状态:PASS / SKIP / FAIL / DEFERRED
33
+ 失败或延期原因:
34
+ 评分与下一步:
35
+ 审核人与日期:
36
+ ```
37
+
38
+ 不记录凭据、完整业务响应、客户数据、个人数据或本机路径。运行证据只保留时间、版本、工具名、状态、字段摘要与脱敏哈希。
39
+
40
+ ## 验收门槛
41
+
42
+ | 层级 | 通过条件 | 未通过时状态 |
43
+ |---|---|---|
44
+ | 身份与条款 | 提供方、代码/数据许可、服务条款、鉴权与费用可核对 | `DEFERRED` 或 `SKIP` |
45
+ | 去重与排除 | 与现有卡片、稳定身份及禁止清单完成对照 | `SKIP` |
46
+ | 协议 | `initialize`、`tools/list` 成功,工具的读写/破坏性边界明确 | `DEFERRED` 或 `FAIL` |
47
+ | 业务数据 | 至少一次限定范围的真实只读调用,并核对字段、来源、时间、单位与缺失值 | `DEFERRED` |
48
+ | 人工决策 | 具名批准且范围与已验收能力一致 | 不得创建正式卡片 |
49
+
50
+ ## 2026-10-25 候选证据清单
51
+
52
+ 最新 [Issue #17](https://github.com/duhu2000/dsh-mcp-connector-registry/issues/17) 报告扫描 3,187 条、识别 606 个数据候选,自动 `selected` 仍为 0。[Issue #19](https://github.com/duhu2000/dsh-mcp-connector-registry/issues/19) 的自动排序不替代许可、条款与真实调用验收。本轮没有可直接上架的新候选:
53
+
54
+ | 候选 | 已有证据 | 未完成 | 状态 |
55
+ |---|---|---|---|
56
+ | HKEX 上市公司公告检索(社区) | 协议可达,4 个工具,`get_server_info` 元数据调用成功 | 未执行公告检索/读取,未核对来源、字段与时间范围 | `DEFERRED` |
57
+ | UNESCO UIS 全球教育统计(社区) | 协议可达,5 个工具,`uis_list_geo_units` 元数据调用成功 | 未查询统计值,未核对单位、版本、来源与缺失值 | `DEFERRED` |
58
+ | Shumi 加密市场研究 | 协议可达,33 个工具有 `readOnlyHint` | 无授权测试 Key,业务调用、额度与条款边界未验收 | `DEFERRED` |
59
+
60
+ 结论:三者都不得因协议或元数据成功而标为业务 `PASS`,不创建新卡片、不批量上架。
@@ -0,0 +1,92 @@
1
+ # 安全可分享连接模板
2
+
3
+ ## 定位
4
+
5
+ 可分享模板不是完整配置备份,也不是可自动执行的安装脚本。它只保留让另一位用户理解“连什么”所必需的最小字段;凭据必须在目标本机重新填写,OAuth 和 stdio 目录项必须回到市场重新授权或确认。
6
+
7
+ ## 核心契约
8
+
9
+ `lib/shareable-connection-template.js` 导出:
10
+
11
+ - `createShareableTemplateFromConnection(record, options)`:仅用于用户明确选择的连接;复用已有脱敏导出后再按白名单重建。
12
+ - `createShareableTemplateFromCatalog({connectorId, serverKey})`:只按 ID 从包内已审计、已发布目录解析;不接受用户粘贴的 descriptor。
13
+ - `assertShareableConnectionTemplate(input)`:严格白名单校验,未知字段直接拒绝,不静默过滤。
14
+ - `previewShareableConnectionTemplate(input)`:返回预览、待补字段、后续动作和 `requiresExplicitConfirmation=true`;不连接、不写入。
15
+ - `stringifyShareableConnectionTemplate(input)`:只序列化已通过上述严格校验的文档。
16
+
17
+ 导入仍使用现有 `normalizeJsonImport()` 与 Host 显式确认链。凭据占位符 `<REDACTED:REENTER>` 未替换时,现有导入器会整体拒绝。本模块不提供绕过确认的执行 API。
18
+
19
+ ## 允许与拒绝
20
+
21
+ | 输入 | 结果 | 原因 |
22
+ |---|---|---|
23
+ | 无额外 Header 的用户自定义 HTTP | 允许,但 URL、显示名和 serverName 都改为固定重填/公开值 | host、路径、子域名与自定义名称都可能携带租户或凭据 |
24
+ | Bearer/API Key HTTP | 允许,凭据改为占位符 | 目标用户必须在本机重填;API Key Header 只允许四个通用名称 |
25
+ | 用户自定义 URL(包括 userinfo、子域、路径、查询串、fragment、IP) | 不输出原值 | 整个 URL 改为重填占位符,不分享端点、租户或内网拓扑 |
26
+ | 自定义 Headers | 拒绝 | 不用 Header 名黑名单猜测值是否敏感 |
27
+ | 自定义 stdio | 拒绝 | 命令、参数、env、cwd 可能含凭据、本机路径或任意执行 |
28
+ | 包内已审计公开目录连接(HTTP / OAuth / stdio) | 仅输出 `connectorId/serverKey` 及 `connect-from-catalog` 引用 | 目标端从当前已审计目录重新解析;不复制 URL、Header、Grant、CLI、args 或 env |
29
+ | 用户粘贴或伪造的“公开 descriptor” | 拒绝 | `redacted=true` 不能证明 ID、名称或子域是公开信息 |
30
+ | 含未知字段的“模板” | 拒绝 | fail closed,不做过滤后继续 |
31
+
32
+ ### 允许样例(节选)
33
+
34
+ ```json
35
+ {
36
+ "format": "dsh-mcp-connector.share-template",
37
+ "version": 1,
38
+ "redacted": true,
39
+ "source": { "kind": "user-provided" },
40
+ "connections": [{
41
+ "name": "自定义 MCP 连接",
42
+ "serverName": "custom-mcp",
43
+ "transport": "streamable-http",
44
+ "url": "<REDACTED:REENTER>",
45
+ "headers": {},
46
+ "authMode": "api-key",
47
+ "apiKeyHeader": "X-Api-Key",
48
+ "apiKeyValue": "<REDACTED:REENTER>",
49
+ "redactedFields": ["url", "apiKeyValue"]
50
+ }]
51
+ }
52
+ ```
53
+
54
+ ### 拒绝样例
55
+
56
+ ```json
57
+ {
58
+ "transport": "stdio",
59
+ "command": "<LOCAL_PATH>/private-mcp",
60
+ "args": ["--token", "secret"],
61
+ "env": { "VENDOR_TOKEN": "secret" }
62
+ }
63
+ ```
64
+
65
+ 拒绝结果不回显上述值,只说明应改用经审计的公开目录模板。
66
+
67
+ ## P0 前端接入
68
+
69
+ `ui/connection-template-sharing.js` 是无数据权限的纯前端 ES module。它不将安全性交给 LLM,而是在浏览器内执行确定性的白名单转换,然后由用户显式选择复制、下载或带入新会话草稿。
70
+
71
+ 宿主必须把当前已审计且 `published !== false` 的目录转换为仅含 `connectorId/serverKey/name/serverName` 的 `catalogReferences`;不能将用户 JSON 当成白名单。
72
+
73
+ ```js
74
+ import { mount } from '/mcp-connector/ui/connection-template-sharing.js';
75
+
76
+ const dispose = mount(container, {
77
+ catalogReferences: publishedCatalog.flatMap((connector) =>
78
+ connector.servers.map((server) => ({
79
+ connectorId: connector.id,
80
+ serverKey: server.serverKey,
81
+ name: connector.name,
82
+ serverName: server.serverName,
83
+ }))),
84
+ openDraft: async (text) => { /* start-session → Host setDraft,不发送 */ },
85
+ showMessage: (message, type) => { /* type 为 'success' 或 'error' */ },
86
+ });
87
+
88
+ // 卸载面板时
89
+ dispose();
90
+ ```
91
+
92
+ 模块不读取 API、storage、真实连接、凭据或业务结果,也不提供粘贴 URL/Token/Header 值的输入框。预览本身不产生外部写入;复制、下载和 `openDraft(text)` 都要求独立点击。`openDraft` 只接收已生成的安全 JSON,文本只进入新会话草稿,不自动发送。样式在模块内按 `.mcp-safe-template-share` 作用域注入,无第三方依赖。
Binary file
@@ -1,29 +1,30 @@
1
- # UI 素材说明
1
+ # 产品截图与演示的来源及更新
2
2
 
3
- 本目录保存 `dsh-mcp-connector` 的公开界面截图。所有素材均来自无凭据 UI harness:外层浏览器视口为 1280×720,harness 复刻 `lib/client.js` 中定义的 800px 产品面板,因此桌面端稳定为一行 2 张卡片。画面只展示公开目录元数据、示例 Prompt 和明确标识为 Mock 的工具数据,不包含 OAuth Token、API Key、本机路径、用户会话或查询结果。
3
+ <!-- generated:media -->本组 7 张截图和 GIF 均从 v0.2.83 于 2026-10-26 重新采集,未修改截图中的版本文字。<!-- /generated:media -->
4
4
 
5
- 素材分为三组,避免把历史截图误写成当前版本:
5
+ 全部素材由真实产品 UI 的无凭据 Mock harness 渲染:1280×720 浏览器视口、800px 产品面板、桌面两列卡片。顶部保留“无凭据 Mock”标识;目录数、连接数与工具数是演示夹具,不代表生产统计或真实授权、业务验收。不会读取用户 profile、调用服务商或上传业务数据。
6
6
 
7
- - `01`、`02`、`04` 和 `07` 是 2026-10-16 从 `v0.2.73` 隔离 UI harness 采集的当前 Mock 素材,分别展示市场、OAuth 连接器详情、JSON 导入和故障诊断。
8
- - `03` 是 2026-09-06 从 `v0.2.37` 采集的历史工具发现快照。
9
- - `05`、`06` 和 `../demo.gif` 是 2026-09-14 从 `v0.2.46` UI harness 采集的历史工具搜索、参数和演示素材。harness 中的目录数量、连接数量和工具数量属于测试夹具,不代表生产市场统计。
7
+ 根目录 [screenshots.json](../../screenshots.json) 保持外部市场兼容的 7 张图片路径与顺序;[assets.json](assets.json) 是采集版本、日期、源码指纹、SHA-256、尺寸和 GIF 时长的唯一记录。
10
8
 
11
- 旧素材曾直接以 1280px 打开内部 iframe,绕过真实产品的 800px 宿主面板,因此触发 `auto-fill/minmax(300px)` 的 3 列布局;这是采集 harness/视口过期,不是产品 CSS 漂移。当前全部登记素材都从浏览器中的真实页面状态直接截取,没有后期重排卡片或修改连接状态。
9
+ | 文件 | 内容 |
10
+ |---|---|
11
+ | 01-market-overview.jpg | 初始市场与未连接卡片 |
12
+ | 02-connector-detail.jpg | 连接器详情、权限与示例 |
13
+ | 03-tool-discovery.jpg | Mock 连接后的工具发现 |
14
+ | 04-json-import.jpg | JSON 导入与作用域 |
15
+ | 05-unified-tool-search.png | 跨连接工具查询 |
16
+ | 06-tool-parameters.png | 参数结构详情 |
17
+ | 07-connection-diagnostics.png | 模拟发现失败与诊断 |
12
18
 
13
- 仓库根目录的 [`screenshots.json`](../../screenshots.json) 按市场总览、连接器详情、工具发现、JSON 导入、统一工具搜索、参数详情和连接诊断的顺序声明 7 张图片,供 awesome-dsh-plugin 和 DSH Market 的 App Store 风格详情页采集。根清单保持外部消费者兼容的路径数组;[`assets.json`](assets.json) 记录采集版本、视口、产品面板、无凭据状态,以及每张截图和 `demo.gif` 的 SHA-256、尺寸与 GIF 时长。
19
+ `docs/demo.gif` 由当前截图状态顺序编码,仅缩放和调色,不修改版本号或连接状态。旧素材可通过 Git 历史查看,不继续用作当前产品首屏。
14
20
 
15
- | 文件 | 展示内容 |
16
- |---|---|
17
- | `01-market-overview.jpg` | `v0.2.73` 当前 Mock 市场:800px 面板、桌面两列、推荐章节和 9 分类;未连接企查查卡片显示“连接” |
18
- | `02-connector-detail.jpg` | `v0.2.73` 当前 Mock OAuth 连接器详情:权限边界、试用 Prompt 和未连接工具状态 |
19
- | `03-tool-discovery.jpg` | `v0.2.37` Context7 无凭据 Mock 健康状态、Mock 工具数量/描述、搜索和独立滚动区 |
20
- | `04-json-import.jpg` | `v0.2.73` 当前 Mock Streamable HTTP / stdio JSON 导入、格式化、作用域和本机凭据提示 |
21
- | `05-unified-tool-search.png` | `v0.2.46` 统一工具搜索:跨连接结果、来源、发现失败和最后成功缓存 |
22
- | `06-tool-parameters.png` | `v0.2.46` 参数详情:必填、类型、枚举、嵌套结构和原始安全 Schema |
23
- | `07-connection-diagnostics.png` | `v0.2.73` 当前 Mock 连接诊断:成功缓存、模拟网络与传输失败、建议、“检查连接”和“重新发现工具” |
21
+ ## 更新与发布
24
22
 
25
- `../demo.gif` 由 6 个真实浏览器状态顺序编码:市场、连接器详情、工具详情、统一搜索、参数 Schema、连接诊断。时长 43 秒,分辨率 960×540;编码只做等比例缩放和 GIF 调色,不改变布局或状态。
23
+ GitHub Markdown 不执行变量。`package.json.version` 是版本唯一源,运行 `npm run docs:sync` 生成有标记的当前版本文案;历史 Changelog、验收日期、最低支持版本和已发布文章记录不作全局替换。
26
24
 
27
- `npm run storefront:check` 校验路径、顺序、格式、文件存在性、哈希、尺寸和采集约束;`npm run check` 已包含该门禁。更新 UI 后继续使用 1280×720 浏览器视口、800px 产品面板和无凭据初始状态采集,并检查桌面两列、企查查卡片不出现“需重新授权”,且画面不包含凭据、本机路径、真实会话、查询结果或其他不应公开的内容。
25
+ 1. 修改版本或产品 UI 后,安装开发采集依赖:`npm install --no-save --legacy-peer-deps playwright@1.62.1`,并运行 `npx playwright install chromium`;另需 ffmpeg 和中文字体。
26
+ 2. 执行 `npm run storefront:capture`。脚本只启动随机回环端口,隔离浏览器不加载外部资源;支持 `CHROMIUM_EXECUTABLE` 指定本机 Chromium,`PLAYWRIGHT_MODULE` 指定开发依赖路径。
27
+ 3. 执行 `npm run docs:sync && npm run storefront:freshness && npm run check`,人工查看全部截图及 GIF,再随 PR 提交。不要仅修改 assets.json 的版本或日期。
28
+ 4. Release 工作流在发布前验证采集版本、源码指纹和 14 天有效期;旧图不会静默进入新的正式版本。先准备素材再打 Tag,不在不可变 Tag 上改图。
28
29
 
29
- 截图顶部“无凭据 Mock”标识和工具名中的 `mock_` 前缀用于明确区分验收数据与真实授权。真实用户的已安装数量、授权状态和服务健康度会因本机环境而不同。
30
+ 产品素材工作流在 UI 主线更新、正式 Release 后、每周及手动触发时检查;需要更新时生成截图与文案,并更新同一个维护 PR。自动化只提出 PR,不自动合并,不向社交平台发布。GitHub/npm/CDN 缓存可能延迟,外部市场同步仍需复核。
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "capture": {
4
- "capturedOn": "2026-10-16",
5
- "sourceVersion": "0.2.73",
4
+ "capturedOn": "2026-10-26",
5
+ "sourceVersion": "0.2.83",
6
+ "sourceFingerprint": "4a677c677d57b6389199d2bf6dfd5b376182444dd1105ba7afd34c335eb3b29e",
6
7
  "browserViewport": {
7
8
  "width": 1280,
8
9
  "height": 720
@@ -10,74 +11,73 @@
10
11
  "productPanelWidth": 800,
11
12
  "desktopCardColumns": 2,
12
13
  "state": "credential-free-mock",
13
- "preservedLegacyScreenshots": 1,
14
- "notes": "01, 02, 04 and 07 were captured from the v0.2.73 credential-free UI harness on 2026-10-16; 03 preserves the 2026-09-06 v0.2.37 snapshot; 05, 06 and demo.gif preserve the 2026-09-14 v0.2.46 harness capture."
14
+ "notes": "All assets re-rendered from the current credential-free harness; no production profile, credentials or provider calls."
15
15
  },
16
16
  "screenshots": [
17
17
  {
18
18
  "path": "docs/screenshots/01-market-overview.jpg",
19
- "sha256": "2f681896cf8a6af274483d8e3a1b422062830d25373d088296641d7c65710900",
19
+ "sha256": "97265e2142b290c8ffdf75a402e65da6c1c34939adaba28ea4175d834a4252fa",
20
20
  "width": 1280,
21
21
  "height": 720,
22
- "capturedOn": "2026-10-16",
23
- "sourceVersion": "0.2.73"
22
+ "capturedOn": "2026-10-26",
23
+ "sourceVersion": "0.2.83"
24
24
  },
25
25
  {
26
26
  "path": "docs/screenshots/02-connector-detail.jpg",
27
- "sha256": "388090d0aecbfde81973b4841401ab31c73c36d67b8939a2476ba59cf99b11b2",
27
+ "sha256": "5c4433afc32d5ff629f3ce13c546ac8ed0ee7a09cfa321dadb691aae980192db",
28
28
  "width": 1280,
29
29
  "height": 720,
30
- "capturedOn": "2026-10-16",
31
- "sourceVersion": "0.2.73"
30
+ "capturedOn": "2026-10-26",
31
+ "sourceVersion": "0.2.83"
32
32
  },
33
33
  {
34
34
  "path": "docs/screenshots/03-tool-discovery.jpg",
35
- "sha256": "5eeb896db75a5f141a8463f128f7733ffe89af6a447cecb2d1b19f8287a3e1ec",
35
+ "sha256": "058f5aea7d11845677fb77937af82b4ad2957db363fde412e45aa9e579d7b586",
36
36
  "width": 1280,
37
37
  "height": 720,
38
- "capturedOn": "2026-09-06",
39
- "sourceVersion": "0.2.37"
38
+ "capturedOn": "2026-10-26",
39
+ "sourceVersion": "0.2.83"
40
40
  },
41
41
  {
42
42
  "path": "docs/screenshots/04-json-import.jpg",
43
- "sha256": "72634174da158d39bdf796466cf3852b1fc4445fad1c17e2ee23e98a44ccaf1f",
43
+ "sha256": "1d40f4d02b0338c192419f7f71dbf420faa8c92d4d0a5fd9f7676b7822bfcdb8",
44
44
  "width": 1280,
45
45
  "height": 720,
46
- "capturedOn": "2026-10-16",
47
- "sourceVersion": "0.2.73"
46
+ "capturedOn": "2026-10-26",
47
+ "sourceVersion": "0.2.83"
48
48
  },
49
49
  {
50
50
  "path": "docs/screenshots/05-unified-tool-search.png",
51
- "sha256": "a75119afeccdb666e1496917ab1cac50e368882412fe5ce16cfdb268c2a6595b",
51
+ "sha256": "e172da60d9abcf77639287180a4fd6b4b5dca1a95ba0f3967d7d36488fdae795",
52
52
  "width": 1280,
53
53
  "height": 720,
54
- "capturedOn": "2026-09-14",
55
- "sourceVersion": "0.2.46"
54
+ "capturedOn": "2026-10-26",
55
+ "sourceVersion": "0.2.83"
56
56
  },
57
57
  {
58
58
  "path": "docs/screenshots/06-tool-parameters.png",
59
- "sha256": "199a960e6c07c84ff2e3b99acf64536b6875f2ebf08b5a86a1df971cc120da70",
59
+ "sha256": "f09f04513af0f3ee40c455df5c537b1635ae42e83073c455bfd25db0e35625b7",
60
60
  "width": 1280,
61
61
  "height": 720,
62
- "capturedOn": "2026-09-14",
63
- "sourceVersion": "0.2.46"
62
+ "capturedOn": "2026-10-26",
63
+ "sourceVersion": "0.2.83"
64
64
  },
65
65
  {
66
66
  "path": "docs/screenshots/07-connection-diagnostics.png",
67
- "sha256": "810ea245b4f41a850b99a6cd302b9f03b10bdb50498401635fdb16befe8d07e8",
67
+ "sha256": "457898c3a256c06f613cc602dcd69193f54fcc59b5ca278228e66fc31a7e32cc",
68
68
  "width": 1280,
69
69
  "height": 720,
70
- "capturedOn": "2026-10-16",
71
- "sourceVersion": "0.2.73"
70
+ "capturedOn": "2026-10-26",
71
+ "sourceVersion": "0.2.83"
72
72
  }
73
73
  ],
74
74
  "demo": {
75
75
  "path": "docs/demo.gif",
76
- "sha256": "69250ef0d6730d2c708c1fea6a3c8041d495008a40f53a02a894238601f165ec",
76
+ "sha256": "7501018e2e32d565a309473c666f1cf02601746ce78e04d2452a4368f851c1f1",
77
77
  "width": 960,
78
78
  "height": 540,
79
- "durationSeconds": 43,
80
- "capturedOn": "2026-09-14",
81
- "sourceVersion": "0.2.46"
79
+ "capturedOn": "2026-10-26",
80
+ "sourceVersion": "0.2.83",
81
+ "durationSeconds": 36
82
82
  }
83
83
  }
@@ -8,7 +8,7 @@
8
8
 
9
9
  | 项目 | 验收要求 |
10
10
  |---|---|
11
- | 前提 | 正式 `dsh-mcp-connector@0.2.59+`;当前 Workspace;企查查 OAuth 可用;测试账号具有目标企业数据权限 |
11
+ | 前提 | <!-- generated:version -->正式 `dsh-mcp-connector@0.2.83`<!-- /generated:version -->;当前 Workspace;企查查 OAuth 可用;测试账号具有目标企业数据权限 |
12
12
  | 权限/管理员 | 账号权限、组织授权和可见字段由服务商控制;企业组织可能需要管理员开通,当前文档不能替代审批 |
13
13
  | 费用 | 可能受套餐、次数或字段权限影响;MCP连接器无法确认本次费用,调用前在服务商侧核对 |
14
14
  | 运行/数据去向 | 远程 MCP Server;企业名称、查询参数和调用结果经 DSH Host 发送到/返回自 `agent.qcc.com` |
@@ -0,0 +1,30 @@
1
+ # 分享体验作者素材索引
2
+
3
+ 本索引帮助作者区分真实业务证据、真实界面观察、Mock 界面和仅有流程/测试的材料。素材可引用不等于流程已经验收;每次分享仍应由用户主动编辑,并按实际状态填写“成功 / 失败 / 未测试”。
4
+
5
+ ## 案例与教程
6
+
7
+ | 素材 | 证据类别 | 已证明 | 未证明 | 公开使用边界 |
8
+ |---|---|---|---|---|
9
+ | [企业简介首次成功案例](ONE-SUCCESS-CASE.md) | 历史真实只读调用的脱敏摘要 | 2026-10-16 已有 `qcc-company` 连接完成一次 `get_company_profile` 只读调用,返回主体名称一致 | 当前版本流程、首次安装、首次 OAuth、JSON 迁移、连接恢复 | 可引用文档中的脱敏结论;不得复制原始业务正文、账号或凭据 |
10
+ | [JSON 迁移教程](JSON-MIGRATION.md) | 流程文档 + localhost/合成测试 | 导入标准化、连接记录、Host 透传等代码路径有自动化覆盖 | 获授权真实 Server 的导入、发现和业务调用端到端成功 | 必须写“自动测试通过;真实 E2E 未测试/待验收” |
11
+ | [工具查找与恢复教程](TOOL-SEARCH-RECOVERY.md) | 流程文档 + localhost/合成测试 | 失败保留最后成功缓存、重新发现恢复、筛选/分页/限流等代码路径有自动化覆盖 | 真实连接从故障到恢复,以及恢复后的真实业务调用 | 缓存、健康检查和重新发现都不能写成业务调用成功 |
12
+ | [社区分享素材包](SHARING-KIT.md) | 作者指引 | 提供可复现提纲、披露和人工记录方法 | 尚未发生的发帖、转化或业务成功 | 不要求好评、Star 或转发;当前没有自动公开发布 |
13
+
14
+ ## 截图与视频
15
+
16
+ 仓库公开截图和 GIF 的尺寸、SHA-256、采集日期与来源版本见[截图来源说明](../screenshots/README.md)和 [`assets.json`](../screenshots/assets.json)。它们全部是无凭据 Mock 界面素材:
17
+
18
+ | 资产 | 来源版本 | 可以说明 | 不能说明 | 建议图注 |
19
+ |---|---|---|---|---|
20
+ | `01`–`07`、`demo.gif` | 见 [assets.json](../screenshots/assets.json) | 无凭据 Mock 界面与操作流程 | 真实授权、真实恢复或业务成功 | 引用素材清单中的采集版本与日期,标注“无凭据 Mock”。 |
21
+
22
+ `workspace/p0-evidence-2026-10-16/` 中的图片是本机真实 DSH Market 搜索页面,但仅用于搜索排名复核,未上传公共仓库且仍需隐私审查;它们不能证明连接、恢复或业务调用成功。
23
+
24
+ ## 不作为公开素材的证据
25
+
26
+ - `workspace/MCP-CONNECTOR-P1-QCC-READONLY-EVIDENCE-2026-10-16.md` 保存内部真实调用证据,可能包含不应扩散的原始业务内容。公开分享只引用 `ONE-SUCCESS-CASE.md` 中的脱敏结论。
27
+ - Token、API Key、OAuth 回调参数、账号/组织标识、本机绝对路径、完整对话和完整工具返回均不得进入体验草稿。
28
+ - npm 下载量、连接数量、工具缓存、草稿预览或“复制到会话草稿”成功均不是业务调用证据。
29
+
30
+ 应用内接入契约与样式类见[分享体验模块接入说明](SHARING-UI-INTEGRATION.md)。
@@ -18,7 +18,7 @@
18
18
 
19
19
  ## 图片与视频素材
20
20
 
21
- 使用[截图目录及来源说明](../screenshots/README.md),不要重制或抹掉 Mock 标记。`01`、`02`、`04`、`07` 为 `v0.2.73`,`03` 为 `v0.2.37`,`05`、`06` 与 GIF 为 `v0.2.46`;它们用于解释界面,不是最新版本的真实调用截图。
21
+ 使用[截图目录及来源说明](../screenshots/README.md),不要重制或抹掉 Mock 标记。采集版本与日期统一以[素材清单](../screenshots/assets.json)为准;不能把界面演示当作真实调用截图。
22
22
 
23
23
  可用图注:“MCP连接器界面演示,Mock 数据;素材版本见来源说明,实际界面以安装版本为准。”
24
24
 
@@ -41,3 +41,5 @@
41
41
  自愿提交脱敏案例或问题到 [Issues](https://github.com/duhu2000/dsh-mcp-connector/issues)。希望参与开发可看[贡献指南](../../CONTRIBUTING.md)。Star 表达认可,Fork 用于实际修改与贡献,都不是使用条件。
42
42
 
43
43
  首轮邀请 5–10 位自愿体验者,手工记录安装、授权、工具发现、首次调用各阶段的成功/失败/未测试、实际耗时和阻塞原因。未计时不补估值,不新增遥测;样本仅用于改进体验,不外推整体转化率。npm 下载量也不等于独立用户或成功调用人数。
44
+
45
+ 作者在引用案例、教程、截图或 GIF 前,应先查看[分享体验作者素材索引](SHARING-AUTHOR-ASSETS.md),区分历史真实只读摘要、流程/合成测试和 Mock 界面素材。应用内草稿模块的 P0 接入契约见[分享体验模块接入说明](SHARING-UI-INTEGRATION.md)。
@@ -0,0 +1,63 @@
1
+ # 分享体验模块接入说明
2
+
3
+ 独立模块位于 [`ui/sharing-experience.js`](../../ui/sharing-experience.js)。本文件只描述 P0 集成契约;当前模块不会自行出现在 `ui/index.html`,也不会自动读取或发布任何内容。
4
+
5
+ ## 挂载接口
6
+
7
+ ```js
8
+ import { mount } from './sharing-experience.js';
9
+
10
+ const dispose = mount(container, {
11
+ openDraft: async (text) => {
12
+ const session = await startSession();
13
+ await host.setDraft(session, text);
14
+ },
15
+ showMessage: (text, type) => showMessage(text, type),
16
+ });
17
+
18
+ // 面板卸载时调用
19
+ dispose();
20
+ ```
21
+
22
+ 接口约束:
23
+
24
+ - `mount(container, { openDraft, showMessage })` 返回一个 `dispose()` 函数。
25
+ - `openDraft(text)` **只在用户点击“复制到会话草稿”后调用**。P0 负责复用现有 `start-session → Host setDraft` 流程;只写入输入草稿,不发送消息。
26
+ - `showMessage(text, type)` 是可选宿主提示;调用失败不会改变或发送草稿。
27
+ - 未提供 `openDraft` 时按钮禁用,预览与编辑仍可使用。
28
+ - 模块不接收会话、连接、工具缓存、工具返回、凭据或账号对象,不访问网络、storage、剪贴板或遥测接口。
29
+
30
+ ## 纯函数接口
31
+
32
+ - `createSharingExperience(input)`:只接受 `task`、`versions`、`steps`、`limitations`(及固定 `schemaVersion`)。未知字段拒绝。
33
+ - `createSharingExperienceFromTemplate(templateId, versions)`:加载 `companyProfile`、`jsonMigration`、`toolRecovery` 三个公开教程模板;所有步骤默认“未测试”。
34
+ - `editSharingExperience(current, patch)`:显式编辑白名单字段,不修改原对象。
35
+ - `renderSharingExperiencePreview(draft)`:生成纯 Markdown 预览,转义用户文本。
36
+ - `createSharingCopyPayload(draft)`:返回纯文本载荷,固定 `copied: false`、`businessOutcome: unchanged`,不执行复制。
37
+ - `SHARING_AUTHOR_ASSETS`:提供案例、教程和 Mock 截图的来源/边界索引。
38
+
39
+ 疑似 Bearer、API Key、Token/Secret、OAuth `code/state/token` 回调、`file:` URL,以及 macOS/Linux/Windows 用户绝对路径会被拒绝并要求先脱敏。版本字段为空时显示“未填写”;填写时必须是语义版本。
40
+
41
+ ## 样式与依赖
42
+
43
+ 模块无第三方依赖,不注入样式。P0 可在共享 UI 中按现有设计系统样式化以下类:
44
+
45
+ - `.sharing-experience`
46
+ - `.sharing-experience-form`
47
+ - `.sharing-experience-field`
48
+ - `.sharing-experience-steps`
49
+ - `.sharing-experience-step`
50
+ - `.sharing-experience-actions`
51
+ - `.sharing-experience-message`
52
+ - `.sharing-experience-preview`
53
+
54
+ 预览节点使用 `<pre>.textContent`,不得改为把 Markdown 作为 HTML 注入。
55
+
56
+ ## 测试
57
+
58
+ ```bash
59
+ node --test test/sharing-experience.test.mjs
60
+ npm run check
61
+ ```
62
+
63
+ 专门测试覆盖模板默认状态、显式编辑、未知信号拒绝、凭据/回调/路径拒绝、Markdown 转义、素材证据分类、用户点击前不调用 `openDraft`、复制后业务状态不变、销毁监听器,以及源码无网络/storage/剪贴板/连接访问。
package/lib/catalog.js CHANGED
@@ -42,6 +42,19 @@ export function loadBundledCatalog() {
42
42
  }
43
43
  }
44
44
 
45
+ /** Sharing trust root: fixed package catalog only, never merged/config/remote sources. */
46
+ export function bundledTemplateReferences() {
47
+ return loadBundledCatalog().filter((item) => item.published !== false).flatMap((item) => {
48
+ const descriptor = auditDescriptor(item);
49
+ return descriptor.servers.map((server) => ({
50
+ connectorId: descriptor.id,
51
+ serverKey: server.serverKey,
52
+ name: descriptor.name,
53
+ serverName: server.serverName,
54
+ }));
55
+ });
56
+ }
57
+
45
58
  /** 安全审计:目录禁止携带密钥、URL 协议白名单、header 名白名单。 */
46
59
  export function auditDescriptor(descriptor) {
47
60
  const oauthHttpResources = new Set(
package/lib/index.js CHANGED
@@ -26,7 +26,7 @@ import {
26
26
  } from './constants.js';
27
27
  import { defineConnectorDomain, ConnectionStore, GrantStore, CatalogStore, SnapshotStore, GovernanceStore, ConnectionScopeStore, ToolCatalogStore } from './stores.js';
28
28
  import { normalizeConnectorDescriptor, normalizeConnectionRecord } from './schema.js';
29
- import { loadBundledCatalog, fetchRemoteCatalogWithFallback, visibleDynamicDescriptors, mergeCatalog, listCatalog, auditDescriptor, auditRawDescriptor, readLimitedJson } from './catalog.js';
29
+ import { bundledTemplateReferences, loadBundledCatalog, fetchRemoteCatalogWithFallback, visibleDynamicDescriptors, mergeCatalog, listCatalog, auditDescriptor, auditRawDescriptor, readLimitedJson } from './catalog.js';
30
30
  import { describeOAuthAuthorizationError, oauthAuthorize } from './connectors/oauth-connector.js';
31
31
  import { buildManualRecord } from './connectors/manual-connector.js';
32
32
  import { normalizeJsonImport } from './connectors/json-connector.js';
@@ -1897,6 +1897,14 @@ export async function apply(ctx, config) {
1897
1897
  }
1898
1898
  },
1899
1899
 
1900
+ async templateCatalogReferences() {
1901
+ try {
1902
+ return { ok: true, detail: { items: bundledTemplateReferences() } };
1903
+ } catch {
1904
+ return { ok: false, message: '随包公开目录不可用,未读取任何本机连接。' };
1905
+ }
1906
+ },
1907
+
1900
1908
  async catalog({ category, keyword, workspaceId } = {}) {
1901
1909
  const items = listCatalog(state.merged, { category, keyword, publishedOnly: true }).map((d) => {
1902
1910
  const health = connectorHealth(d.id);