@comfanion/workflow 4.36.29 → 4.36.31

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/bin/cli.js CHANGED
@@ -259,14 +259,14 @@ program
259
259
  {
260
260
  type: 'checkbox',
261
261
  name: 'mcp_servers',
262
- message: 'Select MCP servers to enable:',
262
+ message: 'Select MCP servers to enable (writes to opencode.json):',
263
263
  choices: [
264
264
  { name: 'context7 - Library docs for npm, Go, Python (recommended)', value: 'context7', checked: true },
265
+ { name: 'grep - Search code examples from GitHub', value: 'grep', checked: false },
265
266
  { name: 'sequential-thinking - Enhanced reasoning for complex tasks', value: 'sequential-thinking', checked: false },
266
267
  { name: 'playwright - Browser automation and testing', value: 'playwright', checked: false },
267
- { name: 'chrome-devtools - Chrome debugging and inspection', value: 'chrome-devtools', checked: false },
268
- { name: 'atlassian - Jira/Confluence integration', value: 'atlassian', checked: false },
269
- { name: 'github - GitHub repos, issues, PRs', value: 'github', checked: false },
268
+ { name: 'github - GitHub repos, issues, PRs (needs GITHUB_TOKEN)', value: 'github', checked: false },
269
+ { name: 'sentry - Query Sentry issues and errors (OAuth)', value: 'sentry', checked: false },
270
270
  { name: 'postgres - PostgreSQL database queries', value: 'postgres', checked: false }
271
271
  ]
272
272
  }
@@ -504,26 +504,40 @@ program
504
504
  }
505
505
  }
506
506
 
507
- // Save MCP server selections (only if user made selections)
507
+ // Save MCP server selections to opencode.json
508
508
  if (config.mcp_servers && config.mcp_servers.length > 0) {
509
- spinner.text = 'Configuring MCP servers...';
510
- const mcpEnabledPath = path.join(targetDir, 'mcp', 'enabled.yaml');
509
+ spinner.text = 'Configuring MCP servers in opencode.json...';
510
+ const opencodeJsonPath = path.join(process.cwd(), 'opencode.json');
511
511
 
512
- // Don't overwrite existing enabled.yaml if updating
513
- if (!isUpdate || !await fs.pathExists(mcpEnabledPath)) {
514
- let mcpContent = `# Enabled MCP Servers
515
- # Your personal selection of MCP servers
516
- # This file is NOT modified by updates
517
-
518
- `;
519
- for (const server of config.mcp_servers) {
520
- mcpContent += `${server}:
521
- enabled: true
522
-
523
- `;
512
+ // MCP catalog with server configs
513
+ const mcpCatalog = {
514
+ 'context7': { type: 'remote', url: 'https://mcp.context7.com/mcp' },
515
+ 'grep': { type: 'remote', url: 'https://mcp.grep.app' },
516
+ 'sentry': { type: 'remote', url: 'https://mcp.sentry.dev/mcp', oauth: {} },
517
+ 'sequential-thinking': { type: 'local', command: ['npx', '-y', '@anthropic/mcp-sequential-thinking'] },
518
+ 'playwright': { type: 'local', command: ['npx', '-y', '@anthropic/mcp-playwright'] },
519
+ 'github': { type: 'local', command: ['npx', '-y', '@anthropic/mcp-github'] },
520
+ 'postgres': { type: 'local', command: ['npx', '-y', '@anthropic/mcp-postgres'] }
521
+ };
522
+
523
+ // Read existing opencode.json or create new
524
+ let opencodeConfig = { "$schema": "https://opencode.ai/config.json" };
525
+ try {
526
+ if (await fs.pathExists(opencodeJsonPath)) {
527
+ opencodeConfig = JSON.parse(await fs.readFile(opencodeJsonPath, 'utf8'));
528
+ }
529
+ } catch {}
530
+
531
+ // Add MCP servers
532
+ if (!opencodeConfig.mcp) opencodeConfig.mcp = {};
533
+ for (const serverId of config.mcp_servers) {
534
+ if (mcpCatalog[serverId]) {
535
+ opencodeConfig.mcp[serverId] = { ...mcpCatalog[serverId], enabled: true };
524
536
  }
525
- await fs.writeFile(mcpEnabledPath, mcpContent);
526
537
  }
538
+
539
+ await fs.writeFile(opencodeJsonPath, JSON.stringify(opencodeConfig, null, 2) + '\n');
540
+ console.log(chalk.green(`✅ MCP servers added to opencode.json`));
527
541
  }
528
542
 
529
543
  // Install plugin dependencies
@@ -1235,4 +1249,246 @@ program
1235
1249
  }
1236
1250
  });
1237
1251
 
1252
+ // =============================================================================
1253
+ // MCP COMMANDS
1254
+ // =============================================================================
1255
+
1256
+ // MCP catalog with server configs
1257
+ const MCP_CATALOG = {
1258
+ 'context7': {
1259
+ name: 'Context7',
1260
+ description: 'Library docs for npm, Go, Python',
1261
+ type: 'remote',
1262
+ url: 'https://mcp.context7.com/mcp',
1263
+ recommended: true
1264
+ },
1265
+ 'grep': {
1266
+ name: 'Grep by Vercel',
1267
+ description: 'Search code examples from GitHub',
1268
+ type: 'remote',
1269
+ url: 'https://mcp.grep.app',
1270
+ recommended: false
1271
+ },
1272
+ 'sentry': {
1273
+ name: 'Sentry',
1274
+ description: 'Query Sentry issues and errors',
1275
+ type: 'remote',
1276
+ url: 'https://mcp.sentry.dev/mcp',
1277
+ oauth: {},
1278
+ recommended: false
1279
+ },
1280
+ 'sequential-thinking': {
1281
+ name: 'Sequential Thinking',
1282
+ description: 'Enhanced reasoning for complex tasks',
1283
+ type: 'local',
1284
+ command: ['npx', '-y', '@anthropic/mcp-sequential-thinking'],
1285
+ recommended: true
1286
+ },
1287
+ 'playwright': {
1288
+ name: 'Playwright',
1289
+ description: 'Browser automation and testing',
1290
+ type: 'local',
1291
+ command: ['npx', '-y', '@anthropic/mcp-playwright'],
1292
+ recommended: false
1293
+ },
1294
+ 'chrome-devtools': {
1295
+ name: 'Chrome DevTools',
1296
+ description: 'Chrome debugging, DOM, network, console',
1297
+ type: 'local',
1298
+ command: ['npx', '-y', 'chrome-devtools-mcp@latest'],
1299
+ recommended: false
1300
+ },
1301
+ 'github': {
1302
+ name: 'GitHub',
1303
+ description: 'GitHub repos, issues, PRs',
1304
+ type: 'local',
1305
+ command: ['npx', '-y', '@anthropic/mcp-github'],
1306
+ requires_env: ['GITHUB_TOKEN'],
1307
+ recommended: false
1308
+ },
1309
+ 'gitlab': {
1310
+ name: 'GitLab',
1311
+ description: 'GitLab repos, issues, MRs',
1312
+ type: 'local',
1313
+ command: ['npx', '-y', '@anthropic/mcp-gitlab'],
1314
+ requires_env: ['GITLAB_TOKEN'],
1315
+ recommended: false
1316
+ },
1317
+ 'postgres': {
1318
+ name: 'PostgreSQL',
1319
+ description: 'Query PostgreSQL databases',
1320
+ type: 'local',
1321
+ command: ['npx', '-y', '@anthropic/mcp-postgres'],
1322
+ requires_env: ['POSTGRES_CONNECTION_STRING'],
1323
+ recommended: false
1324
+ },
1325
+ 'slack': {
1326
+ name: 'Slack',
1327
+ description: 'Slack messages and channels',
1328
+ type: 'local',
1329
+ command: ['npx', '-y', '@anthropic/mcp-slack'],
1330
+ requires_env: ['SLACK_TOKEN'],
1331
+ recommended: false
1332
+ }
1333
+ };
1334
+
1335
+ program
1336
+ .command('mcp')
1337
+ .description('Manage MCP servers in opencode.json')
1338
+ .argument('<action>', 'list | add <id> | remove <id> | install')
1339
+ .argument('[server]', 'Server ID for add/remove')
1340
+ .action(async (action, server) => {
1341
+ const opencodeJsonPath = path.join(process.cwd(), 'opencode.json');
1342
+
1343
+ if (action === 'list') {
1344
+ console.log(chalk.blue.bold('\n🔌 Available MCP Servers\n'));
1345
+
1346
+ // Show installed
1347
+ let installed = {};
1348
+ try {
1349
+ if (await fs.pathExists(opencodeJsonPath)) {
1350
+ const config = JSON.parse(await fs.readFile(opencodeJsonPath, 'utf8'));
1351
+ installed = config.mcp || {};
1352
+ }
1353
+ } catch {}
1354
+
1355
+ for (const [id, info] of Object.entries(MCP_CATALOG)) {
1356
+ const isInstalled = installed[id];
1357
+ const status = isInstalled ? chalk.green('✓') : chalk.gray('○');
1358
+ const rec = info.recommended ? chalk.yellow(' ⭐') : '';
1359
+ const type = info.type === 'remote' ? chalk.cyan('[remote]') : chalk.gray('[local]');
1360
+ console.log(` ${status} ${chalk.white(id)}${rec} ${type}`);
1361
+ console.log(chalk.gray(` ${info.description}`));
1362
+ if (info.requires_env) {
1363
+ console.log(chalk.yellow(` Requires: ${info.requires_env.join(', ')}`));
1364
+ }
1365
+ }
1366
+
1367
+ console.log(chalk.gray('\nUsage:'));
1368
+ console.log(chalk.cyan(' npx @comfanion/workflow mcp add context7'));
1369
+ console.log(chalk.cyan(' npx @comfanion/workflow mcp remove github'));
1370
+ console.log('');
1371
+
1372
+ } else if (action === 'add') {
1373
+ if (!server) {
1374
+ console.log(chalk.red('Usage: mcp add <server-id>'));
1375
+ console.log(chalk.gray('Run `mcp list` to see available servers'));
1376
+ process.exit(1);
1377
+ }
1378
+
1379
+ if (!MCP_CATALOG[server]) {
1380
+ console.log(chalk.red(`Unknown server: ${server}`));
1381
+ console.log(chalk.gray('Run `mcp list` to see available servers'));
1382
+ process.exit(1);
1383
+ }
1384
+
1385
+ const spinner = ora(`Adding ${server}...`).start();
1386
+
1387
+ // Read or create opencode.json
1388
+ let config = { "$schema": "https://opencode.ai/config.json" };
1389
+ try {
1390
+ if (await fs.pathExists(opencodeJsonPath)) {
1391
+ config = JSON.parse(await fs.readFile(opencodeJsonPath, 'utf8'));
1392
+ }
1393
+ } catch {}
1394
+
1395
+ if (!config.mcp) config.mcp = {};
1396
+
1397
+ const serverConfig = MCP_CATALOG[server];
1398
+ config.mcp[server] = {
1399
+ type: serverConfig.type,
1400
+ ...(serverConfig.type === 'remote'
1401
+ ? { url: serverConfig.url, ...(serverConfig.oauth ? { oauth: serverConfig.oauth } : {}) }
1402
+ : { command: serverConfig.command }),
1403
+ enabled: true
1404
+ };
1405
+
1406
+ await fs.writeFile(opencodeJsonPath, JSON.stringify(config, null, 2) + '\n');
1407
+ spinner.succeed(chalk.green(`Added ${server} to opencode.json`));
1408
+
1409
+ if (serverConfig.requires_env) {
1410
+ console.log(chalk.yellow(`\n⚠️ Set environment variables:`));
1411
+ for (const env of serverConfig.requires_env) {
1412
+ console.log(chalk.cyan(` export ${env}="..."`));
1413
+ }
1414
+ }
1415
+ if (serverConfig.oauth) {
1416
+ console.log(chalk.yellow(`\n⚠️ OAuth required. Run:`));
1417
+ console.log(chalk.cyan(` opencode mcp auth ${server}`));
1418
+ }
1419
+
1420
+ } else if (action === 'remove') {
1421
+ if (!server) {
1422
+ console.log(chalk.red('Usage: mcp remove <server-id>'));
1423
+ process.exit(1);
1424
+ }
1425
+
1426
+ if (!await fs.pathExists(opencodeJsonPath)) {
1427
+ console.log(chalk.yellow('No opencode.json found'));
1428
+ return;
1429
+ }
1430
+
1431
+ const spinner = ora(`Removing ${server}...`).start();
1432
+
1433
+ const config = JSON.parse(await fs.readFile(opencodeJsonPath, 'utf8'));
1434
+ if (config.mcp && config.mcp[server]) {
1435
+ delete config.mcp[server];
1436
+ await fs.writeFile(opencodeJsonPath, JSON.stringify(config, null, 2) + '\n');
1437
+ spinner.succeed(chalk.green(`Removed ${server} from opencode.json`));
1438
+ } else {
1439
+ spinner.info(chalk.yellow(`${server} not found in opencode.json`));
1440
+ }
1441
+
1442
+ } else if (action === 'install') {
1443
+ // Interactive selection
1444
+ const installed = {};
1445
+ try {
1446
+ if (await fs.pathExists(opencodeJsonPath)) {
1447
+ const config = JSON.parse(await fs.readFile(opencodeJsonPath, 'utf8'));
1448
+ Object.assign(installed, config.mcp || {});
1449
+ }
1450
+ } catch {}
1451
+
1452
+ const choices = Object.entries(MCP_CATALOG).map(([id, info]) => ({
1453
+ name: `${id} - ${info.description}${info.recommended ? ' (recommended)' : ''}`,
1454
+ value: id,
1455
+ checked: installed[id] || info.recommended
1456
+ }));
1457
+
1458
+ const { servers } = await inquirer.prompt([{
1459
+ type: 'checkbox',
1460
+ name: 'servers',
1461
+ message: 'Select MCP servers:',
1462
+ choices
1463
+ }]);
1464
+
1465
+ // Read or create opencode.json
1466
+ let config = { "$schema": "https://opencode.ai/config.json" };
1467
+ try {
1468
+ if (await fs.pathExists(opencodeJsonPath)) {
1469
+ config = JSON.parse(await fs.readFile(opencodeJsonPath, 'utf8'));
1470
+ }
1471
+ } catch {}
1472
+
1473
+ config.mcp = {};
1474
+ for (const id of servers) {
1475
+ const serverConfig = MCP_CATALOG[id];
1476
+ config.mcp[id] = {
1477
+ type: serverConfig.type,
1478
+ ...(serverConfig.type === 'remote'
1479
+ ? { url: serverConfig.url, ...(serverConfig.oauth ? { oauth: serverConfig.oauth } : {}) }
1480
+ : { command: serverConfig.command }),
1481
+ enabled: true
1482
+ };
1483
+ }
1484
+
1485
+ await fs.writeFile(opencodeJsonPath, JSON.stringify(config, null, 2) + '\n');
1486
+ console.log(chalk.green(`\n✅ Updated opencode.json with ${servers.length} MCP servers`));
1487
+
1488
+ } else {
1489
+ console.log(chalk.red(`Unknown action: ${action}`));
1490
+ console.log('Available: list, add <id>, remove <id>, install');
1491
+ }
1492
+ });
1493
+
1238
1494
  program.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@comfanion/workflow",
3
- "version": "4.36.29",
3
+ "version": "4.36.31",
4
4
  "description": "Initialize OpenCode Workflow system for AI-assisted development with semantic code search",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "4.36.29",
3
- "buildDate": "2026-01-24T20:54:34.023Z",
2
+ "version": "4.36.31",
3
+ "buildDate": "2026-01-24T21:00:42.959Z",
4
4
  "files": [
5
5
  "config.yaml",
6
6
  "FLOW.yaml",
@@ -6,15 +6,14 @@
6
6
  #
7
7
  # Usage:
8
8
  # npx @comfanion/workflow mcp list # Show available MCP servers
9
- # npx @comfanion/workflow mcp enable # Interactive selection
10
- # npx @comfanion/workflow mcp add <id> # Add specific MCP
9
+ # npx @comfanion/workflow mcp install # Install selected to opencode.json
11
10
  #
12
- # Version: 1.0.0
11
+ # Version: 1.1.0
13
12
  # Last updated: 2026-01-24
14
13
 
15
14
  servers:
16
15
  # ==========================================================================
17
- # DOCUMENTATION & RESEARCH
16
+ # DOCUMENTATION & RESEARCH (Remote MCP)
18
17
  # ==========================================================================
19
18
 
20
19
  context7:
@@ -22,13 +21,35 @@ servers:
22
21
  description: "Library documentation for npm, Go, Python packages"
23
22
  category: documentation
24
23
  recommended: true
25
- config:
26
- command: npx
27
- args: ["-y", "@anthropic/mcp-context7"]
24
+ type: remote
25
+ url: "https://mcp.context7.com/mcp"
28
26
  tags: [docs, npm, go, python, research]
29
27
 
28
+ grep:
29
+ name: "Grep by Vercel"
30
+ description: "Search code examples from GitHub"
31
+ category: documentation
32
+ recommended: false
33
+ type: remote
34
+ url: "https://mcp.grep.app"
35
+ tags: [github, code-search, examples]
36
+
37
+ # ==========================================================================
38
+ # INTEGRATIONS (Remote MCP with OAuth)
39
+ # ==========================================================================
40
+
41
+ sentry:
42
+ name: "Sentry"
43
+ description: "Query Sentry issues, projects, and error data"
44
+ category: integrations
45
+ recommended: false
46
+ type: remote
47
+ url: "https://mcp.sentry.dev/mcp"
48
+ oauth: true
49
+ tags: [errors, monitoring, debugging]
50
+
30
51
  # ==========================================================================
31
- # THINKING & REASONING
52
+ # LOCAL MCP SERVERS
32
53
  # ==========================================================================
33
54
 
34
55
  sequential-thinking:
@@ -36,73 +57,46 @@ servers:
36
57
  description: "Enhanced reasoning for complex multi-step problems"
37
58
  category: thinking
38
59
  recommended: true
39
- config:
40
- command: npx
41
- args: ["-y", "@anthropic/mcp-sequential-thinking"]
60
+ type: local
61
+ command: ["npx", "-y", "@anthropic/mcp-sequential-thinking"]
42
62
  tags: [reasoning, planning, complex-tasks]
43
63
 
44
- # ==========================================================================
45
- # BROWSER & UI
46
- # ==========================================================================
47
-
48
64
  playwright:
49
65
  name: "Playwright"
50
66
  description: "Browser automation, testing, and web scraping"
51
67
  category: browser
52
68
  recommended: false
53
- config:
54
- command: npx
55
- args: ["-y", "@anthropic/mcp-playwright"]
69
+ type: local
70
+ command: ["npx", "-y", "@anthropic/mcp-playwright"]
56
71
  tags: [browser, testing, automation, scraping]
57
72
 
58
73
  chrome-devtools:
59
74
  name: "Chrome DevTools"
60
- description: "Chrome debugging, performance analysis, DOM inspection"
75
+ description: "Chrome debugging, DOM inspection, network, console"
61
76
  category: browser
62
77
  recommended: false
63
- config:
64
- command: npx
65
- args: ["-y", "chrome-devtools-mcp@latest"]
66
- tags: [chrome, debugging, devtools]
78
+ type: local
79
+ command: ["npx", "-y", "chrome-devtools-mcp@latest"]
80
+ tags: [chrome, debugging, devtools, dom]
67
81
 
68
82
  puppeteer:
69
83
  name: "Puppeteer"
70
84
  description: "Headless Chrome automation"
71
85
  category: browser
72
86
  recommended: false
73
- config:
74
- command: npx
75
- args: ["-y", "@anthropic/mcp-puppeteer"]
87
+ type: local
88
+ command: ["npx", "-y", "@anthropic/mcp-puppeteer"]
76
89
  tags: [chrome, headless, automation]
77
90
 
78
- # ==========================================================================
79
- # INTEGRATIONS
80
- # ==========================================================================
81
-
82
- atlassian:
83
- name: "Atlassian (Jira/Confluence)"
84
- description: "Jira issues, Confluence pages integration"
85
- category: integrations
86
- recommended: false
87
- requires_env:
88
- - ATLASSIAN_EMAIL
89
- - ATLASSIAN_API_TOKEN
90
- - ATLASSIAN_URL
91
- config:
92
- command: npx
93
- args: ["-y", "@anthropic/mcp-atlassian"]
94
- tags: [jira, confluence, tickets, docs]
95
-
96
91
  github:
97
92
  name: "GitHub"
98
93
  description: "GitHub repos, issues, PRs, actions"
99
94
  category: integrations
100
95
  recommended: false
96
+ type: local
97
+ command: ["npx", "-y", "@anthropic/mcp-github"]
101
98
  requires_env:
102
99
  - GITHUB_TOKEN
103
- config:
104
- command: npx
105
- args: ["-y", "@anthropic/mcp-github"]
106
100
  tags: [github, git, issues, prs]
107
101
 
108
102
  gitlab:
@@ -110,11 +104,10 @@ servers:
110
104
  description: "GitLab repos, issues, MRs, pipelines"
111
105
  category: integrations
112
106
  recommended: false
107
+ type: local
108
+ command: ["npx", "-y", "@anthropic/mcp-gitlab"]
113
109
  requires_env:
114
110
  - GITLAB_TOKEN
115
- config:
116
- command: npx
117
- args: ["-y", "@anthropic/mcp-gitlab"]
118
111
  tags: [gitlab, git, issues, mrs]
119
112
 
120
113
  slack:
@@ -122,27 +115,21 @@ servers:
122
115
  description: "Slack messages, channels, search"
123
116
  category: integrations
124
117
  recommended: false
118
+ type: local
119
+ command: ["npx", "-y", "@anthropic/mcp-slack"]
125
120
  requires_env:
126
121
  - SLACK_TOKEN
127
- config:
128
- command: npx
129
- args: ["-y", "@anthropic/mcp-slack"]
130
122
  tags: [slack, messaging, communication]
131
123
 
132
- # ==========================================================================
133
- # DATA & STORAGE
134
- # ==========================================================================
135
-
136
124
  postgres:
137
125
  name: "PostgreSQL"
138
126
  description: "Query PostgreSQL databases"
139
127
  category: database
140
128
  recommended: false
129
+ type: local
130
+ command: ["npx", "-y", "@anthropic/mcp-postgres"]
141
131
  requires_env:
142
132
  - POSTGRES_CONNECTION_STRING
143
- config:
144
- command: npx
145
- args: ["-y", "@anthropic/mcp-postgres"]
146
133
  tags: [database, sql, postgres]
147
134
 
148
135
  sqlite:
@@ -150,9 +137,8 @@ servers:
150
137
  description: "Query SQLite databases"
151
138
  category: database
152
139
  recommended: false
153
- config:
154
- command: npx
155
- args: ["-y", "@anthropic/mcp-sqlite"]
140
+ type: local
141
+ command: ["npx", "-y", "@anthropic/mcp-sqlite"]
156
142
  tags: [database, sql, sqlite]
157
143
 
158
144
  redis:
@@ -160,51 +146,30 @@ servers:
160
146
  description: "Redis key-value operations"
161
147
  category: database
162
148
  recommended: false
149
+ type: local
150
+ command: ["npx", "-y", "@anthropic/mcp-redis"]
163
151
  requires_env:
164
152
  - REDIS_URL
165
- config:
166
- command: npx
167
- args: ["-y", "@anthropic/mcp-redis"]
168
153
  tags: [database, cache, redis]
169
154
 
170
- # ==========================================================================
171
- # FILE & SYSTEM
172
- # ==========================================================================
173
-
174
155
  filesystem:
175
156
  name: "Filesystem"
176
157
  description: "Advanced file operations (usually built-in)"
177
158
  category: system
178
159
  recommended: false
179
- config:
180
- command: npx
181
- args: ["-y", "@anthropic/mcp-filesystem"]
160
+ type: local
161
+ command: ["npx", "-y", "@anthropic/mcp-filesystem"]
182
162
  tags: [files, filesystem]
183
163
 
184
- # ==========================================================================
185
- # API & WEB
186
- # ==========================================================================
187
-
188
164
  fetch:
189
165
  name: "Fetch"
190
166
  description: "HTTP requests to external APIs (usually built-in)"
191
167
  category: api
192
168
  recommended: false
193
- config:
194
- command: npx
195
- args: ["-y", "@anthropic/mcp-fetch"]
169
+ type: local
170
+ command: ["npx", "-y", "@anthropic/mcp-fetch"]
196
171
  tags: [http, api, fetch]
197
172
 
198
- openapi:
199
- name: "OpenAPI"
200
- description: "Interact with APIs via OpenAPI specs"
201
- category: api
202
- recommended: false
203
- config:
204
- command: npx
205
- args: ["-y", "@anthropic/mcp-openapi"]
206
- tags: [api, openapi, swagger]
207
-
208
173
  # Categories for UI grouping
209
174
  categories:
210
175
  documentation: