dsh-oauth-mcp 0.0.0-stage → 0.0.2
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/LICENSE +21 -0
- package/README.md +117 -2
- package/client/index.js +3499 -0
- package/cordis.patch.yml +20 -0
- package/icon.svg +12 -0
- package/index.js +836 -0
- package/lib/build-info.js +43 -0
- package/lib/callback/host-web.js +257 -0
- package/lib/callback/loopback-server.js +310 -0
- package/lib/callback/manual.js +165 -0
- package/lib/callback/pages.js +422 -0
- package/lib/callback/selector.js +179 -0
- package/lib/errors-messages.js +40 -0
- package/lib/http/client.js +302 -0
- package/lib/http/timeout.js +39 -0
- package/lib/i18n/index.js +211 -0
- package/lib/i18n/strings.js +665 -0
- package/lib/mcp/auth-fetch.js +238 -0
- package/lib/mcp/session.js +279 -0
- package/lib/mcp/tool-executor.js +111 -0
- package/lib/mcp/tool-registry.js +433 -0
- package/lib/mcp/transport.js +496 -0
- package/lib/oauth/authorize-request.js +115 -0
- package/lib/oauth/authorizer.js +502 -0
- package/lib/oauth/discovery.js +362 -0
- package/lib/oauth/errors.js +442 -0
- package/lib/oauth/pkce.js +192 -0
- package/lib/oauth/registration.js +128 -0
- package/lib/oauth/resource.js +46 -0
- package/lib/oauth/token.js +222 -0
- package/lib/oauth/types.js +219 -0
- package/lib/profiles/known-profiles.js +1133 -0
- package/lib/profiles/vendor-presets.js +56 -0
- package/lib/service.js +676 -0
- package/lib/store/credential-key.js +74 -0
- package/lib/store/credential-migration.js +127 -0
- package/lib/store/refresher.js +325 -0
- package/lib/store/server-list.js +248 -0
- package/lib/store/token-store.js +273 -0
- package/lib/tools/authorize.js +509 -0
- package/lib/tools/status.js +228 -0
- package/lib/util/config.js +55 -0
- package/lib/util/redact.js +154 -0
- package/lib/util/server-id.js +32 -0
- package/lib/util/width.js +76 -0
- package/lib/view-model.js +436 -0
- package/locale/en.json +301 -0
- package/locale/zh-CN.json +301 -0
- package/package.json +86 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 lunnlew
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,118 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-oauth-mcp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`dsh-oauth-mcp` 是 DSH 的 OAuth 2.1 客户端插件,用来接入要求 OAuth 授权的远程 MCP 服务器。
|
|
4
|
+
|
|
5
|
+
插件自己发现授权服务器,走 PKCE 授权码流程,把令牌存进宿主凭据库并保持有效,再把远端 MCP 服务器的工具注册成宿主工具。
|
|
6
|
+
|
|
7
|
+
装上以后会多三样东西:
|
|
8
|
+
|
|
9
|
+
- 设置页里多一个「OAuth 授权管理」页签
|
|
10
|
+
- 会话里多一条 `/oauth-mcp` 命令
|
|
11
|
+
- agent 多两个工具:`dsh_oauth_mcp_authorize` 和 `dsh_oauth_mcp_status`
|
|
12
|
+
|
|
13
|
+
授权过的远端工具以 `mcp_oauth__<serverId>__<tool>` 的名字出现。
|
|
14
|
+
|
|
15
|
+
## 宿主自带的 MCP 客户端不够用在哪
|
|
16
|
+
|
|
17
|
+
宿主自带的 `@deepseek-ai/dsh-mcp-client` 只有 `stdio` 和 `streamable-http` 两种传输,请求头写死在配置里,没有授权码流程,没有 PKCE,也没有令牌刷新。
|
|
18
|
+
|
|
19
|
+
要求 OAuth 的远程 MCP 服务器对未授权请求返回 `401` 和 `WWW-Authenticate`,里面写着授权服务器的地址。用宿主自带客户端接这类服务器,只能手工把一个不会自己过期的 Bearer 串写进配置,过期后改配置、重启,再改一次。
|
|
20
|
+
|
|
21
|
+
本插件把整条 OAuth 链路做在插件里:令牌过期会静默续期,收到 `401` 会先刷新再重放一次。厂商差异收在一张数据表 `knownProfiles` 里,加一家新厂商只改数据,不改代码。
|
|
22
|
+
|
|
23
|
+
## 安装
|
|
24
|
+
|
|
25
|
+
### 从 npm 装
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
dsh plugin --profile desktop add dsh-oauth-mcp
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
宿主会读包里的 `cordis.patch.yml`,在 profile 里插入一条 `id: dsh-oauth-mcp` 的条目,加载 `dsh-oauth-mcp`。
|
|
32
|
+
|
|
33
|
+
装载会返回 `application: restart-required`,必须重启 DSH 客户端。重启之后设置页出现「OAuth 授权管理」页签,`/oauth-mcp` 开始响应,agent 的工具列表里出现两个 `dsh_oauth_mcp_*` 工具。
|
|
34
|
+
|
|
35
|
+
### 从源码目录装
|
|
36
|
+
|
|
37
|
+
要改代码就用这条路径。仓库用 pnpm,版本由 package.json 的 `packageManager` 字段固定,先装依赖:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
cd <本插件目录>
|
|
41
|
+
pnpm install
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
再用宿主的插件安装入口装载(`plugin_manager install_bundle`,`target` 填本目录的绝对路径),命令行等价写法是 `dsh plugin add <本插件目录的绝对路径>`。profile 里这个包是指向源码目录的链接,改完源码只要重启客户端,不用重新装载。
|
|
45
|
+
|
|
46
|
+
也可以先打包再装:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
pnpm pack # 产出 dsh-oauth-mcp-0.0.1.tgz
|
|
50
|
+
dsh plugin add ./dsh-oauth-mcp-0.0.1.tgz
|
|
51
|
+
dsh plugin list | grep oauth # 确认装上了
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 构建
|
|
55
|
+
|
|
56
|
+
仓库有一步构建。浏览器那一半是浏览器以传统脚本方式加载的,import 不了同目录文件,所以 `client/index.js` 里的组件是生成出来的副本。改完 `client/panel.js`、`client/toolview.js`、`client/commandview.js` 或 `lib/profiles/known-profiles.js`,跑一次 `pnpm run build`,它会把厂商表、浏览器副本和语言文件一起重新生成,且是幂等的;`test/unit/client-sync.test.js` 会检查副本与来源逐行一致。
|
|
57
|
+
|
|
58
|
+
插件本体是纯 JavaScript,宿主直接吃 `index.js`,运行时只依赖 `@deepseek-ai/schemastery`。
|
|
59
|
+
|
|
60
|
+
## 配置
|
|
61
|
+
|
|
62
|
+
设置 →「OAuth 授权管理」→「添加服务器」:填 `id` 和 `url`,勾选权限范围,保存。厂商下拉里有 40 家实测过的远程 MCP 服务器,选中之后服务器地址、ID、名称、默认权限范围、授权服务器地址自动填好。
|
|
63
|
+
|
|
64
|
+
面板能改的字段只有 `servers`、`defaultScopes`、`autoConnect` 三个。`callbackMode`、`callbackPort`、`callbackPath`、`toolPrefix` 在面板里只读展示,要改去宿主的配置文件(设置 → 通用设置 →「打开配置文件」,改 profile 里 `dsh-oauth-mcp` 条目的 `config:`),保存后宿主重启本插件。
|
|
65
|
+
|
|
66
|
+
GitHub、Zendesk、Slack、PagerDuty、MongoDB Atlas、Render、Shopify、Atlassian 八家要多做一步,见 [docs/vendors.md](docs/vendors.md)。
|
|
67
|
+
|
|
68
|
+
完整的插件配置项表和服务器条目表见 [docs/usage.md](docs/usage.md#2-配置)。
|
|
69
|
+
|
|
70
|
+
## 授权
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
/oauth-mcp authorize <serverId | 服务器地址>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
命令结果是一张卡片,卡片里有可点的授权链接、一行可以复制的纯 URL。同意动作发生在厂商自己的网页上,插件不代点。
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
/oauth-mcp status
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
`status` 报告每台服务器是否已授权、过期时间、有没有刷新令牌、是否已连接、工具数。令牌本身不显示。
|
|
83
|
+
|
|
84
|
+
命令结果在对话里怎么显示,见 [docs/usage.md](docs/usage.md#4-命令结果在对话里怎么显示)。界面语言跟随宿主,见 [docs/usage.md](docs/usage.md#5-界面语言)。
|
|
85
|
+
|
|
86
|
+
## 详细文档
|
|
87
|
+
|
|
88
|
+
| 文档 | 内容 |
|
|
89
|
+
| --- | --- |
|
|
90
|
+
| [docs/usage.md](docs/usage.md) | 字段表、命令与工具参考、回调模式、令牌存储、错误码、故障排查 |
|
|
91
|
+
| [docs/vendors.md](docs/vendors.md) | 40 家远程 MCP 服务器的 OAuth 元数据实测表 |
|
|
92
|
+
| [docs/verification.md](docs/verification.md) | 12 步手工验收清单 |
|
|
93
|
+
| [docs/contract.md](docs/contract.md) | 模块级接口契约 |
|
|
94
|
+
| [docs/review-2026-11-07.md](docs/review-2026-11-07.md) | 六个方面的评审记录:已改的问题与剩下的清单 |
|
|
95
|
+
| [DESIGN.md](DESIGN.md) | 设计全文与未决问题 |
|
|
96
|
+
| [TASKS.md](TASKS.md) | 任务与验收记录 |
|
|
97
|
+
|
|
98
|
+
## 跑测试
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
cd <本插件目录>
|
|
102
|
+
pnpm install
|
|
103
|
+
pnpm test # 等价于 node --test "test/**/*.test.js"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
仓库记录的最近一次全量运行是 **640 例**,全绿。用例分单元、协议契约、端到端、宿主集成、冒烟五类,外加发布清单与仓库卫生两条守卫。端到端有两种:`test/e2e/full-flow.test.js` 走协议层,`test/e2e/host-flow.test.js` 走完整链路。
|
|
107
|
+
|
|
108
|
+
`node --test test/` 在 Node v24 上不可用:`--test` 的位置参数按 glob 解析,`test/` 会被当成模块去加载。
|
|
109
|
+
|
|
110
|
+
## 发布
|
|
111
|
+
|
|
112
|
+
版本号写在 `package.json` 的 `version` 字段里。
|
|
113
|
+
|
|
114
|
+
发布由 GitHub Release 触发:在仓库 `lunnlew/dsh-oauth-mcp` 上发布一个 Release 之后,CI 把当前版本发到 npm。
|
|
115
|
+
|
|
116
|
+
CI 用 pnpm 装依赖(`pnpm install --frozen-lockfile`),每次 push 和 PR 都会在 Node 22 与 Node 24 上跑一遍测试套件。
|
|
117
|
+
|
|
118
|
+
npm 发布那一步需要 GitHub 仓库里配一个 `NPM_TOKEN` secret。
|