claude-cli-advanced-starter-pack 1.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/LICENSE +21 -0
- package/OVERVIEW.md +597 -0
- package/README.md +439 -0
- package/bin/gtask.js +282 -0
- package/bin/postinstall.js +53 -0
- package/package.json +69 -0
- package/src/agents/phase-dev-templates.js +1011 -0
- package/src/agents/templates.js +668 -0
- package/src/analysis/checklist-parser.js +414 -0
- package/src/analysis/codebase.js +481 -0
- package/src/cli/menu.js +958 -0
- package/src/commands/claude-audit.js +1482 -0
- package/src/commands/claude-settings.js +2243 -0
- package/src/commands/create-agent.js +681 -0
- package/src/commands/create-command.js +337 -0
- package/src/commands/create-hook.js +262 -0
- package/src/commands/create-phase-dev/codebase-analyzer.js +813 -0
- package/src/commands/create-phase-dev/documentation-generator.js +352 -0
- package/src/commands/create-phase-dev/post-completion.js +404 -0
- package/src/commands/create-phase-dev/scale-calculator.js +344 -0
- package/src/commands/create-phase-dev/wizard.js +492 -0
- package/src/commands/create-phase-dev.js +481 -0
- package/src/commands/create-skill.js +313 -0
- package/src/commands/create.js +446 -0
- package/src/commands/decompose.js +392 -0
- package/src/commands/detect-tech-stack.js +768 -0
- package/src/commands/explore-mcp/claude-md-updater.js +252 -0
- package/src/commands/explore-mcp/mcp-installer.js +346 -0
- package/src/commands/explore-mcp/mcp-registry.js +438 -0
- package/src/commands/explore-mcp.js +638 -0
- package/src/commands/gtask-init.js +641 -0
- package/src/commands/help.js +128 -0
- package/src/commands/init.js +1890 -0
- package/src/commands/install.js +250 -0
- package/src/commands/list.js +116 -0
- package/src/commands/roadmap.js +750 -0
- package/src/commands/setup-wizard.js +482 -0
- package/src/commands/setup.js +351 -0
- package/src/commands/sync.js +534 -0
- package/src/commands/test-run.js +456 -0
- package/src/commands/test-setup.js +456 -0
- package/src/commands/validate.js +67 -0
- package/src/config/tech-stack.defaults.json +182 -0
- package/src/config/tech-stack.schema.json +502 -0
- package/src/github/client.js +359 -0
- package/src/index.js +84 -0
- package/src/templates/claude-command.js +244 -0
- package/src/templates/issue-body.js +284 -0
- package/src/testing/config.js +411 -0
- package/src/utils/template-engine.js +398 -0
- package/src/utils/validate-templates.js +223 -0
- package/src/utils.js +396 -0
- package/templates/commands/ccasp-setup.template.md +113 -0
- package/templates/commands/context-audit.template.md +97 -0
- package/templates/commands/create-task-list.template.md +382 -0
- package/templates/commands/deploy-full.template.md +261 -0
- package/templates/commands/github-task-start.template.md +99 -0
- package/templates/commands/github-update.template.md +69 -0
- package/templates/commands/happy-start.template.md +117 -0
- package/templates/commands/phase-track.template.md +142 -0
- package/templates/commands/tunnel-start.template.md +127 -0
- package/templates/commands/tunnel-stop.template.md +106 -0
- package/templates/hooks/context-guardian.template.js +173 -0
- package/templates/hooks/deployment-orchestrator.template.js +219 -0
- package/templates/hooks/github-progress-hook.template.js +197 -0
- package/templates/hooks/happy-checkpoint-manager.template.js +222 -0
- package/templates/hooks/phase-dev-enforcer.template.js +183 -0
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Registry & Discovery
|
|
3
|
+
*
|
|
4
|
+
* Curated registry of popular MCP servers with smart recommendations
|
|
5
|
+
* based on detected tech stack. No hardcoded project-specific values.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* MCP server registry - organized by category
|
|
10
|
+
* Each entry includes npm package, required env vars, and tech stack relevance
|
|
11
|
+
*/
|
|
12
|
+
export const MCP_REGISTRY = {
|
|
13
|
+
// Browser Automation & Testing
|
|
14
|
+
testing: [
|
|
15
|
+
{
|
|
16
|
+
id: 'playwright',
|
|
17
|
+
name: 'Playwright MCP',
|
|
18
|
+
description: 'Official Playwright browser automation - navigate, click, screenshot, form fill',
|
|
19
|
+
npmPackage: '@playwright/mcp@latest',
|
|
20
|
+
category: 'testing',
|
|
21
|
+
requiredEnv: {},
|
|
22
|
+
optionalEnv: {
|
|
23
|
+
PLAYWRIGHT_HEADLESS: { default: 'true', description: 'Run in headless mode' },
|
|
24
|
+
},
|
|
25
|
+
relevantFor: ['react', 'vue', 'angular', 'svelte', 'nextjs', 'nuxt', 'frontend'],
|
|
26
|
+
recommended: true,
|
|
27
|
+
tools: ['browser_navigate', 'browser_click', 'browser_fill', 'browser_screenshot', 'browser_snapshot'],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'puppeteer',
|
|
31
|
+
name: 'Puppeteer MCP',
|
|
32
|
+
description: 'Chrome/Chromium automation via Puppeteer - lightweight alternative to Playwright',
|
|
33
|
+
npmPackage: '@modelcontextprotocol/server-puppeteer',
|
|
34
|
+
category: 'testing',
|
|
35
|
+
requiredEnv: {},
|
|
36
|
+
optionalEnv: {
|
|
37
|
+
BROWSER_HEADLESS: { default: 'new', description: 'Headless mode (new/true/false)' },
|
|
38
|
+
BROWSER_URL: { description: 'Default URL to navigate to' },
|
|
39
|
+
},
|
|
40
|
+
relevantFor: ['react', 'vue', 'angular', 'svelte', 'nextjs', 'frontend'],
|
|
41
|
+
recommended: true,
|
|
42
|
+
tools: ['puppeteer_navigate', 'puppeteer_screenshot', 'puppeteer_click', 'puppeteer_fill'],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: 'playwright-ext',
|
|
46
|
+
name: 'Playwright Extended',
|
|
47
|
+
description: 'Extended Playwright with API testing, iframes, PDF export',
|
|
48
|
+
npmPackage: '@executeautomation/playwright-mcp-server',
|
|
49
|
+
category: 'testing',
|
|
50
|
+
requiredEnv: {},
|
|
51
|
+
optionalEnv: {},
|
|
52
|
+
relevantFor: ['react', 'vue', 'angular', 'api', 'e2e'],
|
|
53
|
+
recommended: false,
|
|
54
|
+
tools: ['playwright_navigate', 'playwright_screenshot', 'playwright_get', 'playwright_post'],
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
|
|
58
|
+
// Version Control & GitHub
|
|
59
|
+
vcs: [
|
|
60
|
+
{
|
|
61
|
+
id: 'github',
|
|
62
|
+
name: 'GitHub MCP',
|
|
63
|
+
description: 'GitHub API - issues, PRs, files, branches, commits',
|
|
64
|
+
npmPackage: '@modelcontextprotocol/server-github',
|
|
65
|
+
category: 'vcs',
|
|
66
|
+
requiredEnv: {
|
|
67
|
+
GITHUB_PERSONAL_ACCESS_TOKEN: { description: 'GitHub PAT with repo access' },
|
|
68
|
+
},
|
|
69
|
+
optionalEnv: {},
|
|
70
|
+
relevantFor: ['all'],
|
|
71
|
+
recommended: true,
|
|
72
|
+
tools: ['create_issue', 'create_pull_request', 'get_file_contents', 'search_code'],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: 'git',
|
|
76
|
+
name: 'Git MCP',
|
|
77
|
+
description: 'Local git operations - commits, branches, diffs',
|
|
78
|
+
npmPackage: '@modelcontextprotocol/server-git',
|
|
79
|
+
category: 'vcs',
|
|
80
|
+
requiredEnv: {},
|
|
81
|
+
optionalEnv: {},
|
|
82
|
+
relevantFor: ['all'],
|
|
83
|
+
recommended: false,
|
|
84
|
+
tools: ['git_status', 'git_diff', 'git_log', 'git_branch'],
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
|
|
88
|
+
// Deployment & Infrastructure
|
|
89
|
+
deployment: [
|
|
90
|
+
{
|
|
91
|
+
id: 'railway',
|
|
92
|
+
name: 'Railway MCP',
|
|
93
|
+
description: 'Railway deployments, services, variables, logs',
|
|
94
|
+
npmPackage: '@jasontanswe/railway-mcp',
|
|
95
|
+
category: 'deployment',
|
|
96
|
+
requiredEnv: {
|
|
97
|
+
RAILWAY_API_TOKEN: { description: 'Railway API token from dashboard' },
|
|
98
|
+
},
|
|
99
|
+
optionalEnv: {},
|
|
100
|
+
relevantFor: ['railway', 'backend', 'api', 'fastapi', 'express', 'nodejs'],
|
|
101
|
+
recommended: false,
|
|
102
|
+
tools: ['deployment_trigger', 'deployment_logs', 'service_list', 'variable_set'],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: 'cloudflare',
|
|
106
|
+
name: 'Cloudflare MCP',
|
|
107
|
+
description: 'Cloudflare Workers, Pages, DNS, KV',
|
|
108
|
+
npmPackage: '@cloudflare/mcp-server-cloudflare',
|
|
109
|
+
category: 'deployment',
|
|
110
|
+
requiredEnv: {
|
|
111
|
+
CLOUDFLARE_API_TOKEN: { description: 'Cloudflare API token' },
|
|
112
|
+
},
|
|
113
|
+
optionalEnv: {},
|
|
114
|
+
relevantFor: ['cloudflare', 'vercel', 'netlify', 'frontend', 'workers'],
|
|
115
|
+
recommended: false,
|
|
116
|
+
tools: ['deploy_worker', 'kv_get', 'kv_put', 'dns_records'],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: 'digitalocean',
|
|
120
|
+
name: 'DigitalOcean MCP',
|
|
121
|
+
description: 'DigitalOcean droplets, databases, storage',
|
|
122
|
+
npmPackage: '@digitalocean/mcp@latest',
|
|
123
|
+
category: 'deployment',
|
|
124
|
+
requiredEnv: {
|
|
125
|
+
DIGITALOCEAN_API_TOKEN: { description: 'DigitalOcean API token' },
|
|
126
|
+
},
|
|
127
|
+
optionalEnv: {},
|
|
128
|
+
relevantFor: ['digitalocean', 'self-hosted', 'backend'],
|
|
129
|
+
recommended: false,
|
|
130
|
+
tools: ['list_droplets', 'create_droplet', 'list_databases'],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
id: 'vercel',
|
|
134
|
+
name: 'Vercel MCP',
|
|
135
|
+
description: 'Vercel deployments, domains, environment variables',
|
|
136
|
+
npmPackage: '@vercel/mcp',
|
|
137
|
+
category: 'deployment',
|
|
138
|
+
requiredEnv: {
|
|
139
|
+
VERCEL_TOKEN: { description: 'Vercel API token' },
|
|
140
|
+
},
|
|
141
|
+
optionalEnv: {},
|
|
142
|
+
relevantFor: ['vercel', 'nextjs', 'frontend', 'react'],
|
|
143
|
+
recommended: false,
|
|
144
|
+
tools: ['list_deployments', 'trigger_deploy', 'get_domains'],
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
|
|
148
|
+
// Database & Backend Services
|
|
149
|
+
database: [
|
|
150
|
+
{
|
|
151
|
+
id: 'postgres',
|
|
152
|
+
name: 'PostgreSQL MCP',
|
|
153
|
+
description: 'Query PostgreSQL databases directly',
|
|
154
|
+
npmPackage: '@bytebase/dbhub',
|
|
155
|
+
category: 'database',
|
|
156
|
+
requiredEnv: {},
|
|
157
|
+
optionalEnv: {},
|
|
158
|
+
args: ['--dsn', 'postgresql://user:pass@host:5432/db'],
|
|
159
|
+
relevantFor: ['postgresql', 'postgres', 'prisma', 'sequelize', 'typeorm', 'drizzle'],
|
|
160
|
+
recommended: false,
|
|
161
|
+
tools: ['query', 'list_tables', 'describe_table'],
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
id: 'sqlite',
|
|
165
|
+
name: 'SQLite MCP',
|
|
166
|
+
description: 'Query SQLite databases',
|
|
167
|
+
npmPackage: '@modelcontextprotocol/server-sqlite',
|
|
168
|
+
category: 'database',
|
|
169
|
+
requiredEnv: {},
|
|
170
|
+
optionalEnv: {},
|
|
171
|
+
relevantFor: ['sqlite', 'better-sqlite3'],
|
|
172
|
+
recommended: false,
|
|
173
|
+
tools: ['query', 'list_tables'],
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
id: 'supabase',
|
|
177
|
+
name: 'Supabase MCP',
|
|
178
|
+
description: 'Supabase database, auth, storage, and edge functions',
|
|
179
|
+
npmPackage: '@supabase/mcp-server-supabase@latest',
|
|
180
|
+
category: 'database',
|
|
181
|
+
requiredEnv: {
|
|
182
|
+
SUPABASE_ACCESS_TOKEN: { description: 'Supabase access token from dashboard' },
|
|
183
|
+
},
|
|
184
|
+
optionalEnv: {},
|
|
185
|
+
relevantFor: ['supabase', 'postgresql', 'postgres', 'auth', 'storage', 'realtime'],
|
|
186
|
+
recommended: true,
|
|
187
|
+
tools: ['list_tables', 'execute_sql', 'get_logs', 'list_edge_functions', 'deploy_edge_function', 'list_storage_buckets'],
|
|
188
|
+
note: 'Full Supabase platform access - database, auth, storage, edge functions, and logs',
|
|
189
|
+
},
|
|
190
|
+
],
|
|
191
|
+
|
|
192
|
+
// Automation & Workflows
|
|
193
|
+
automation: [
|
|
194
|
+
{
|
|
195
|
+
id: 'n8n',
|
|
196
|
+
name: 'n8n MCP',
|
|
197
|
+
description: 'n8n workflow automation - manage workflows, executions, and credentials',
|
|
198
|
+
npmPackage: '@n8n/n8n-mcp-server',
|
|
199
|
+
category: 'automation',
|
|
200
|
+
requiredEnv: {
|
|
201
|
+
N8N_API_KEY: { description: 'n8n API key' },
|
|
202
|
+
N8N_BASE_URL: { description: 'n8n instance URL (e.g., https://your-n8n.app.n8n.cloud)' },
|
|
203
|
+
},
|
|
204
|
+
optionalEnv: {},
|
|
205
|
+
relevantFor: ['n8n', 'automation', 'workflow', 'integration'],
|
|
206
|
+
recommended: true,
|
|
207
|
+
tools: ['list_workflows', 'get_workflow', 'execute_workflow', 'list_executions', 'list_credentials'],
|
|
208
|
+
note: 'Automate workflows and integrate with 400+ apps via n8n',
|
|
209
|
+
},
|
|
210
|
+
],
|
|
211
|
+
|
|
212
|
+
// Communication & Collaboration
|
|
213
|
+
communication: [
|
|
214
|
+
{
|
|
215
|
+
id: 'slack',
|
|
216
|
+
name: 'Slack MCP',
|
|
217
|
+
description: 'Send/read Slack messages, manage channels',
|
|
218
|
+
npmPackage: '@anthropic/mcp-server-slack',
|
|
219
|
+
category: 'communication',
|
|
220
|
+
requiredEnv: {
|
|
221
|
+
SLACK_BOT_TOKEN: { description: 'Slack Bot OAuth token' },
|
|
222
|
+
},
|
|
223
|
+
optionalEnv: {},
|
|
224
|
+
relevantFor: ['slack', 'team'],
|
|
225
|
+
recommended: false,
|
|
226
|
+
tools: ['send_message', 'read_channel', 'list_channels'],
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
id: 'resend',
|
|
230
|
+
name: 'Resend MCP',
|
|
231
|
+
description: 'Send emails via Resend API',
|
|
232
|
+
npmPackage: 'resend-mcp',
|
|
233
|
+
category: 'communication',
|
|
234
|
+
requiredEnv: {
|
|
235
|
+
RESEND_API_KEY: { description: 'Resend API key' },
|
|
236
|
+
SENDER_EMAIL_ADDRESS: { description: 'Verified sender email' },
|
|
237
|
+
},
|
|
238
|
+
optionalEnv: {},
|
|
239
|
+
relevantFor: ['email', 'notifications'],
|
|
240
|
+
recommended: false,
|
|
241
|
+
tools: ['send_email'],
|
|
242
|
+
},
|
|
243
|
+
],
|
|
244
|
+
|
|
245
|
+
// AI & Memory
|
|
246
|
+
ai: [
|
|
247
|
+
{
|
|
248
|
+
id: 'claude-mem',
|
|
249
|
+
name: 'Claude Memory (ChromaDB)',
|
|
250
|
+
description: 'Persistent memory using ChromaDB vector store',
|
|
251
|
+
command: 'uvx',
|
|
252
|
+
npmPackage: null,
|
|
253
|
+
args: ['chroma-mcp', '--client-type', 'persistent', '--data-dir'],
|
|
254
|
+
category: 'ai',
|
|
255
|
+
requiredEnv: {},
|
|
256
|
+
optionalEnv: {},
|
|
257
|
+
relevantFor: ['all'],
|
|
258
|
+
recommended: false,
|
|
259
|
+
tools: ['chroma_add_documents', 'chroma_query_documents', 'chroma_list_collections'],
|
|
260
|
+
note: 'Requires uvx (Python) and custom data directory',
|
|
261
|
+
},
|
|
262
|
+
],
|
|
263
|
+
|
|
264
|
+
// Utilities
|
|
265
|
+
utilities: [
|
|
266
|
+
{
|
|
267
|
+
id: 'filesystem',
|
|
268
|
+
name: 'Filesystem MCP',
|
|
269
|
+
description: 'File operations beyond Claude\'s built-in Read/Write',
|
|
270
|
+
npmPackage: '@modelcontextprotocol/server-filesystem',
|
|
271
|
+
category: 'utilities',
|
|
272
|
+
requiredEnv: {},
|
|
273
|
+
optionalEnv: {},
|
|
274
|
+
relevantFor: ['all'],
|
|
275
|
+
recommended: false,
|
|
276
|
+
tools: ['list_directory', 'create_directory', 'move_file'],
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
id: 'fetch',
|
|
280
|
+
name: 'Fetch MCP',
|
|
281
|
+
description: 'HTTP requests with full control',
|
|
282
|
+
npmPackage: '@modelcontextprotocol/server-fetch',
|
|
283
|
+
category: 'utilities',
|
|
284
|
+
requiredEnv: {},
|
|
285
|
+
optionalEnv: {},
|
|
286
|
+
relevantFor: ['api', 'backend'],
|
|
287
|
+
recommended: false,
|
|
288
|
+
tools: ['fetch', 'fetch_json'],
|
|
289
|
+
},
|
|
290
|
+
],
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Get all MCPs as flat list
|
|
295
|
+
*/
|
|
296
|
+
export function getAllMcps() {
|
|
297
|
+
return Object.values(MCP_REGISTRY).flat();
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Get MCPs by category
|
|
302
|
+
*/
|
|
303
|
+
export function getMcpsByCategory(category) {
|
|
304
|
+
return MCP_REGISTRY[category] || [];
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Get recommended MCPs for a tech stack
|
|
309
|
+
*
|
|
310
|
+
* @param {Object} analysis - Codebase analysis result
|
|
311
|
+
* @returns {Array} Recommended MCPs sorted by relevance
|
|
312
|
+
*/
|
|
313
|
+
export function getRecommendedMcps(analysis) {
|
|
314
|
+
const allMcps = getAllMcps();
|
|
315
|
+
const recommendations = [];
|
|
316
|
+
|
|
317
|
+
// Build relevance keywords from analysis
|
|
318
|
+
const keywords = new Set(['all']);
|
|
319
|
+
|
|
320
|
+
if (analysis.frontend.detected) {
|
|
321
|
+
keywords.add('frontend');
|
|
322
|
+
keywords.add(analysis.frontend.framework?.toLowerCase());
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
if (analysis.backend.detected) {
|
|
326
|
+
keywords.add('backend');
|
|
327
|
+
keywords.add('api');
|
|
328
|
+
keywords.add(analysis.backend.framework?.toLowerCase());
|
|
329
|
+
keywords.add(analysis.backend.language?.toLowerCase());
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
if (analysis.database.detected) {
|
|
333
|
+
keywords.add(analysis.database.type?.toLowerCase());
|
|
334
|
+
if (analysis.database.orm) {
|
|
335
|
+
keywords.add(analysis.database.orm.toLowerCase());
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
if (analysis.deployment.detected) {
|
|
340
|
+
keywords.add(analysis.deployment.platform?.toLowerCase());
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (analysis.testing.detected) {
|
|
344
|
+
keywords.add('testing');
|
|
345
|
+
keywords.add('e2e');
|
|
346
|
+
if (analysis.testing.e2e) {
|
|
347
|
+
keywords.add(analysis.testing.e2e.toLowerCase());
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// Add services keywords (Supabase, n8n, etc.)
|
|
352
|
+
if (analysis.services?.detected) {
|
|
353
|
+
if (analysis.services.supabase) {
|
|
354
|
+
keywords.add('supabase');
|
|
355
|
+
keywords.add('auth');
|
|
356
|
+
keywords.add('storage');
|
|
357
|
+
keywords.add('realtime');
|
|
358
|
+
}
|
|
359
|
+
if (analysis.services.n8n) {
|
|
360
|
+
keywords.add('n8n');
|
|
361
|
+
keywords.add('automation');
|
|
362
|
+
keywords.add('workflow');
|
|
363
|
+
keywords.add('integration');
|
|
364
|
+
}
|
|
365
|
+
if (analysis.services.resend) {
|
|
366
|
+
keywords.add('email');
|
|
367
|
+
keywords.add('notifications');
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Score each MCP
|
|
372
|
+
for (const mcp of allMcps) {
|
|
373
|
+
let score = 0;
|
|
374
|
+
|
|
375
|
+
// Base score for recommended MCPs
|
|
376
|
+
if (mcp.recommended) score += 10;
|
|
377
|
+
|
|
378
|
+
// Score based on relevance
|
|
379
|
+
for (const keyword of mcp.relevantFor) {
|
|
380
|
+
if (keywords.has(keyword.toLowerCase())) {
|
|
381
|
+
score += 5;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Testing MCPs get bonus for frontend projects
|
|
386
|
+
if (mcp.category === 'testing' && keywords.has('frontend')) {
|
|
387
|
+
score += 8;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
if (score > 0) {
|
|
391
|
+
recommendations.push({ ...mcp, score });
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// Sort by score descending
|
|
396
|
+
return recommendations.sort((a, b) => b.score - a.score);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Get testing MCPs specifically (always recommended for web projects)
|
|
401
|
+
*/
|
|
402
|
+
export function getTestingMcps() {
|
|
403
|
+
return MCP_REGISTRY.testing;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Search MCPs by name or description
|
|
408
|
+
*/
|
|
409
|
+
export function searchMcps(query) {
|
|
410
|
+
const allMcps = getAllMcps();
|
|
411
|
+
const queryLower = query.toLowerCase();
|
|
412
|
+
|
|
413
|
+
return allMcps.filter(
|
|
414
|
+
(mcp) =>
|
|
415
|
+
mcp.name.toLowerCase().includes(queryLower) ||
|
|
416
|
+
mcp.description.toLowerCase().includes(queryLower) ||
|
|
417
|
+
mcp.id.toLowerCase().includes(queryLower) ||
|
|
418
|
+
mcp.tools.some((t) => t.toLowerCase().includes(queryLower))
|
|
419
|
+
);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Get MCP by ID
|
|
424
|
+
*/
|
|
425
|
+
export function getMcpById(id) {
|
|
426
|
+
return getAllMcps().find((mcp) => mcp.id === id);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* Get all categories
|
|
431
|
+
*/
|
|
432
|
+
export function getCategories() {
|
|
433
|
+
return Object.keys(MCP_REGISTRY).map((key) => ({
|
|
434
|
+
id: key,
|
|
435
|
+
name: key.charAt(0).toUpperCase() + key.slice(1),
|
|
436
|
+
count: MCP_REGISTRY[key].length,
|
|
437
|
+
}));
|
|
438
|
+
}
|