dsh-mcp-connector 0.2.1 → 0.2.3

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
@@ -4,6 +4,28 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.2.3] - 2026-08-21
8
+
9
+ ### Added
10
+
11
+ - 新增 4 张由无真实凭据 UI harness 生成的核心界面截图,以及约 30 秒的演示 GIF;中英文 README 均可直接预览市场、详情 Prompt、工具发现和 JSON 导入体验。
12
+
13
+ ### Changed
14
+
15
+ - 面向中国市场将 MCP 连接器运行界面固定为中文,移除顶部 `EN` 按钮、英文 UI 字典、语言偏好持久化和切换事件;英文 README 继续作为项目文档保留。
16
+
17
+ ## [0.2.2] - 2026-08-21
18
+
19
+ ### Added
20
+
21
+ - 新增英文版 README,便于国际用户了解安装、连接方式、市场目录和发布流程。
22
+
23
+ ### Changed
24
+
25
+ - 产品名称和介绍统一为通用 MCP Connector Marketplace;企查查作为项目发起方、维护方和首批连接器提供方,不限定可接入厂商。
26
+ - 重构 npm 关键词,保留 DSH、Cordis、MCP、OAuth/PKCE 和企查查检索入口,并补充 `dsh-plugin`、`mcp-client`、`oauth2`、`enterprise-data`。
27
+ - 更新市场注册移交文档、测试数量和 awesome-dsh-plugin 注册描述,移除易过期的工具与 Prompt 数量。
28
+
7
29
  ## [0.2.1] - 2026-08-21
8
30
 
9
31
  ### Added
@@ -80,7 +102,9 @@
80
102
  - 外部 URL 与导入 Header 执行安全校验。
81
103
  - iframe 消息校验同源和消息来源。
82
104
 
83
- [Unreleased]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.1...HEAD
105
+ [Unreleased]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.3...HEAD
106
+ [0.2.3]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.2...v0.2.3
107
+ [0.2.2]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.1...v0.2.2
84
108
  [0.2.1]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.0...v0.2.1
85
109
  [0.2.0]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.1.0...v0.2.0
86
110
  [0.1.0]: https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.1.0
package/README.en.md ADDED
@@ -0,0 +1,115 @@
1
+ # MCP Connector Marketplace for DeepSeek Harness
2
+
3
+ > A general-purpose MCP connector marketplace initiated and maintained by the Qichacha team
4
+
5
+ Browse and install MCP connectors from different providers in DeepSeek Harness Desktop. Connect through OAuth, API key/URL configuration, JSON import, or a connector descriptor URL; discover tools, start a new conversation from an example prompt, and manage installed connections.
6
+
7
+ [简体中文](README.md)
8
+
9
+ [![CI](https://github.com/duhu2000/dsh-mcp-connector/actions/workflows/ci.yml/badge.svg)](https://github.com/duhu2000/dsh-mcp-connector/actions/workflows/ci.yml)
10
+ [![npm](https://img.shields.io/npm/v/dsh-mcp-connector.svg)](https://www.npmjs.com/package/dsh-mcp-connector)
11
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
12
+
13
+ ## Features
14
+
15
+ - A primary sidebar entry below New Conversation and above workspaces/conversations, with a public footer-slot fallback for incompatible DSH DOM versions.
16
+ - Searchable Marketplace and Installed views with connection status and catalog refresh.
17
+ - OAuth 2.0 Authorization Code with PKCE, API key/Bearer/unauthenticated URL configuration, and `mcpServers` JSON import.
18
+ - Installation from a credential-free connector descriptor URL.
19
+ - Credential and MCP initialize validation before API-key connectors are saved as installed.
20
+ - Dynamic tool discovery grouped by MCP server, including descriptions, search, batched rendering, and an independent scroll region.
21
+ - Curated prompt templates that can open a DSH conversation and prefill its draft; missing variables are requested before the prompt is sent.
22
+ - Persistent connection lifecycle management: restore on restart, enable/disable, disconnect, refresh OAuth tokens, and revoke authorization.
23
+ - Built-in, remote, and local catalogs with `published` and `featured` controls.
24
+ - A standalone remote Registry, allowing new marketplace cards to appear after refresh without publishing a new npm version.
25
+ - Explicit, non-destructive migration of authorization from the two earlier Qichacha OAuth plugins.
26
+
27
+ The first four bundled cards are Qichacha connectors. The public catalog also includes PKULaw and Wind connectors; the architecture is provider-neutral.
28
+
29
+ ## Interface and demo
30
+
31
+ ![30-second MCP Connector walkthrough](https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector/main/docs/demo.gif)
32
+
33
+ | Marketplace overview | Connector details and curated prompts |
34
+ |---|---|
35
+ | ![Marketplace overview](https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector/main/docs/screenshots/01-market-overview.jpg) | ![Connector details](https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector/main/docs/screenshots/02-connector-detail.jpg) |
36
+ | Tool discovery, descriptions, and scrolling | JSON import |
37
+ | ![Tool discovery](https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector/main/docs/screenshots/03-tool-discovery.jpg) | ![JSON import](https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector/main/docs/screenshots/04-json-import.jpg) |
38
+
39
+ The assets are captured from the credential-free local UI harness. See [`docs/screenshots/README.md`](docs/screenshots/README.md) for provenance.
40
+
41
+ ## Installation
42
+
43
+ Requirements: DeepSeek Harness Desktop or web profile, and Node.js 20 or later.
44
+
45
+ ```bash
46
+ dsh plugin --profile web add dsh-mcp-connector
47
+ ```
48
+
49
+ Or use the installer:
50
+
51
+ ```bash
52
+ bash <(curl -fsSL https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector/main/install.sh)
53
+ ```
54
+
55
+ Fully quit and restart DeepSeek Harness Desktop after installation or upgrade.
56
+
57
+ ## Usage
58
+
59
+ 1. Select **MCP Connector** in the primary sidebar.
60
+ 2. Choose a connector in Marketplace and complete authorization or configuration.
61
+ 3. Open its details to inspect tools or send an example prompt to a new conversation draft.
62
+ 4. Use Installed or the conversation tools to enable, disable, inspect, or disconnect a connection.
63
+
64
+ Connected tools are exposed to the model with the `mcp__<serverName>__*` prefix.
65
+
66
+ ## Connector catalog
67
+
68
+ The package contains a bundled fallback catalog. By default, it refreshes from the public [dsh-mcp-connector-registry](https://github.com/duhu2000/dsh-mcp-connector-registry); cached or bundled data remains available if the remote registry cannot be reached.
69
+
70
+ The public connector registration process and descriptor requirements are documented in [docs/MARKET-REGISTRATION.md](docs/MARKET-REGISTRATION.md).
71
+
72
+ ## Configuration
73
+
74
+ The default bundle configuration is in `cordis.patch.yml`:
75
+
76
+ ```yaml
77
+ - id: mcp-connector
78
+ name: dsh-mcp-connector
79
+ config:
80
+ catalogUrl: 'https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector-registry/main/catalog.json'
81
+ persistSecrets: true
82
+ entryPrefix: mcp
83
+ refreshSkewMs: 300000
84
+ openBrowser: true
85
+ ```
86
+
87
+ Set `catalogUrl` to an empty string for an explicitly offline/private setup.
88
+
89
+ ## Development and release checks
90
+
91
+ ```bash
92
+ npm run check
93
+ npm run registry:build
94
+ npm run registry:validate
95
+ npm run dev:ui
96
+ ```
97
+
98
+ `npm run check` performs syntax checks, automated tests, and an npm package allowlist/sensitive-content audit. Tags matching `v*` trigger GitHub Actions; the tag must match `package.json`. npm releases use Trusted Publishing through GitHub OIDC and do not require a long-lived `NPM_TOKEN`.
99
+
100
+ The current public version is [`dsh-mcp-connector@0.2.2`](https://www.npmjs.com/package/dsh-mcp-connector), with [GitHub Release v0.2.2](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.2).
101
+
102
+ See [CHANGELOG.md](CHANGELOG.md) for version history and [docs/DESKTOP-E2E.md](docs/DESKTOP-E2E.md) for the Desktop release checklist.
103
+
104
+ ## Security and limitations
105
+
106
+ - Credentials are stored only in the DSH storage domain and are not written to the catalog, Git repository, or conversation history.
107
+ - Failed API key/token validation is not persisted; authentication, timeout, DNS, and TLS/network errors are reported separately.
108
+ - External URLs must use HTTPS; HTTP is allowed only for loopback development.
109
+ - Remote descriptors and catalogs are limited to 2 MiB, Web API requests to 1 MiB, and imported JSON is scanned for credential fields before normalization.
110
+ - Streamable HTTP is the primary transport with SSE compatibility. stdio entries are explicitly skipped.
111
+ - The primary sidebar placement uses the stable DSH `data-slot` marker and falls back to the footer if that marker is removed.
112
+
113
+ ## License
114
+
115
+ MIT
package/README.md CHANGED
@@ -1,6 +1,10 @@
1
- # MCP连接器(DeepSeek Harness 插件)
1
+ # MCP 连接器市场(DeepSeek Harness 插件)
2
2
 
3
- DeepSeek Harness Desktop 中提供类似 WorkBuddy 的 MCP 连接器市场与连接管理:浏览连接器、OAuth 授权、查看工具、快速发起对话,并管理已安装连接。
3
+ > 通用 MCP Connector Marketplace,由企查查团队发起并维护
4
+
5
+ 在 DeepSeek Harness Desktop 中浏览和安装不同厂商的 MCP 连接器,通过 OAuth、API Key/URL 或 JSON 接入服务,发现工具、使用示例 Prompt 发起新会话,并管理已安装连接。
6
+
7
+ [English](README.en.md)
4
8
 
5
9
  [![CI](https://github.com/duhu2000/dsh-mcp-connector/actions/workflows/ci.yml/badge.svg)](https://github.com/duhu2000/dsh-mcp-connector/actions/workflows/ci.yml)
6
10
  [![npm](https://img.shields.io/npm/v/dsh-mcp-connector.svg)](https://www.npmjs.com/package/dsh-mcp-connector)
@@ -24,6 +28,18 @@
24
28
 
25
29
  当前市场前 4 张为企查查连接器,第 5 张为“北大法宝·法律检索”,第 6 张为“Wind·股票数据”;插件架构不限定厂商。
26
30
 
31
+ ## 界面与演示
32
+
33
+ ![MCP 连接器 30 秒演示](https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector/main/docs/demo.gif)
34
+
35
+ | 市场总览 | 连接器详情与精选 Prompt |
36
+ |---|---|
37
+ | ![市场总览](https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector/main/docs/screenshots/01-market-overview.jpg) | ![连接器详情](https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector/main/docs/screenshots/02-connector-detail.jpg) |
38
+ | 工具发现、描述与独立滚动 | JSON 导入 |
39
+ | ![工具发现](https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector/main/docs/screenshots/03-tool-discovery.jpg) | ![JSON 导入](https://raw.githubusercontent.com/duhu2000/dsh-mcp-connector/main/docs/screenshots/04-json-import.jpg) |
40
+
41
+ 素材由无真实凭据的本地 UI harness 生成,详见 [`docs/screenshots/README.md`](docs/screenshots/README.md)。
42
+
27
43
  ## 安装
28
44
 
29
45
  要求:DeepSeek Harness Desktop/web profile,Node.js 20 或更高版本。
@@ -77,7 +93,7 @@ npm run dev:ui
77
93
 
78
94
  `check` 执行语法检查、自动测试和 npm 发布包白名单校验;`dev:ui` 启动不含真实凭据的本地 mock 市场。CI 使用 `--legacy-peer-deps` 安装显式测试依赖,DSH 运行期 peer 仍由 Host 提供。`v*` Tag 会触发 GitHub Actions;Tag 必须与 `package.json` 版本一致。Release 通过 npm Trusted Publishing (GitHub OIDC) 发布,不依赖长期 `NPM_TOKEN`。
79
95
 
80
- 当前公开版本为 [`dsh-mcp-connector@0.2.0`](https://www.npmjs.com/package/dsh-mcp-connector),对应 [GitHub Release v0.2.0](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.0)。
96
+ 当前公开版本为 [`dsh-mcp-connector@0.2.2`](https://www.npmjs.com/package/dsh-mcp-connector),对应 [GitHub Release v0.2.2](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.2)。
81
97
 
82
98
  版本能力与变更记录见 [CHANGELOG.md](CHANGELOG.md)。
83
99
  Desktop 发版回归见 [docs/DESKTOP-E2E.md](docs/DESKTOP-E2E.md)。
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-mcp-connector",
3
- "version": "0.2.1",
4
- "description": "DeepSeek Harness 插件:MCP连接器 —— 连接器目录与上架、通用 OAuth / 自定义 / JSON 三通道连接外部 MCP Server / MCP Connector marketplace & connection manager",
3
+ "version": "0.2.3",
4
+ "description": "General-purpose MCP Connector Marketplace for DeepSeek Harness with OAuth 2.0 PKCE, API key/URL, JSON import, tool discovery, prompt templates, and connection management.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "exports": {
@@ -21,6 +21,7 @@
21
21
  "docs/MARKET-REGISTRATION.md",
22
22
  "cordis.patch.yml",
23
23
  "README.md",
24
+ "README.en.md",
24
25
  "CHANGELOG.md",
25
26
  "LICENSE",
26
27
  "install.sh",
@@ -41,12 +42,22 @@
41
42
  "keywords": [
42
43
  "deepseek-harness",
43
44
  "dsh",
45
+ "dsh-plugin",
44
46
  "cordis",
45
47
  "mcp",
48
+ "mcp-client",
49
+ "mcp-connector",
46
50
  "connector",
51
+ "marketplace",
47
52
  "oauth",
53
+ "oauth2",
48
54
  "pkce",
49
- "marketplace"
55
+ "json-import",
56
+ "enterprise-data",
57
+ "qichacha",
58
+ "qcc",
59
+ "tools",
60
+ "prompts"
50
61
  ],
51
62
  "license": "MIT",
52
63
  "publishConfig": {
package/ui/index.html CHANGED
@@ -355,17 +355,16 @@
355
355
  <div class="app">
356
356
  <header>
357
357
  <div class="tabs" id="tabs">
358
- <button data-view="market" data-i18n="market" class="active">市场</button>
359
- <button data-view="installed" data-i18n="installed">已安装</button>
358
+ <button data-view="market" class="active">市场</button>
359
+ <button data-view="installed">已安装</button>
360
360
  </div>
361
361
  <div class="header-spacer"></div>
362
362
  <div class="search-box">
363
363
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="color:var(--muted);flex-shrink:0"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
364
- <input id="search" type="text" placeholder="搜索连接器…" data-i18n-placeholder="search" />
364
+ <input id="search" type="text" placeholder="搜索连接器…" />
365
365
  </div>
366
- <button class="icon-btn primary" id="add-connection" type="button" data-i18n="add">+ 添加连接</button>
367
- <button class="icon-btn" id="locale-toggle" type="button" aria-label="Switch language">EN</button>
368
- <button class="icon-btn" id="refresh" data-i18n="refresh">刷新</button>
366
+ <button class="icon-btn primary" id="add-connection" type="button">+ 添加连接</button>
367
+ <button class="icon-btn" id="refresh">刷新</button>
369
368
  </header>
370
369
  <main id="main"></main>
371
370
 
@@ -384,17 +383,17 @@
384
383
  <div class="detail-desc" id="detail-desc"></div>
385
384
  <div class="detail-section">
386
385
  <div class="detail-section-head">
387
- <div class="detail-section-title"><span class="emoji">💡</span> <span data-i18n="tryExamples">试试这样用</span> <span class="detail-section-meta" id="prompt-meta"></span></div>
386
+ <div class="detail-section-title"><span class="emoji">💡</span> <span>试试这样用</span> <span class="detail-section-meta" id="prompt-meta"></span></div>
388
387
  <div class="detail-section-spacer"></div>
389
- <button class="text-btn" id="prompt-next" type="button" data-i18n="next" hidden>换一批</button>
388
+ <button class="text-btn" id="prompt-next" type="button" hidden>换一批</button>
390
389
  </div>
391
390
  <div class="prompt-list" id="detail-prompts"></div>
392
391
  </div>
393
392
  <details class="tools-disclosure" id="tools-disclosure">
394
- <summary><span>🧰 <span data-i18n="tools">工具详情</span></span><span class="tools-summary" id="tools-summary">加载中…</span></summary>
393
+ <summary><span>🧰 <span>工具详情</span></span><span class="tools-summary" id="tools-summary">加载中…</span></summary>
395
394
  <div class="tools-panel">
396
395
  <div class="tools-toolbar">
397
- <input class="tools-search" id="tools-search" type="search" placeholder="搜索工具名称或描述…" data-i18n-placeholder="toolSearch" autocomplete="off" />
396
+ <input class="tools-search" id="tools-search" type="search" placeholder="搜索工具名称或描述…" autocomplete="off" />
398
397
  </div>
399
398
  <div class="tools-list" id="detail-tools">
400
399
  <div class="tools-loading">加载中...</div>
@@ -403,7 +402,7 @@
403
402
  </details>
404
403
  <div class="detail-actions">
405
404
  <button class="btn-primary" id="detail-try-btn">💬 去试试</button>
406
- <button class="btn-danger" id="detail-disconnect-btn" data-i18n="disconnect">断开连接</button>
405
+ <button class="btn-danger" id="detail-disconnect-btn">断开连接</button>
407
406
  </div>
408
407
  </div>
409
408
  </div>
@@ -423,23 +422,13 @@
423
422
  const main = $('#main');
424
423
  const toast = $('#toast');
425
424
  const searchInput = $('#search');
426
- const I18N = {
427
- zh: {
428
- market: '市场', installed: '已安装', search: '搜索连接器…', add: ' 添加连接', refresh: '刷新',
429
- tryExamples: '试试这样用', next: '换一批', tools: '工具详情', toolSearch: '搜索工具名称或描述…',
430
- disconnect: '断开连接', details: '详情', connect: '连接', connected: '已连接', configure: '配置',
431
- send: '发送', fillSend: '填写并发送', connectToUse: '连接后使用', try: '💬 去试试', connectTry: '🔗 连接后试用', configureConnect: '🔑 录入凭据并连接', reconfigureCredential: '🔑 重新配置凭据', loading: '加载中…',
432
- },
433
- en: {
434
- market: 'Marketplace', installed: 'Installed', search: 'Search connectors…', add: '+ Add connector', refresh: 'Refresh',
435
- tryExamples: 'Try these prompts', next: 'Next', tools: 'Tool details', toolSearch: 'Search tool name or description…',
436
- disconnect: 'Disconnect', details: 'Details', connect: 'Connect', connected: 'Connected', configure: 'Configure',
437
- send: 'Send', fillSend: 'Fill & send', connectToUse: 'Connect to use', try: '💬 Try it', connectTry: '🔗 Connect to try', configureConnect: '🔑 Add key & connect', reconfigureCredential: '🔑 Reconfigure key', loading: 'Loading…',
438
- },
425
+ const LABELS = {
426
+ details: '详情', connect: '连接', connected: '已连接', configure: '配置',
427
+ send: '发送', fillSend: '填写并发送', connectToUse: '连接后使用', try: '💬 去试试',
428
+ connectTry: '🔗 连接后试用', configureConnect: '🔑 录入凭据并连接',
429
+ reconfigureCredential: '🔑 重新配置凭据', loading: '加载中…',
439
430
  };
440
- let locale = 'zh';
441
- try { locale = localStorage.getItem('mcp-connector:locale') === 'en' ? 'en' : 'zh'; } catch {}
442
- const t = (key) => I18N[locale]?.[key] || I18N.zh[key] || key;
431
+ const t = (key) => LABELS[key] || key;
443
432
  const MCP_JSON_EXAMPLE = JSON.stringify({
444
433
  mcpServers: {
445
434
  'my-server': {
@@ -450,12 +439,6 @@
450
439
  },
451
440
  }, null, 2);
452
441
 
453
- function applyLocale() {
454
- document.documentElement.lang = locale === 'en' ? 'en' : 'zh-CN';
455
- document.querySelectorAll('[data-i18n]').forEach((node) => { node.textContent = t(node.dataset.i18n); });
456
- document.querySelectorAll('[data-i18n-placeholder]').forEach((node) => { node.placeholder = t(node.dataset.i18nPlaceholder); });
457
- $('#locale-toggle').textContent = locale === 'zh' ? 'EN' : '中';
458
- }
459
442
  let view = 'market';
460
443
  let marketItems = {};
461
444
  let searchQuery = '';
@@ -510,7 +493,7 @@
510
493
  button.disabled = pending;
511
494
  if (pending) {
512
495
  button.dataset.idleLabel = button.textContent;
513
- button.textContent = locale === 'en' ? 'Sending…' : '正在发送…';
496
+ button.textContent = '正在发送…';
514
497
  } else if (button.dataset.idleLabel) {
515
498
  button.textContent = button.dataset.idleLabel;
516
499
  delete button.dataset.idleLabel;
@@ -1162,13 +1145,6 @@
1162
1145
  }
1163
1146
 
1164
1147
  $('#add-connection').addEventListener('click', () => openAddConnection('json'));
1165
- $('#locale-toggle').addEventListener('click', () => {
1166
- locale = locale === 'zh' ? 'en' : 'zh';
1167
- try { localStorage.setItem('mcp-connector:locale', locale); } catch {}
1168
- applyLocale();
1169
- refresh();
1170
- if ($('#detail-overlay').classList.contains('active')) renderPromptPage();
1171
- });
1172
1148
  main.addEventListener('click', (event) => {
1173
1149
  if (!event.target.closest('#catalog-more')) return;
1174
1150
  catalogRenderLimit += 60;
@@ -1195,7 +1171,6 @@
1195
1171
  refresh();
1196
1172
  });
1197
1173
 
1198
- applyLocale();
1199
1174
  refresh();
1200
1175
  })();
1201
1176
  </script>