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.
@@ -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),