dsh-armory 1.9.4 → 2.0.0
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/README.en.md +26 -8
- package/README.md +39 -16
- package/docs/chunk-split-feasibility.md +153 -0
- package/docs/host-proposal-mcp-teardown.md +184 -0
- package/docs/host-proposal-skill-toggle.md +166 -0
- package/docs/mcp-market-design.md +62 -0
- package/docs/prd-awesome-dsh-plugins.md +105 -0
- package/docs/prd-workbuddy-parity.md +128 -0
- package/docs/system-design-awesome.md +269 -0
- package/docs/system_design.md +530 -0
- package/docs/workbuddy-market-gap-analysis.md +197 -0
- package/lib/client.js +4507 -271
- package/lib/expert-market.js +13 -2
- package/lib/index.js +395 -9
- package/lib/mcp-catalog.js +104 -0
- package/lib/mcp-config.js +10 -1
- package/lib/mcp-import-sources.js +154 -14
- package/lib/mcp-oauth.js +806 -0
- package/lib/tool-ledger.js +119 -0
- package/lib/typert.js +26 -0
- package/lib/wb-auth-rules.js +128 -0
- package/lib/wb-awesome-market.js +453 -0
- package/lib/wb-install-state.js +151 -0
- package/lib/wb-market.js +232 -8
- package/lib/wb-plugin-market.js +291 -0
- package/lib/wb-registry.js +224 -0
- package/lib/whats-new.js +82 -0
- package/lib/workspace-runtime.js +133 -4
- package/package.json +10 -9
package/lib/mcp-catalog.js
CHANGED
|
@@ -18,6 +18,11 @@
|
|
|
18
18
|
// category 见 mcp-config.js 的 MCP_CATEGORIES,市场按它分组。
|
|
19
19
|
// vendor 提供方。详情页显示,也用来区分官方与第三方。
|
|
20
20
|
// access 中文,如实说清免费额度与是否需要 Key。**不要美化**。
|
|
21
|
+
// auth 结构化鉴权标记,取值域见 `AUTH_KINDS`('none' | 'apiKey' | 'oauth' |
|
|
22
|
+
// 'oauth-or-pat')。与 `access` 的分工:`access` 给人读,`auth` 给程序判——
|
|
23
|
+
// 面板据此提前告诉用户「这条装不了」,而不是等连接失败了再猜。
|
|
24
|
+
// authNote 一句话说明「该怎么配」或「为什么装不了」。只在 auth !== 'none' 时写。
|
|
25
|
+
// 可选:省略时面板只显示 auth 的通用文案。
|
|
21
26
|
// transport 'streamable-http' | 'stdio'。
|
|
22
27
|
// url/headers 仅 HTTP 型。
|
|
23
28
|
// command/args 仅 stdio 型。
|
|
@@ -35,6 +40,13 @@
|
|
|
35
40
|
// ⚠️ 已知边界:DSH 的 mcp-client **不支持 OAuth 交互授权**(transport.ts 只传
|
|
36
41
|
// `requestInit.headers`,没有 authProvider)。所以只支持 OAuth、拿不到静态 Token 的
|
|
37
42
|
// 远端服务在这个宿主里**用不了**,本目录不收录。`access` 字段如实标注每条要什么凭据。
|
|
43
|
+
//
|
|
44
|
+
// OPT-24:加结构化 `auth` 标记(枚举 AUTH_KINDS),补「access 只有自由文本」的缺口。
|
|
45
|
+
// 为什么:`access` 写得再细也只有人读得到,面板没法据此判断「这条在当前宿主装不上」。
|
|
46
|
+
// OAuth-only 的条目装完只会得到一个连不上的连接,用户以为是插件的锅。有了这枚枚举,
|
|
47
|
+
// 市场能在点击安装**之前**就把「需 OAuth、本宿主不支持」摊开说。
|
|
48
|
+
// 判定依据仍是 `access` 原文(不凭服务名猜);拿不准时选 'oauth-or-pat' 而非 'oauth'
|
|
49
|
+
// —— 误判成 oauth 会让用户以为装不了,代价比反过来大得多。
|
|
38
50
|
|
|
39
51
|
/**
|
|
40
52
|
* 分类的展示顺序(唯一真相源)。
|
|
@@ -71,6 +83,22 @@ export const CATEGORY_LABELS = {
|
|
|
71
83
|
'comms': '通讯',
|
|
72
84
|
}
|
|
73
85
|
|
|
86
|
+
/**
|
|
87
|
+
* `auth` 字段的取值域(唯一真相源)。
|
|
88
|
+
*
|
|
89
|
+
* - `'none'` 无需任何凭据:本地 stdio、开源本地服务、免密公开 API。
|
|
90
|
+
* - `'apiKey'` 靠 API Key / Token / PAT / headers 注入即可用,`envKeys` 能承载。
|
|
91
|
+
* - `'oauth'` **只能**走 OAuth 授权流程。本宿主(mcp-client 不支持 OAuth)完成不了,
|
|
92
|
+
* 面板必须降级提示,不要给用户「点了安装就能用」的错觉。
|
|
93
|
+
* - `'oauth-or-pat'` 官方主推 OAuth,但存在可用的 PAT / 静态令牌替代路径。能装,但需引导
|
|
94
|
+
* 用户走替代路径,别让他照着官方文档去点 OAuth 按钮。
|
|
95
|
+
*
|
|
96
|
+
* 为什么是这四个而不是布尔:`oauth` 与 `oauth-or-pat` 的处置**相反**(前者劝退、后者引导),
|
|
97
|
+
* 合成就没法表达。测试逐条断言 `MCP_CATALOG` 的 auth 属于这个集合。
|
|
98
|
+
* @type {ReadonlyArray<string>}
|
|
99
|
+
*/
|
|
100
|
+
export const AUTH_KINDS = ['none', 'apiKey', 'oauth', 'oauth-or-pat']
|
|
101
|
+
|
|
74
102
|
/**
|
|
75
103
|
* 目录条目。字段含义见文件头。
|
|
76
104
|
*
|
|
@@ -86,6 +114,8 @@ export const MCP_CATALOG = [
|
|
|
86
114
|
category: 'search',
|
|
87
115
|
vendor: 'Exa',
|
|
88
116
|
access: '免密可用(有限额);可在 headers 加 x-api-key 提升额度',
|
|
117
|
+
auth: 'apiKey',
|
|
118
|
+
authNote: '免密信号是 headers 里的空 x-api-key(实测有限额);填 EXA_API_KEY 换额度上限',
|
|
89
119
|
transport: 'streamable-http',
|
|
90
120
|
url: 'https://mcp.exa.ai/mcp',
|
|
91
121
|
headers: { 'x-api-key': '!!js (process.env.EXA_API_KEY ?? "")' },
|
|
@@ -100,6 +130,7 @@ export const MCP_CATALOG = [
|
|
|
100
130
|
category: 'search',
|
|
101
131
|
vendor: 'Tavily',
|
|
102
132
|
access: '免密模式免费有速率限制(响应与带 Key 完全一致);官方免费 Key 为 1000 credits/月,无需信用卡',
|
|
133
|
+
auth: 'none',
|
|
103
134
|
transport: 'streamable-http',
|
|
104
135
|
url: 'https://mcp.tavily.com/mcp/',
|
|
105
136
|
headers: { 'Authorization': '!!js "Bearer " + (process.env.TAVILY_API_KEY ?? "")', 'X-Tavily-Access-Mode': 'keyless' },
|
|
@@ -114,6 +145,9 @@ export const MCP_CATALOG = [
|
|
|
114
145
|
category: 'search',
|
|
115
146
|
vendor: 'Firecrawl',
|
|
116
147
|
access: '免密可用(每日限额);填 API Key 提升额度。需浏览器登录时改用 /v2/mcp-oauth',
|
|
148
|
+
// 判 apiKey 而非 none:headers 里装配的就是 `Bearer ${FIRECRAWL_API_KEY}`(空串),免密那条路
|
|
149
|
+
auth: 'apiKey',
|
|
150
|
+
authNote: '默认按免密模式发空 Bearer;填 FIRECRAWL_API_KEY 才走带 Key 模式',
|
|
117
151
|
transport: 'streamable-http',
|
|
118
152
|
url: 'https://mcp.firecrawl.dev/v2/mcp',
|
|
119
153
|
headers: { 'Authorization': '!!js "Bearer " + (process.env.FIRECRAWL_API_KEY ?? "")' },
|
|
@@ -128,6 +162,8 @@ export const MCP_CATALOG = [
|
|
|
128
162
|
category: 'search',
|
|
129
163
|
vendor: 'Brave',
|
|
130
164
|
access: '必须自备 Brave Search API Key(有免费档,超出需付费)',
|
|
165
|
+
auth: 'apiKey',
|
|
166
|
+
authNote: '必填 BRAVE_API_KEY,没有免密路径',
|
|
131
167
|
transport: 'stdio',
|
|
132
168
|
command: 'npx',
|
|
133
169
|
args: ['-y', '@brave/brave-search-mcp-server', '--transport', 'stdio'],
|
|
@@ -142,6 +178,8 @@ export const MCP_CATALOG = [
|
|
|
142
178
|
category: 'search',
|
|
143
179
|
vendor: 'Perplexity',
|
|
144
180
|
access: '需付费 Perplexity API Key(Bearer),无免密额度',
|
|
181
|
+
auth: 'apiKey',
|
|
182
|
+
authNote: '必填 PERPLEXITY_API_KEY(Bearer),无免密额度',
|
|
145
183
|
transport: 'streamable-http',
|
|
146
184
|
url: 'https://api.perplexity.ai/mcp',
|
|
147
185
|
headers: { 'Authorization': '!!js "Bearer " + (process.env.PERPLEXITY_API_KEY ?? "")' },
|
|
@@ -155,6 +193,7 @@ export const MCP_CATALOG = [
|
|
|
155
193
|
category: 'search',
|
|
156
194
|
vendor: 'Google',
|
|
157
195
|
access: '实验阶段免费、无需认证(实测 tools/list 返回 2 个文档检索工具)',
|
|
196
|
+
auth: 'none',
|
|
158
197
|
transport: 'streamable-http',
|
|
159
198
|
url: 'https://mapscodeassist.googleapis.com/mcp',
|
|
160
199
|
homepage: 'https://developers.google.com/maps/ai/code-assist',
|
|
@@ -166,6 +205,7 @@ export const MCP_CATALOG = [
|
|
|
166
205
|
category: 'search',
|
|
167
206
|
vendor: 'Anthropic',
|
|
168
207
|
access: '开源免费,无需任何 Key',
|
|
208
|
+
auth: 'none',
|
|
169
209
|
transport: 'stdio',
|
|
170
210
|
command: 'uvx',
|
|
171
211
|
args: ['mcp-server-fetch'],
|
|
@@ -179,6 +219,9 @@ export const MCP_CATALOG = [
|
|
|
179
219
|
category: 'dev',
|
|
180
220
|
vendor: 'GitHub',
|
|
181
221
|
access: '需 GitHub 账号并 OAuth 授权;也可用 PAT。功能权限随账号套餐',
|
|
222
|
+
// 置 oauth-or-pat 而非 oauth:PAT 是本宿主唯一走得通的路径,标成 oauth 会误导用户放弃安装
|
|
223
|
+
auth: 'oauth-or-pat',
|
|
224
|
+
authNote: '别走 OAuth:把 GITHUB_PERSONAL_ACCESS_TOKEN(PAT)配进来,Bearer 直连即可',
|
|
182
225
|
transport: 'streamable-http',
|
|
183
226
|
url: 'https://api.githubcopilot.com/mcp/',
|
|
184
227
|
headers: { 'Authorization': '!!js "Bearer " + (process.env.GITHUB_PERSONAL_ACCESS_TOKEN ?? "")' },
|
|
@@ -192,6 +235,9 @@ export const MCP_CATALOG = [
|
|
|
192
235
|
category: 'dev',
|
|
193
236
|
vendor: 'GitLab',
|
|
194
237
|
access: 'Free 及以上套餐可用;OAuth 动态注册授权,自建实例亦可|⚠️ 静态 Token 方式未获官方确认(官方 MCP 文档只描述 OAuth/DCR;issue 586184 请求支持 PAT,官方回复不在近期路线图上),在 DSH 中可能无法授权',
|
|
238
|
+
// 判 oauth:官方明确 PAT 不在近期路线图(issue 586184),没有替代路径可引导
|
|
239
|
+
auth: 'oauth',
|
|
240
|
+
authNote: '只支持 OAuth 动态注册,静态 Token 未获官方支持,本宿主会卡在授权;装了也连不上',
|
|
195
241
|
transport: 'streamable-http',
|
|
196
242
|
url: 'https://gitlab.com/api/v4/mcp',
|
|
197
243
|
homepage: 'https://docs.gitlab.com/user/model_context_protocol/mcp_server/',
|
|
@@ -203,6 +249,9 @@ export const MCP_CATALOG = [
|
|
|
203
249
|
category: 'dev',
|
|
204
250
|
vendor: 'Sentry',
|
|
205
251
|
access: '需 Sentry 账号 OAuth 授权(可用免费档账号)',
|
|
252
|
+
// 判 oauth:access 只承诺 OAuth,没有像 GitHub 那样把 Token 写成等价路径
|
|
253
|
+
auth: 'oauth',
|
|
254
|
+
authNote: '官方只写 OAuth;若在 Sentry 设置里签发 SENTRY_AUTH_TOKEN 可试 Bearer 直连(未获文档保证)',
|
|
206
255
|
transport: 'streamable-http',
|
|
207
256
|
url: 'https://mcp.sentry.dev/mcp',
|
|
208
257
|
headers: { 'Authorization': '!!js "Sentry-Bearer " + (process.env.SENTRY_AUTH_TOKEN ?? "")' },
|
|
@@ -216,6 +265,7 @@ export const MCP_CATALOG = [
|
|
|
216
265
|
category: 'dev',
|
|
217
266
|
vendor: 'Anthropic',
|
|
218
267
|
access: '开源免费,仅操作本地仓库',
|
|
268
|
+
auth: 'none',
|
|
219
269
|
transport: 'stdio',
|
|
220
270
|
command: 'uvx',
|
|
221
271
|
args: ['mcp-server-git', '--repository', '<仓库路径>'],
|
|
@@ -230,6 +280,7 @@ export const MCP_CATALOG = [
|
|
|
230
280
|
category: 'dev',
|
|
231
281
|
vendor: 'Oraios AI',
|
|
232
282
|
access: '开源免费(MIT),本地运行;需先 uv tool install -p 3.13 serena-agent',
|
|
283
|
+
auth: 'none',
|
|
233
284
|
transport: 'stdio',
|
|
234
285
|
command: 'serena',
|
|
235
286
|
args: ['start-mcp-server', '--context', 'ide', '--project-from-cwd'],
|
|
@@ -243,6 +294,7 @@ export const MCP_CATALOG = [
|
|
|
243
294
|
category: 'dev',
|
|
244
295
|
vendor: 'Anthropic',
|
|
245
296
|
access: '开源免费,演示与测试用途',
|
|
297
|
+
auth: 'none',
|
|
246
298
|
transport: 'stdio',
|
|
247
299
|
command: 'npx',
|
|
248
300
|
args: ['-y', '@modelcontextprotocol/server-everything'],
|
|
@@ -256,6 +308,8 @@ export const MCP_CATALOG = [
|
|
|
256
308
|
category: 'dev',
|
|
257
309
|
vendor: 'Windsurf',
|
|
258
310
|
access: '开源免费;装了 Windsurf 会自动读取其 Key,没有才需自备 WINDSURF_API_KEY',
|
|
311
|
+
auth: 'apiKey',
|
|
312
|
+
authNote: '装了 Windsurf 会自动取 Key;否则填 WINDSURF_API_KEY',
|
|
259
313
|
transport: 'stdio',
|
|
260
314
|
command: 'npx',
|
|
261
315
|
args: ['-y', 'fast-context-mcp'],
|
|
@@ -270,6 +324,7 @@ export const MCP_CATALOG = [
|
|
|
270
324
|
category: 'security',
|
|
271
325
|
vendor: 'jshookmcp',
|
|
272
326
|
access: '开源免费(AGPL-3.0),本地运行;需 Node 22.12+。工具档位由环境变量 MCP_TOOL_PROFILE 控制(search ≈3K tokens / workflow / full ≈40K+),默认档已够用',
|
|
327
|
+
auth: 'none',
|
|
273
328
|
transport: 'stdio',
|
|
274
329
|
command: 'npx',
|
|
275
330
|
args: ['-y', '@jshookmcp/jshook@latest'],
|
|
@@ -283,6 +338,7 @@ export const MCP_CATALOG = [
|
|
|
283
338
|
category: 'security',
|
|
284
339
|
vendor: 'mrexodia',
|
|
285
340
|
access: '需本机已装 IDA Pro;服务本身按需拉取,无需预先 pip install',
|
|
341
|
+
auth: 'none',
|
|
286
342
|
transport: 'stdio',
|
|
287
343
|
command: 'uvx',
|
|
288
344
|
args: ['--with', 'mcp<2', '--with', 'ida-pro-mcp', 'ida-pro-mcp'],
|
|
@@ -296,6 +352,7 @@ export const MCP_CATALOG = [
|
|
|
296
352
|
category: 'security',
|
|
297
353
|
vendor: 'dnakov',
|
|
298
354
|
access: '开源免费(MIT),本地运行;需本机装 Frida 与被测目标。实测 uvx 启动并完成 initialize/tools/list 握手,enumerate_processes 可正常返回本机进程',
|
|
355
|
+
auth: 'none',
|
|
299
356
|
transport: 'stdio',
|
|
300
357
|
command: 'uvx',
|
|
301
358
|
args: ['--with', 'mcp<2', '--with', 'frida-mcp', 'frida-mcp'],
|
|
@@ -309,6 +366,7 @@ export const MCP_CATALOG = [
|
|
|
309
366
|
category: 'data',
|
|
310
367
|
vendor: 't8y2',
|
|
311
368
|
access: '开源免费,本地原生二进制;数据源在 DBX 应用里配置',
|
|
369
|
+
auth: 'none',
|
|
312
370
|
transport: 'stdio',
|
|
313
371
|
command: 'npx',
|
|
314
372
|
args: ['-y', '@dbx-app/mcp-server'],
|
|
@@ -322,6 +380,8 @@ export const MCP_CATALOG = [
|
|
|
322
380
|
category: 'data',
|
|
323
381
|
vendor: 'Crystal DBA',
|
|
324
382
|
access: '开源免费,需自备数据库连接串(DATABASE_URI)',
|
|
383
|
+
auth: 'apiKey',
|
|
384
|
+
authNote: '填 DATABASE_URI(数据库连接串,含口令)',
|
|
325
385
|
transport: 'stdio',
|
|
326
386
|
command: 'uvx',
|
|
327
387
|
args: ['--with', 'mcp<2', 'postgres-mcp', '--access-mode=unrestricted'],
|
|
@@ -336,6 +396,7 @@ export const MCP_CATALOG = [
|
|
|
336
396
|
category: 'data',
|
|
337
397
|
vendor: 'Anthropic',
|
|
338
398
|
access: '开源免费,只操作本地 .db 文件。注意:官方已归档,仅有维护性修复',
|
|
399
|
+
auth: 'none',
|
|
339
400
|
transport: 'stdio',
|
|
340
401
|
command: 'uvx',
|
|
341
402
|
args: ['mcp-server-sqlite', '--db-path', '<数据库路径>'],
|
|
@@ -350,6 +411,8 @@ export const MCP_CATALOG = [
|
|
|
350
411
|
category: 'data',
|
|
351
412
|
vendor: 'Redis',
|
|
352
413
|
access: '开源免费(MIT),需自备 Redis 实例',
|
|
414
|
+
auth: 'apiKey',
|
|
415
|
+
authNote: '填 REDIS_HOST / REDIS_PORT;实例要口令时一并给',
|
|
353
416
|
transport: 'stdio',
|
|
354
417
|
command: 'uvx',
|
|
355
418
|
args: ['--from', 'redis-mcp-server@latest', 'redis-mcp-server', '--url', 'redis://localhost:6379/0'],
|
|
@@ -364,6 +427,8 @@ export const MCP_CATALOG = [
|
|
|
364
427
|
category: 'data',
|
|
365
428
|
vendor: 'ClickHouse',
|
|
366
429
|
access: '开源免费,默认只读;需自备 ClickHouse 连接信息',
|
|
430
|
+
auth: 'apiKey',
|
|
431
|
+
authNote: '填 CLICKHOUSE_HOST / PORT / USER 与 CLICKHOUSE_PASSWORD',
|
|
367
432
|
transport: 'stdio',
|
|
368
433
|
command: 'uv',
|
|
369
434
|
args: ['run', '--with', 'mcp-clickhouse', '--python', '3.12', 'mcp-clickhouse'],
|
|
@@ -379,6 +444,8 @@ export const MCP_CATALOG = [
|
|
|
379
444
|
category: 'data',
|
|
380
445
|
vendor: 'MongoDB',
|
|
381
446
|
access: '开源免费(Apache-2.0),需自备连接串',
|
|
447
|
+
auth: 'apiKey',
|
|
448
|
+
authNote: '填 MDB_MCP_CONNECTION_STRING(含口令的连接串)',
|
|
382
449
|
transport: 'stdio',
|
|
383
450
|
command: 'npx',
|
|
384
451
|
args: ['-y', 'mongodb-mcp-server@latest', '--readOnly'],
|
|
@@ -393,6 +460,9 @@ export const MCP_CATALOG = [
|
|
|
393
460
|
category: 'data',
|
|
394
461
|
vendor: 'Supabase',
|
|
395
462
|
access: '需 Supabase 账号 OAuth 授权;支持 ?read_only=true 等参数收敛权限',
|
|
463
|
+
// 判 oauth:access 只承诺 OAuth,Token 那条路属于未文档化能力
|
|
464
|
+
auth: 'oauth',
|
|
465
|
+
authNote: '官方写的是 OAuth;有 SUPABASE_ACCESS_TOKEN 的话可试 Bearer 直连(未获文档保证)',
|
|
396
466
|
transport: 'streamable-http',
|
|
397
467
|
url: 'https://mcp.supabase.com/mcp',
|
|
398
468
|
headers: { 'Authorization': '!!js "Bearer " + (process.env.SUPABASE_ACCESS_TOKEN ?? "")' },
|
|
@@ -406,6 +476,8 @@ export const MCP_CATALOG = [
|
|
|
406
476
|
category: 'data',
|
|
407
477
|
vendor: 'Neon',
|
|
408
478
|
access: '需 Neon 账号 OAuth 或 API Key;可选只读模式与单项目限定',
|
|
479
|
+
auth: 'oauth-or-pat',
|
|
480
|
+
authNote: '官方主推 OAuth;改用 NEON_API_KEY 作 Bearer 即可直连',
|
|
409
481
|
transport: 'streamable-http',
|
|
410
482
|
url: 'https://mcp.neon.tech/mcp',
|
|
411
483
|
headers: { 'Authorization': '!!js "Bearer " + (process.env.NEON_API_KEY ?? "")' },
|
|
@@ -419,6 +491,7 @@ export const MCP_CATALOG = [
|
|
|
419
491
|
category: 'ai',
|
|
420
492
|
vendor: 'regenrek',
|
|
421
493
|
access: '完全免费,无需认证;本地进程抓取,与官方远端版功能重叠,按需选一个',
|
|
494
|
+
auth: 'none',
|
|
422
495
|
transport: 'stdio',
|
|
423
496
|
command: 'npx',
|
|
424
497
|
args: ['-y', 'mcp-deepwiki@latest'],
|
|
@@ -432,6 +505,7 @@ export const MCP_CATALOG = [
|
|
|
432
505
|
category: 'ai',
|
|
433
506
|
vendor: 'Anthropic',
|
|
434
507
|
access: '开源免费,数据存于本地文件',
|
|
508
|
+
auth: 'none',
|
|
435
509
|
transport: 'stdio',
|
|
436
510
|
command: 'npx',
|
|
437
511
|
args: ['-y', '@modelcontextprotocol/server-memory'],
|
|
@@ -445,6 +519,7 @@ export const MCP_CATALOG = [
|
|
|
445
519
|
category: 'ai',
|
|
446
520
|
vendor: 'Anthropic',
|
|
447
521
|
access: '开源免费,无需任何 Key',
|
|
522
|
+
auth: 'none',
|
|
448
523
|
transport: 'stdio',
|
|
449
524
|
command: 'npx',
|
|
450
525
|
args: ['-y', '@modelcontextprotocol/server-sequential-thinking'],
|
|
@@ -458,6 +533,7 @@ export const MCP_CATALOG = [
|
|
|
458
533
|
category: 'ai',
|
|
459
534
|
vendor: 'Upstash',
|
|
460
535
|
access: '免密可用;官网可领免费 API Key 提升速率上限',
|
|
536
|
+
auth: 'none',
|
|
461
537
|
transport: 'streamable-http',
|
|
462
538
|
url: 'https://mcp.context7.com/mcp',
|
|
463
539
|
headers: { 'Authorization': '!!js "Bearer " + (process.env.CONTEXT7_API_KEY ?? "")' },
|
|
@@ -471,6 +547,7 @@ export const MCP_CATALOG = [
|
|
|
471
547
|
category: 'ai',
|
|
472
548
|
vendor: 'Cognition (Devin)',
|
|
473
549
|
access: '完全免费,无需认证,仅访问公开仓库',
|
|
550
|
+
auth: 'none',
|
|
474
551
|
transport: 'streamable-http',
|
|
475
552
|
url: 'https://mcp.deepwiki.com/mcp',
|
|
476
553
|
homepage: 'https://docs.devin.ai/work-with-devin/deepwiki-mcp',
|
|
@@ -482,6 +559,7 @@ export const MCP_CATALOG = [
|
|
|
482
559
|
category: 'ai',
|
|
483
560
|
vendor: 'Hugging Face',
|
|
484
561
|
access: '免密可用基础工具;登录后可选用个人已配置的 App 与工具',
|
|
562
|
+
auth: 'none',
|
|
485
563
|
transport: 'streamable-http',
|
|
486
564
|
url: 'https://huggingface.co/mcp',
|
|
487
565
|
headers: { 'Authorization': '!!js "Bearer " + (process.env.HF_TOKEN ?? "")' },
|
|
@@ -495,6 +573,7 @@ export const MCP_CATALOG = [
|
|
|
495
573
|
category: 'ai',
|
|
496
574
|
vendor: 'Blazick(社区维护,非 arXiv 官方)',
|
|
497
575
|
access: '开源免费,无需 Key',
|
|
576
|
+
auth: 'none',
|
|
498
577
|
transport: 'stdio',
|
|
499
578
|
command: 'uvx',
|
|
500
579
|
args: ['arxiv-mcp-server'],
|
|
@@ -508,6 +587,7 @@ export const MCP_CATALOG = [
|
|
|
508
587
|
category: 'browser',
|
|
509
588
|
vendor: 'Google',
|
|
510
589
|
access: '开源免费,本地运行;需本机安装 Chrome',
|
|
590
|
+
auth: 'none',
|
|
511
591
|
transport: 'stdio',
|
|
512
592
|
command: 'npx',
|
|
513
593
|
args: ['-y', 'chrome-devtools-mcp@latest'],
|
|
@@ -521,6 +601,7 @@ export const MCP_CATALOG = [
|
|
|
521
601
|
category: 'browser',
|
|
522
602
|
vendor: 'Microsoft',
|
|
523
603
|
access: '开源免费(Apache-2.0),本地运行;需 Node.js 18+',
|
|
604
|
+
auth: 'none',
|
|
524
605
|
transport: 'stdio',
|
|
525
606
|
command: 'npx',
|
|
526
607
|
args: ['-y', '@playwright/mcp@latest'],
|
|
@@ -534,6 +615,8 @@ export const MCP_CATALOG = [
|
|
|
534
615
|
category: 'cloud',
|
|
535
616
|
vendor: 'Cloudflare',
|
|
536
617
|
access: '需 Cloudflare 账号 OAuth 授权;也可用 API Token 作 Bearer',
|
|
618
|
+
auth: 'oauth-or-pat',
|
|
619
|
+
authNote: '官方主推 OAuth;改用 CLOUDFLARE_API_TOKEN 作 Bearer 即可直连',
|
|
537
620
|
transport: 'streamable-http',
|
|
538
621
|
url: 'https://mcp.cloudflare.com/mcp',
|
|
539
622
|
headers: { 'Authorization': '!!js "Bearer " + (process.env.CLOUDFLARE_API_TOKEN ?? "")' },
|
|
@@ -547,6 +630,7 @@ export const MCP_CATALOG = [
|
|
|
547
630
|
category: 'cloud',
|
|
548
631
|
vendor: 'Cloudflare',
|
|
549
632
|
access: '免密可用,无需任何账号',
|
|
633
|
+
auth: 'none',
|
|
550
634
|
transport: 'streamable-http',
|
|
551
635
|
url: 'https://docs.mcp.cloudflare.com/mcp',
|
|
552
636
|
homepage: 'https://developers.cloudflare.com/agents/model-context-protocol/mcp-servers-for-cloudflare/',
|
|
@@ -558,6 +642,8 @@ export const MCP_CATALOG = [
|
|
|
558
642
|
category: 'cloud',
|
|
559
643
|
vendor: 'Amazon Web Services',
|
|
560
644
|
access: '开源免费;凭据取自本机 AWS 配置(~/.aws),需可访问 Bedrock',
|
|
645
|
+
auth: 'apiKey',
|
|
646
|
+
authNote: '凭据取自本机 ~/.aws,无需在此填 Key;账号需能访问 Bedrock',
|
|
561
647
|
transport: 'stdio',
|
|
562
648
|
command: 'uvx',
|
|
563
649
|
args: ['mcp-proxy-for-aws@latest', 'https://aws-mcp.us-east-1.api.aws/mcp'],
|
|
@@ -571,6 +657,8 @@ export const MCP_CATALOG = [
|
|
|
571
657
|
category: 'cloud',
|
|
572
658
|
vendor: 'Red Hat / CNCF',
|
|
573
659
|
access: '开源免费(Apache-2.0),使用本机 kubeconfig',
|
|
660
|
+
auth: 'apiKey',
|
|
661
|
+
authNote: '用本机 kubeconfig 的凭据,无需在此填 Key;集群需可连通',
|
|
574
662
|
transport: 'stdio',
|
|
575
663
|
command: 'npx',
|
|
576
664
|
args: ['-y', 'kubernetes-mcp-server@latest'],
|
|
@@ -584,6 +672,7 @@ export const MCP_CATALOG = [
|
|
|
584
672
|
category: 'cloud',
|
|
585
673
|
vendor: 'Docker',
|
|
586
674
|
access: '开源免费(MIT),需 Docker Desktop 或 docker CLI 插件',
|
|
675
|
+
auth: 'none',
|
|
587
676
|
transport: 'stdio',
|
|
588
677
|
command: 'docker',
|
|
589
678
|
args: ['mcp', 'gateway', 'run'],
|
|
@@ -596,6 +685,9 @@ export const MCP_CATALOG = [
|
|
|
596
685
|
category: 'cloud',
|
|
597
686
|
vendor: 'Netlify',
|
|
598
687
|
access: '需 Netlify 账号 OAuth 授权|⚠️ 静态 Token 方式未获官方确认(官方文档的 NETLIFY_PERSONAL_ACCESS_TOKEN 是本地 stdio 包的环境变量,远端端点只文档化了 OAuth),在 DSH 中可能无法授权',
|
|
688
|
+
// 判 oauth:NETLIFY_PERSONAL_ACCESS_TOKEN 只对本地 stdio 包成立,远端端点拿不到替代路径
|
|
689
|
+
auth: 'oauth',
|
|
690
|
+
authNote: '远端端点只文档化了 OAuth,静态 Token 未获官方确认,本宿主会卡在授权;装了也连不上',
|
|
599
691
|
transport: 'streamable-http',
|
|
600
692
|
url: 'https://netlify-mcp.netlify.app/mcp',
|
|
601
693
|
homepage: 'https://docs.netlify.com/build/build-with-ai/netlify-mcp-server/',
|
|
@@ -607,6 +699,8 @@ export const MCP_CATALOG = [
|
|
|
607
699
|
category: 'productivity',
|
|
608
700
|
vendor: 'Linear',
|
|
609
701
|
access: '需 Linear 账号 OAuth;只读可用 https://mcp.linear.app/mcp/readonly',
|
|
702
|
+
auth: 'oauth',
|
|
703
|
+
authNote: '官方写的是 OAuth;LINEAR_API_KEY 作 Bearer 未见文档支持,装了大概率连不上',
|
|
610
704
|
transport: 'streamable-http',
|
|
611
705
|
url: 'https://mcp.linear.app/mcp',
|
|
612
706
|
headers: { 'Authorization': '!!js "Bearer " + (process.env.LINEAR_API_KEY ?? "")' },
|
|
@@ -620,6 +714,8 @@ export const MCP_CATALOG = [
|
|
|
620
714
|
category: 'productivity',
|
|
621
715
|
vendor: 'Atlassian',
|
|
622
716
|
access: '有免费档(无需信用卡);需 Atlassian 账号 OAuth 授权',
|
|
717
|
+
auth: 'oauth',
|
|
718
|
+
authNote: '官方写的是 OAuth;ATLASSIAN_API_TOKEN 作 Bearer 未见文档支持,装了大概率连不上',
|
|
623
719
|
transport: 'streamable-http',
|
|
624
720
|
url: 'https://mcp.atlassian.com/v2/mcp',
|
|
625
721
|
headers: { 'Authorization': '!!js "Bearer " + (process.env.ATLASSIAN_API_TOKEN ?? "")' },
|
|
@@ -633,6 +729,8 @@ export const MCP_CATALOG = [
|
|
|
633
729
|
category: 'productivity',
|
|
634
730
|
vendor: 'Airtable',
|
|
635
731
|
access: '全部套餐可用(含免费档);需 Airtable OAuth 授权',
|
|
732
|
+
auth: 'oauth',
|
|
733
|
+
authNote: '官方写的是 OAuth;AIRTABLE_TOKEN 作 Bearer 未见文档支持,装了大概率连不上',
|
|
636
734
|
transport: 'streamable-http',
|
|
637
735
|
url: 'https://mcp.airtable.com/mcp',
|
|
638
736
|
headers: { 'Authorization': '!!js "Bearer " + (process.env.AIRTABLE_TOKEN ?? "")' },
|
|
@@ -646,6 +744,7 @@ export const MCP_CATALOG = [
|
|
|
646
744
|
category: 'productivity',
|
|
647
745
|
vendor: 'Microsoft',
|
|
648
746
|
access: '完全免费,无需认证、无需账号',
|
|
747
|
+
auth: 'none',
|
|
649
748
|
transport: 'streamable-http',
|
|
650
749
|
url: 'https://learn.microsoft.com/api/mcp',
|
|
651
750
|
homepage: 'https://learn.microsoft.com/en-us/training/support/mcp',
|
|
@@ -657,6 +756,7 @@ export const MCP_CATALOG = [
|
|
|
657
756
|
category: 'productivity',
|
|
658
757
|
vendor: 'Anthropic',
|
|
659
758
|
access: '开源免费,纯本地计算',
|
|
759
|
+
auth: 'none',
|
|
660
760
|
transport: 'stdio',
|
|
661
761
|
command: 'uvx',
|
|
662
762
|
args: ['mcp-server-time'],
|
|
@@ -670,6 +770,7 @@ export const MCP_CATALOG = [
|
|
|
670
770
|
category: 'files',
|
|
671
771
|
vendor: 'Anthropic',
|
|
672
772
|
access: '开源免费,仅能访问命令行中显式授权的目录',
|
|
773
|
+
auth: 'none',
|
|
673
774
|
transport: 'stdio',
|
|
674
775
|
command: 'npx',
|
|
675
776
|
args: ['-y', '@modelcontextprotocol/server-filesystem', '<允许访问的目录>'],
|
|
@@ -684,6 +785,9 @@ export const MCP_CATALOG = [
|
|
|
684
785
|
category: 'comms',
|
|
685
786
|
vendor: 'Slack',
|
|
686
787
|
access: '需先自建 Slack App 并走一次 OAuth 换出 xoxp- 用户令牌,再把该令牌配到这里;令牌本身可长期复用',
|
|
788
|
+
// 判 oauth-or-pat:OAuth 只发生在建 App 那一次,落到本宿主的是可长期复用的静态令牌
|
|
789
|
+
auth: 'oauth-or-pat',
|
|
790
|
+
authNote: '先在 Slack 建 App 走一次 OAuth 换出 xoxp- 用户令牌,填 SLACK_USER_TOKEN 即可长期复用',
|
|
687
791
|
transport: 'streamable-http',
|
|
688
792
|
url: 'https://mcp.slack.com/mcp',
|
|
689
793
|
headers: { 'Authorization': '!!js "Bearer " + (process.env.SLACK_USER_TOKEN ?? "")' },
|
package/lib/mcp-config.js
CHANGED
|
@@ -26,10 +26,14 @@ export const BUILTIN_MCP_SERVERS = MCP_CATALOG.map((entry) => {
|
|
|
26
26
|
label: entry.label,
|
|
27
27
|
summary: entry.summary,
|
|
28
28
|
access: entry.access,
|
|
29
|
+
// OPT-24:`auth` 是给面板判断「当前宿主装不装得上」的展示元数据,不是配置字段——
|
|
30
|
+
// `builtinSpec()` 只挑 MANAGED_CONFIG_FIELDS、`makeEntry()` 只挑固定字段表,两者都
|
|
31
|
+
// 不会带它,所以它和 authNote 落不进用户配置文件,mcp-client 收不到不认识的键。
|
|
32
|
+
auth: entry.auth,
|
|
29
33
|
name: entry.id,
|
|
30
34
|
transport: entry.transport,
|
|
31
35
|
}
|
|
32
|
-
for (const field of ['url', 'headers', 'command', 'args']) {
|
|
36
|
+
for (const field of ['url', 'headers', 'command', 'args', 'authNote']) {
|
|
33
37
|
if (entry[field] !== undefined) server[field] = structuredClone(entry[field])
|
|
34
38
|
}
|
|
35
39
|
return server
|
|
@@ -552,6 +556,11 @@ export function builtinMcpCatalog(effectiveServers) {
|
|
|
552
556
|
label: builtin.label,
|
|
553
557
|
summary: builtin.summary,
|
|
554
558
|
access: builtin.access,
|
|
559
|
+
// OPT-24:`auth` 走 builtin(BUILTIN_MCP_SERVERS 已投影),面板据此降级提示
|
|
560
|
+
// oauth 条目;`authNote` 只在存在时挂键——`none` 条目根本没有这个字段,补成空串
|
|
561
|
+
// 会让面板分不清「没有说明」和「说明是空的」。
|
|
562
|
+
auth: builtin.auth,
|
|
563
|
+
...(builtin.authNote !== undefined ? { authNote: builtin.authNote } : {}),
|
|
555
564
|
name: builtin.name,
|
|
556
565
|
transport: builtin.transport,
|
|
557
566
|
configuration: builtinSpec(builtin),
|