claudeup 4.19.0 → 4.23.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.
Files changed (182) hide show
  1. package/bin/claudeup.js +43 -19
  2. package/package.json +14 -19
  3. package/scripts/build-binaries.ts +77 -0
  4. package/scripts/check-optional-deps.ts +49 -0
  5. package/scripts/test-isolated.ts +43 -0
  6. package/src/__tests__/cli-router.test.ts +65 -0
  7. package/src/__tests__/conventions-integration.test.ts +745 -0
  8. package/src/__tests__/conventions-manager.test.ts +1172 -0
  9. package/src/__tests__/doctor-bins.test.ts +35 -0
  10. package/src/__tests__/doctor.test.ts +450 -0
  11. package/src/__tests__/dual-write-prevention.test.ts +14 -4
  12. package/src/__tests__/file-locking.test.ts +208 -0
  13. package/src/__tests__/gitignore-prerun.test.ts +1 -0
  14. package/src/__tests__/install-command.test.ts +81 -0
  15. package/src/__tests__/install-plan.test.ts +98 -0
  16. package/src/__tests__/manifest.test.ts +136 -0
  17. package/src/__tests__/marketplace-badge.test.ts +91 -0
  18. package/src/__tests__/marketplace-refresh.test.ts +267 -0
  19. package/src/__tests__/plugin-requires.test.ts +133 -0
  20. package/src/__tests__/plugin-setup.test.ts +7 -0
  21. package/src/__tests__/profile-command.test.ts +116 -0
  22. package/src/__tests__/profile-materializer.test.ts +82 -0
  23. package/src/__tests__/profile-sync.test.ts +136 -0
  24. package/src/__tests__/registry-version-resolution.test.ts +74 -0
  25. package/src/__tests__/resolve-executable.test.ts +42 -0
  26. package/src/__tests__/resolver.test.ts +218 -0
  27. package/src/__tests__/symlink-manager.test.ts +99 -0
  28. package/src/__tests__/toolchain.test.ts +56 -0
  29. package/src/cli/claude.ts +21 -0
  30. package/src/cli/doctor.ts +132 -0
  31. package/src/cli/install.ts +360 -0
  32. package/src/cli/profile.ts +166 -0
  33. package/src/cli/router.ts +107 -0
  34. package/src/cli/update.ts +85 -0
  35. package/src/data/cli-tools.ts +7 -7
  36. package/src/data/gitignore-defaults.ts +4 -0
  37. package/src/data/marketplaces.ts +12 -0
  38. package/src/data/predefined-profiles.ts +3 -4
  39. package/src/main.tsx +11 -154
  40. package/src/prerunner/index.ts +62 -27
  41. package/src/services/claude-cli.ts +19 -22
  42. package/src/services/claude-settings.ts +99 -26
  43. package/src/services/conventions-manager.ts +865 -0
  44. package/src/services/doctor-bins.ts +49 -0
  45. package/src/services/doctor.ts +509 -0
  46. package/src/services/install-plan.ts +107 -0
  47. package/src/services/manifest.ts +166 -0
  48. package/src/services/marketplace-refresh.ts +173 -0
  49. package/src/services/plugin-manager.ts +7 -1
  50. package/src/services/plugin-requires.ts +215 -0
  51. package/src/services/plugin-version-check.ts +9 -4
  52. package/src/services/profile-materializer.ts +61 -0
  53. package/src/services/profile-sync.ts +150 -0
  54. package/src/services/resolver.ts +293 -0
  55. package/src/services/symlink-manager.ts +146 -0
  56. package/src/services/toolchain.ts +97 -0
  57. package/src/services/version-check.ts +10 -11
  58. package/src/types/index.ts +138 -31
  59. package/src/ui/App.tsx +0 -4
  60. package/src/ui/adapters/pluginsAdapter.ts +13 -0
  61. package/src/ui/screens/CliToolsScreen.tsx +11 -3
  62. package/src/ui/screens/index.ts +0 -1
  63. package/src/ui/state/reducer.ts +0 -101
  64. package/src/ui/state/types.ts +0 -35
  65. package/src/utils/command-utils.ts +23 -0
  66. package/src/utils/file-locking.ts +144 -0
  67. package/src/data/alias-flags.js +0 -205
  68. package/src/data/cli-tools.js +0 -123
  69. package/src/data/gitignore-defaults.js +0 -24
  70. package/src/data/gitignore-reasons.js +0 -97
  71. package/src/data/gitignore-templates.js +0 -21
  72. package/src/data/marketplaces.js +0 -138
  73. package/src/data/mcp-servers.js +0 -509
  74. package/src/data/predefined-profiles.js +0 -248
  75. package/src/data/settings-catalog.js +0 -625
  76. package/src/data/skill-repos.js +0 -160
  77. package/src/data/statuslines.js +0 -159
  78. package/src/data/statuslines.ts +0 -188
  79. package/src/index.js +0 -4
  80. package/src/index.ts +0 -5
  81. package/src/main.js +0 -170
  82. package/src/prerunner/index.js +0 -252
  83. package/src/services/alias-settings.js +0 -51
  84. package/src/services/alias-shell-writer.js +0 -1018
  85. package/src/services/alias-store.js +0 -129
  86. package/src/services/claude-cli.js +0 -189
  87. package/src/services/claude-runner.js +0 -28
  88. package/src/services/claude-settings.js +0 -1223
  89. package/src/services/gitignore-detector.js +0 -155
  90. package/src/services/gitignore-fixer.js +0 -231
  91. package/src/services/gitignore-prerun.js +0 -46
  92. package/src/services/gitignore-resolver.js +0 -143
  93. package/src/services/gitignore-service.js +0 -117
  94. package/src/services/local-marketplace.js +0 -339
  95. package/src/services/marketplace-fetcher.js +0 -96
  96. package/src/services/marketplace-sync.js +0 -94
  97. package/src/services/mcp-registry.js +0 -87
  98. package/src/services/plugin-manager.js +0 -473
  99. package/src/services/plugin-mcp-config.js +0 -177
  100. package/src/services/plugin-setup.js +0 -499
  101. package/src/services/plugin-version-check.js +0 -262
  102. package/src/services/profiles.js +0 -161
  103. package/src/services/settings-manager.js +0 -243
  104. package/src/services/skills-manager.js +0 -393
  105. package/src/services/skillsmp-client.js +0 -87
  106. package/src/services/update-cache.js +0 -52
  107. package/src/services/version-check.js +0 -99
  108. package/src/types/gitignore.js +0 -6
  109. package/src/types/index.js +0 -1
  110. package/src/ui/App.js +0 -355
  111. package/src/ui/adapters/pluginsAdapter.js +0 -139
  112. package/src/ui/adapters/settingsAdapter.js +0 -111
  113. package/src/ui/adapters/skillsAdapter.js +0 -154
  114. package/src/ui/components/CategoryHeader.js +0 -9
  115. package/src/ui/components/EmptyFilterState.js +0 -4
  116. package/src/ui/components/FlagDetailEditor.js +0 -0
  117. package/src/ui/components/ScopeIndicator.js +0 -30
  118. package/src/ui/components/ScrollableList.js +0 -36
  119. package/src/ui/components/SearchInput.js +0 -19
  120. package/src/ui/components/StyledText.js +0 -39
  121. package/src/ui/components/TabBar.js +0 -19
  122. package/src/ui/components/layout/FooterHints.js +0 -29
  123. package/src/ui/components/layout/Panel.js +0 -6
  124. package/src/ui/components/layout/ProgressBar.js +0 -14
  125. package/src/ui/components/layout/ScopeTabs.js +0 -6
  126. package/src/ui/components/layout/ScreenLayout.js +0 -16
  127. package/src/ui/components/layout/index.js +0 -5
  128. package/src/ui/components/modals/ConfirmModal.js +0 -14
  129. package/src/ui/components/modals/InputModal.js +0 -5
  130. package/src/ui/components/modals/LoadingModal.js +0 -17
  131. package/src/ui/components/modals/MessageModal.js +0 -16
  132. package/src/ui/components/modals/ModalContainer.js +0 -137
  133. package/src/ui/components/modals/SelectModal.js +0 -18
  134. package/src/ui/components/modals/VersionMismatchModal.js +0 -36
  135. package/src/ui/components/modals/index.js +0 -6
  136. package/src/ui/components/primitives/ActionHints.js +0 -13
  137. package/src/ui/components/primitives/DetailSection.js +0 -7
  138. package/src/ui/components/primitives/KeyValueLine.js +0 -8
  139. package/src/ui/components/primitives/ListCategoryRow.js +0 -8
  140. package/src/ui/components/primitives/MetaText.js +0 -8
  141. package/src/ui/components/primitives/ScopeDetail.js +0 -32
  142. package/src/ui/components/primitives/ScopeSquares.js +0 -11
  143. package/src/ui/components/primitives/SelectableRow.js +0 -5
  144. package/src/ui/components/primitives/index.js +0 -8
  145. package/src/ui/hooks/index.js +0 -4
  146. package/src/ui/hooks/useAsyncData.js +0 -77
  147. package/src/ui/hooks/useGitignoreModal.js +0 -74
  148. package/src/ui/hooks/useKeyboard.js +0 -13
  149. package/src/ui/hooks/useKeyboardHandler.js +0 -39
  150. package/src/ui/hooks/useMismatchModal.js +0 -77
  151. package/src/ui/registry.js +0 -1
  152. package/src/ui/renderers/cliToolRenderers.js +0 -54
  153. package/src/ui/renderers/gitignoreRenderers.js +0 -46
  154. package/src/ui/renderers/mcpRenderers.js +0 -26
  155. package/src/ui/renderers/pluginRenderers.js +0 -124
  156. package/src/ui/renderers/profileRenderers.js +0 -177
  157. package/src/ui/renderers/settingsRenderers.js +0 -73
  158. package/src/ui/renderers/skillRenderers.js +0 -138
  159. package/src/ui/screens/AliasScreen.js +0 -1111
  160. package/src/ui/screens/CliToolsScreen.js +0 -338
  161. package/src/ui/screens/EnvVarsScreen.js +0 -152
  162. package/src/ui/screens/GitignoreScreen.js +0 -328
  163. package/src/ui/screens/McpRegistryScreen.js +0 -238
  164. package/src/ui/screens/McpScreen.js +0 -176
  165. package/src/ui/screens/ModelSelectorScreen.js +0 -296
  166. package/src/ui/screens/ModelSelectorScreen.tsx +0 -444
  167. package/src/ui/screens/PluginsScreen.js +0 -769
  168. package/src/ui/screens/ProfilesScreen.js +0 -298
  169. package/src/ui/screens/SkillsScreen.js +0 -549
  170. package/src/ui/screens/StatusLineScreen.js +0 -206
  171. package/src/ui/screens/StatusLineScreen.tsx +0 -416
  172. package/src/ui/screens/index.js +0 -10
  173. package/src/ui/state/AnimationContext.js +0 -34
  174. package/src/ui/state/AppContext.js +0 -162
  175. package/src/ui/state/DimensionsContext.js +0 -71
  176. package/src/ui/state/reducer.js +0 -547
  177. package/src/ui/state/types.js +0 -1
  178. package/src/ui/theme.js +0 -47
  179. package/src/utils/clipboard.js +0 -56
  180. package/src/utils/command-utils.js +0 -19
  181. package/src/utils/fuzzy-search.js +0 -101
  182. package/src/utils/string-utils.js +0 -62
@@ -1,138 +0,0 @@
1
- import { formatMarketplaceName } from "../utils/string-utils.js";
2
- /**
3
- * Known repo aliases — GitHub redirects the old repo to the new one,
4
- * so these should be treated as identical for deduplication.
5
- */
6
- const REPO_ALIASES = {
7
- "madappgang/claude-code": "madappgang/magus",
8
- };
9
- /** Normalize a repo string through known aliases. */
10
- function normalizeRepo(repo) {
11
- const lower = repo.toLowerCase();
12
- return REPO_ALIASES[lower] || lower;
13
- }
14
- /**
15
- * Deprecated marketplace names that should be hidden if the canonical
16
- * marketplace is already present. Maps deprecated name → canonical name.
17
- */
18
- export const deprecatedMarketplaces = {
19
- "mag-claude-plugins": "magus",
20
- "MadAppGang-claude-code": "magus",
21
- superpowers: "superpowers-marketplace",
22
- };
23
- export const defaultMarketplaces = [
24
- {
25
- name: "magus",
26
- displayName: "Magus",
27
- source: {
28
- source: "github",
29
- repo: "MadAppGang/magus",
30
- },
31
- description: "Professional plugins for frontend, backend, and code analysis",
32
- official: false,
33
- featured: true, // Always show plugins (expanded by default)
34
- },
35
- {
36
- name: "claude-plugins-official",
37
- displayName: "Anthropic Official",
38
- source: {
39
- source: "github",
40
- repo: "anthropics/claude-plugins-official",
41
- },
42
- description: "Official Anthropic-managed directory of high quality Claude Code plugins",
43
- official: true,
44
- },
45
- {
46
- name: "superpowers-marketplace",
47
- displayName: "Superpowers",
48
- source: {
49
- source: "github",
50
- repo: "obra/superpowers-marketplace",
51
- },
52
- description: "Curated Claude Code plugins for skills and workflows",
53
- featured: true,
54
- },
55
- {
56
- name: "claude-code-plugins",
57
- displayName: "Anthropic Deprecated",
58
- source: {
59
- source: "github",
60
- repo: "anthropics/claude-code",
61
- },
62
- description: "Legacy demo plugins from Anthropic (deprecated - use Official instead)",
63
- official: true,
64
- deprecated: true,
65
- },
66
- ];
67
- export function getMarketplaceByName(name) {
68
- return defaultMarketplaces.find((m) => m.name === name);
69
- }
70
- // Get all available marketplaces from local cache + hardcoded defaults
71
- // Local cache is primary source of truth, defaults are fallback
72
- // Deduplicates by normalized repo URL to avoid showing same marketplace twice
73
- export function getAllMarketplaces(localMarketplaces) {
74
- const all = new Map();
75
- const seenRepos = new Set();
76
- // Primary source: local cache (what's actually cloned)
77
- if (localMarketplaces) {
78
- for (const [name, local] of localMarketplaces) {
79
- const repo = normalizeRepo(local.gitRepo || "");
80
- // Skip deprecated marketplaces if their canonical replacement exists
81
- // (or will be added from defaults)
82
- const canonical = deprecatedMarketplaces[name];
83
- if (canonical) {
84
- // If canonical already in the map or in defaults, skip this entry
85
- if (all.has(canonical) ||
86
- defaultMarketplaces.some((m) => m.name === canonical)) {
87
- continue;
88
- }
89
- }
90
- // Skip if another marketplace already claimed this repo URL
91
- if (repo && seenRepos.has(repo))
92
- continue;
93
- if (repo)
94
- seenRepos.add(repo);
95
- // Check if this marketplace has defaults (for official/featured flags)
96
- const defaultMp = defaultMarketplaces.find((m) => m.name === name);
97
- all.set(name, {
98
- name,
99
- // Prefer default displayName over stale local clone data
100
- displayName: defaultMp?.displayName || local.name || formatMarketplaceName(name),
101
- source: {
102
- source: "github",
103
- repo: defaultMp?.source.repo || local.gitRepo || "",
104
- },
105
- description: defaultMp?.description || local.description || "",
106
- official: defaultMp?.official ?? repo.toLowerCase().includes("anthropics/"),
107
- featured: defaultMp?.featured,
108
- deprecated: defaultMp?.deprecated,
109
- });
110
- }
111
- }
112
- // Fallback: hardcoded defaults (only if their repo isn't already represented)
113
- for (const mp of defaultMarketplaces) {
114
- const repo = normalizeRepo(mp.source.repo || "");
115
- if (!all.has(mp.name) && !seenRepos.has(repo)) {
116
- all.set(mp.name, mp);
117
- if (repo)
118
- seenRepos.add(repo);
119
- }
120
- }
121
- // Sort: Magus first, deprecated last, then alphabetically
122
- return Array.from(all.values()).sort((a, b) => {
123
- // Magus (MadAppGang) always first
124
- const aIsMag = a.source.repo?.toLowerCase().includes("madappgang/");
125
- const bIsMag = b.source.repo?.toLowerCase().includes("madappgang/");
126
- if (aIsMag && !bIsMag)
127
- return -1;
128
- if (!aIsMag && bIsMag)
129
- return 1;
130
- // Deprecated entries always last
131
- if (a.deprecated && !b.deprecated)
132
- return 1;
133
- if (!a.deprecated && b.deprecated)
134
- return -1;
135
- // Then alphabetically by display name
136
- return (a.displayName || a.name).localeCompare(b.displayName || b.name);
137
- });
138
- }
@@ -1,509 +0,0 @@
1
- export const curatedMcpServers = [
2
- // ═══════════════════════════════════════════════════════════════
3
- // BROWSER & AUTOMATION
4
- // ═══════════════════════════════════════════════════════════════
5
- {
6
- name: "chrome-devtools",
7
- description: "Control Chrome browser, inspect DOM, debug JavaScript, capture screenshots",
8
- command: "npx",
9
- args: ["-y", "chrome-devtools-mcp@latest"],
10
- category: "browser",
11
- requiresConfig: false,
12
- },
13
- {
14
- name: "puppeteer",
15
- description: "Headless browser automation for testing and scraping",
16
- command: "npx",
17
- args: ["-y", "@anthropic/mcp-server-puppeteer"],
18
- category: "browser",
19
- requiresConfig: false,
20
- },
21
- // ═══════════════════════════════════════════════════════════════
22
- // AI & SEARCH
23
- // ═══════════════════════════════════════════════════════════════
24
- {
25
- name: "claude-context",
26
- description: "Semantic code search with vector embeddings (Zilliz/Milvus)",
27
- command: "npx",
28
- args: ["-y", "@zilliz/claude-context-mcp@latest"],
29
- env: {
30
- OPENAI_API_KEY: "${OPENAI_API_KEY}",
31
- MILVUS_ADDRESS: "${MILVUS_ADDRESS}",
32
- MILVUS_TOKEN: "${MILVUS_TOKEN}",
33
- },
34
- category: "ai",
35
- requiresConfig: true,
36
- configFields: [
37
- {
38
- name: "OPENAI_API_KEY",
39
- label: "OpenAI API Key (for embeddings)",
40
- type: "string",
41
- required: true,
42
- envVar: "OPENAI_API_KEY",
43
- },
44
- {
45
- name: "MILVUS_ADDRESS",
46
- label: "Zilliz Cloud Public Endpoint",
47
- type: "url",
48
- required: true,
49
- envVar: "MILVUS_ADDRESS",
50
- },
51
- {
52
- name: "MILVUS_TOKEN",
53
- label: "Zilliz Cloud API Key",
54
- type: "string",
55
- required: true,
56
- envVar: "MILVUS_TOKEN",
57
- },
58
- ],
59
- },
60
- {
61
- name: "exa",
62
- description: "AI-powered web search with neural search capabilities",
63
- type: "http",
64
- url: "https://mcp.exa.ai/mcp",
65
- category: "ai",
66
- requiresConfig: false,
67
- },
68
- {
69
- name: "sequential-thinking",
70
- description: "Enhanced reasoning with step-by-step thinking",
71
- command: "npx",
72
- args: ["-y", "@anthropic/mcp-server-sequential-thinking"],
73
- category: "ai",
74
- requiresConfig: false,
75
- },
76
- // ═══════════════════════════════════════════════════════════════
77
- // DESIGN & CREATIVE
78
- // ═══════════════════════════════════════════════════════════════
79
- {
80
- name: "figma",
81
- description: "Access Figma designs, components, and design tokens",
82
- type: "http",
83
- url: "https://mcp.figma.com/mcp",
84
- category: "design",
85
- requiresConfig: false,
86
- },
87
- // ═══════════════════════════════════════════════════════════════
88
- // CLOUD & INFRASTRUCTURE (AWS)
89
- // ═══════════════════════════════════════════════════════════════
90
- {
91
- name: "aws-kb-retrieval",
92
- description: "AWS Bedrock Knowledge Base retrieval and RAG",
93
- command: "uvx",
94
- args: ["awslabs.aws-kb-retrieval-mcp-server@latest"],
95
- env: {
96
- AWS_PROFILE: "${AWS_PROFILE}",
97
- AWS_REGION: "${AWS_REGION}",
98
- },
99
- category: "cloud",
100
- requiresConfig: true,
101
- configFields: [
102
- {
103
- name: "AWS_PROFILE",
104
- label: "AWS Profile Name",
105
- type: "string",
106
- required: false,
107
- default: "default",
108
- envVar: "AWS_PROFILE",
109
- },
110
- {
111
- name: "AWS_REGION",
112
- label: "AWS Region",
113
- type: "string",
114
- required: true,
115
- default: "us-east-1",
116
- envVar: "AWS_REGION",
117
- },
118
- ],
119
- },
120
- {
121
- name: "aws-cdk",
122
- description: "AWS CDK infrastructure as code assistance",
123
- command: "uvx",
124
- args: ["awslabs.cdk-mcp-server@latest"],
125
- env: {
126
- AWS_PROFILE: "${AWS_PROFILE}",
127
- AWS_REGION: "${AWS_REGION}",
128
- },
129
- category: "cloud",
130
- requiresConfig: true,
131
- configFields: [
132
- {
133
- name: "AWS_PROFILE",
134
- label: "AWS Profile Name",
135
- type: "string",
136
- required: false,
137
- default: "default",
138
- envVar: "AWS_PROFILE",
139
- },
140
- {
141
- name: "AWS_REGION",
142
- label: "AWS Region",
143
- type: "string",
144
- required: true,
145
- default: "us-east-1",
146
- envVar: "AWS_REGION",
147
- },
148
- ],
149
- },
150
- {
151
- name: "aws-cloudwatch-logs",
152
- description: "Query and analyze AWS CloudWatch Logs",
153
- command: "uvx",
154
- args: ["awslabs.cloudwatch-logs-mcp-server@latest"],
155
- env: {
156
- AWS_PROFILE: "${AWS_PROFILE}",
157
- AWS_REGION: "${AWS_REGION}",
158
- },
159
- category: "cloud",
160
- requiresConfig: true,
161
- configFields: [
162
- {
163
- name: "AWS_PROFILE",
164
- label: "AWS Profile Name",
165
- type: "string",
166
- required: false,
167
- default: "default",
168
- envVar: "AWS_PROFILE",
169
- },
170
- {
171
- name: "AWS_REGION",
172
- label: "AWS Region",
173
- type: "string",
174
- required: true,
175
- default: "us-east-1",
176
- envVar: "AWS_REGION",
177
- },
178
- ],
179
- },
180
- {
181
- name: "aws-cost-analysis",
182
- description: "AWS cost analysis and optimization recommendations",
183
- command: "uvx",
184
- args: ["awslabs.cost-analysis-mcp-server@latest"],
185
- env: {
186
- AWS_PROFILE: "${AWS_PROFILE}",
187
- AWS_REGION: "${AWS_REGION}",
188
- },
189
- category: "cloud",
190
- requiresConfig: true,
191
- configFields: [
192
- {
193
- name: "AWS_PROFILE",
194
- label: "AWS Profile Name",
195
- type: "string",
196
- required: false,
197
- default: "default",
198
- envVar: "AWS_PROFILE",
199
- },
200
- {
201
- name: "AWS_REGION",
202
- label: "AWS Region",
203
- type: "string",
204
- required: true,
205
- default: "us-east-1",
206
- envVar: "AWS_REGION",
207
- },
208
- ],
209
- },
210
- // ═══════════════════════════════════════════════════════════════
211
- // DATABASE
212
- // ═══════════════════════════════════════════════════════════════
213
- {
214
- name: "postgres",
215
- description: "Query PostgreSQL databases with read-only access",
216
- command: "npx",
217
- args: ["-y", "@anthropic/mcp-server-postgres"],
218
- env: {
219
- DATABASE_URL: "${DATABASE_URL}",
220
- },
221
- category: "database",
222
- requiresConfig: true,
223
- configFields: [
224
- {
225
- name: "DATABASE_URL",
226
- label: "PostgreSQL Connection URL",
227
- type: "url",
228
- required: true,
229
- envVar: "DATABASE_URL",
230
- },
231
- ],
232
- },
233
- {
234
- name: "sqlite",
235
- description: "Query SQLite databases locally",
236
- command: "npx",
237
- args: ["-y", "@anthropic/mcp-server-sqlite", "${DATABASE_PATH}"],
238
- category: "database",
239
- requiresConfig: true,
240
- configFields: [
241
- {
242
- name: "DATABASE_PATH",
243
- label: "SQLite Database File Path",
244
- type: "path",
245
- required: true,
246
- },
247
- ],
248
- },
249
- // ═══════════════════════════════════════════════════════════════
250
- // DEVELOPER TOOLS
251
- // ═══════════════════════════════════════════════════════════════
252
- {
253
- name: "github",
254
- description: "Manage GitHub repos, issues, PRs, and actions",
255
- command: "npx",
256
- args: ["-y", "@anthropic/mcp-server-github"],
257
- env: {
258
- GITHUB_TOKEN: "${GITHUB_TOKEN}",
259
- },
260
- category: "dev-tools",
261
- requiresConfig: true,
262
- configFields: [
263
- {
264
- name: "GITHUB_TOKEN",
265
- label: "GitHub Personal Access Token",
266
- type: "string",
267
- required: true,
268
- envVar: "GITHUB_TOKEN",
269
- },
270
- ],
271
- },
272
- {
273
- name: "gitlab",
274
- description: "Manage GitLab repos, merge requests, and pipelines",
275
- command: "npx",
276
- args: ["-y", "@anthropic/mcp-server-gitlab"],
277
- env: {
278
- GITLAB_TOKEN: "${GITLAB_TOKEN}",
279
- GITLAB_URL: "${GITLAB_URL}",
280
- },
281
- category: "dev-tools",
282
- requiresConfig: true,
283
- configFields: [
284
- {
285
- name: "GITLAB_TOKEN",
286
- label: "GitLab Personal Access Token",
287
- type: "string",
288
- required: true,
289
- envVar: "GITLAB_TOKEN",
290
- },
291
- {
292
- name: "GITLAB_URL",
293
- label: "GitLab URL (self-hosted)",
294
- type: "url",
295
- required: false,
296
- default: "https://gitlab.com",
297
- envVar: "GITLAB_URL",
298
- },
299
- ],
300
- },
301
- {
302
- name: "filesystem",
303
- description: "Read, write, and search files in allowed directories",
304
- command: "npx",
305
- args: ["-y", "@anthropic/mcp-server-filesystem", "${ALLOWED_PATH}"],
306
- category: "dev-tools",
307
- requiresConfig: true,
308
- configFields: [
309
- {
310
- name: "ALLOWED_PATH",
311
- label: "Allowed Directory Path",
312
- type: "path",
313
- required: true,
314
- default: ".",
315
- },
316
- ],
317
- },
318
- // ═══════════════════════════════════════════════════════════════
319
- // PRODUCTIVITY
320
- // ═══════════════════════════════════════════════════════════════
321
- {
322
- name: "slack",
323
- description: "Send messages and interact with Slack channels",
324
- command: "npx",
325
- args: ["-y", "@anthropic/mcp-server-slack"],
326
- env: {
327
- SLACK_BOT_TOKEN: "${SLACK_BOT_TOKEN}",
328
- },
329
- category: "productivity",
330
- requiresConfig: true,
331
- configFields: [
332
- {
333
- name: "SLACK_BOT_TOKEN",
334
- label: "Slack Bot Token (xoxb-...)",
335
- type: "string",
336
- required: true,
337
- envVar: "SLACK_BOT_TOKEN",
338
- },
339
- ],
340
- },
341
- {
342
- name: "google-drive",
343
- description: "Access and search Google Drive files",
344
- command: "npx",
345
- args: ["-y", "@anthropic/mcp-server-google-drive"],
346
- category: "productivity",
347
- requiresConfig: true,
348
- configFields: [
349
- {
350
- name: "GOOGLE_CREDENTIALS",
351
- label: "Google OAuth Credentials JSON Path",
352
- type: "path",
353
- required: true,
354
- envVar: "GOOGLE_APPLICATION_CREDENTIALS",
355
- },
356
- ],
357
- },
358
- {
359
- name: "memory",
360
- description: "Persistent memory storage across conversations",
361
- command: "npx",
362
- args: ["-y", "@anthropic/mcp-server-memory"],
363
- category: "productivity",
364
- requiresConfig: false,
365
- },
366
- {
367
- name: "fetch",
368
- description: "Make HTTP requests to external APIs",
369
- command: "npx",
370
- args: ["-y", "@anthropic/mcp-server-fetch"],
371
- category: "productivity",
372
- requiresConfig: false,
373
- },
374
- // ═══════════════════════════════════════════════════════════════
375
- // SEO & ANALYTICS
376
- // ═══════════════════════════════════════════════════════════════
377
- {
378
- name: "google-analytics",
379
- description: "Google Analytics 4 data - page views, engagement, conversions",
380
- command: "npx",
381
- args: ["-y", "mcp-server-google-analytics"],
382
- env: {
383
- GOOGLE_APPLICATION_CREDENTIALS: "${GOOGLE_APPLICATION_CREDENTIALS}",
384
- GA_PROPERTY_ID: "${GA_PROPERTY_ID}",
385
- },
386
- category: "seo",
387
- requiresConfig: true,
388
- configFields: [
389
- {
390
- name: "GOOGLE_APPLICATION_CREDENTIALS",
391
- label: "Service Account JSON Path",
392
- type: "path",
393
- required: true,
394
- envVar: "GOOGLE_APPLICATION_CREDENTIALS",
395
- },
396
- {
397
- name: "GA_PROPERTY_ID",
398
- label: "GA4 Property ID (properties/123456789)",
399
- type: "string",
400
- required: true,
401
- envVar: "GA_PROPERTY_ID",
402
- },
403
- ],
404
- },
405
- {
406
- name: "google-search-console",
407
- description: "Search Console - impressions, clicks, CTR, Core Web Vitals",
408
- command: "npx",
409
- args: ["-y", "mcp-server-gsc"],
410
- env: {
411
- GOOGLE_APPLICATION_CREDENTIALS: "${GOOGLE_APPLICATION_CREDENTIALS}",
412
- GSC_SITE_URL: "${GSC_SITE_URL}",
413
- },
414
- category: "seo",
415
- requiresConfig: true,
416
- configFields: [
417
- {
418
- name: "GOOGLE_APPLICATION_CREDENTIALS",
419
- label: "Service Account JSON Path",
420
- type: "path",
421
- required: true,
422
- envVar: "GOOGLE_APPLICATION_CREDENTIALS",
423
- },
424
- {
425
- name: "GSC_SITE_URL",
426
- label: "Site URL (https://example.com)",
427
- type: "url",
428
- required: true,
429
- envVar: "GSC_SITE_URL",
430
- },
431
- ],
432
- },
433
- {
434
- name: "se-ranking",
435
- description: "SE Ranking - keyword rankings, backlinks, competitor analysis (requires Docker)",
436
- command: "docker",
437
- args: [
438
- "run",
439
- "-i",
440
- "--rm",
441
- "-e",
442
- "SERANKING_API_TOKEN=${SERANKING_API_TOKEN}",
443
- "seranking/seo-data-api-mcp-server:latest",
444
- ],
445
- env: {
446
- SERANKING_API_TOKEN: "${SERANKING_API_TOKEN}",
447
- },
448
- category: "seo",
449
- requiresConfig: true,
450
- configFields: [
451
- {
452
- name: "SERANKING_API_TOKEN",
453
- label: "SE Ranking API Token",
454
- type: "string",
455
- required: true,
456
- envVar: "SERANKING_API_TOKEN",
457
- },
458
- ],
459
- },
460
- ];
461
- export function getMcpServersByCategory() {
462
- const categories = {};
463
- for (const server of curatedMcpServers) {
464
- if (!categories[server.category]) {
465
- categories[server.category] = [];
466
- }
467
- categories[server.category].push(server);
468
- }
469
- return categories;
470
- }
471
- export const categoryOrder = [
472
- "browser",
473
- "ai",
474
- "design",
475
- "dev-tools",
476
- "cloud",
477
- "database",
478
- "seo",
479
- "productivity",
480
- ];
481
- export function getCategoryDisplayName(category) {
482
- const names = {
483
- browser: "Browser & Automation",
484
- ai: "AI & Search",
485
- design: "Design & Creative",
486
- "dev-tools": "Developer Tools",
487
- cloud: "Cloud & Infrastructure",
488
- database: "Database",
489
- seo: "SEO & Analytics",
490
- productivity: "Productivity",
491
- };
492
- return names[category] || category;
493
- }
494
- export function getCategoryIcon(category) {
495
- const icons = {
496
- browser: "🌐",
497
- ai: "🤖",
498
- design: "🎨",
499
- "dev-tools": "🛠️",
500
- cloud: "☁️",
501
- database: "🗄️",
502
- seo: "📈",
503
- productivity: "📋",
504
- };
505
- return icons[category] || "📦";
506
- }
507
- export function getAllMcpServers() {
508
- return curatedMcpServers;
509
- }