@edilsonfjdev/mcp-setup 0.1.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/README.md +129 -0
- package/bin/mcp-setup.js +3 -0
- package/dist/add-2HOZTV5H.js +66 -0
- package/dist/chunk-H3PELLAE.js +162 -0
- package/dist/chunk-JNVJQZTK.js +169 -0
- package/dist/chunk-Q36CDQK6.js +28 -0
- package/dist/chunk-UZ72QCYF.js +79 -0
- package/dist/config-loader-O23HRZIK.js +14 -0
- package/dist/doctor-OBFIE3JN.js +161 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +42 -0
- package/dist/install-DAWHBGCE.js +169 -0
- package/dist/list-QO4GBJHR.js +29 -0
- package/dist/profiles-HU3NVRTV.js +30 -0
- package/dist/remove-T6C2DD7O.js +39 -0
- package/dist/update-GOCA4IZG.js +55 -0
- package/dist/validate-6RKOV7JG.js +167 -0
- package/package.json +74 -0
- package/templates/mcps/clickup.json +35 -0
- package/templates/mcps/context7.json +19 -0
- package/templates/mcps/coolify.json +24 -0
- package/templates/mcps/figma.json +19 -0
- package/templates/mcps/github.json +22 -0
- package/templates/mcps/hetzner.json +23 -0
- package/templates/mcps/linear.json +33 -0
- package/templates/mcps/n8n-docs.json +20 -0
- package/templates/mcps/n8n-instance.json +22 -0
- package/templates/mcps/playwright.json +20 -0
- package/templates/mcps/postgres.json +20 -0
- package/templates/mcps/semgrep.json +19 -0
- package/templates/mcps/sentry.json +34 -0
- package/templates/mcps/slack.json +34 -0
- package/templates/mcps/stitch.json +22 -0
- package/templates/profiles/agents.json +7 -0
- package/templates/profiles/base.json +7 -0
- package/templates/profiles/full.json +7 -0
- package/templates/profiles/headless.json +20 -0
- package/templates/profiles/minimal.json +7 -0
- package/templates/profiles/saas.json +7 -0
- package/templates/scopes/scope-map.json +24 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getRequiredVars,
|
|
3
|
+
loadEnv,
|
|
4
|
+
validateAllCredentials,
|
|
5
|
+
validatePresence
|
|
6
|
+
} from "./chunk-JNVJQZTK.js";
|
|
7
|
+
import {
|
|
8
|
+
logger
|
|
9
|
+
} from "./chunk-Q36CDQK6.js";
|
|
10
|
+
|
|
11
|
+
// src/validation/health-check.ts
|
|
12
|
+
async function checkMcp(mcpName, env) {
|
|
13
|
+
const startTime = Date.now();
|
|
14
|
+
try {
|
|
15
|
+
switch (mcpName) {
|
|
16
|
+
case "github": {
|
|
17
|
+
const token = env.GITHUB_TOKEN;
|
|
18
|
+
if (!token) return { mcpName, status: "skip", message: "Token n\xE3o configurado" };
|
|
19
|
+
const controller = new AbortController();
|
|
20
|
+
const timeout = setTimeout(() => controller.abort(), 5e3);
|
|
21
|
+
const res = await fetch("https://api.github.com/user", {
|
|
22
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
23
|
+
signal: controller.signal
|
|
24
|
+
});
|
|
25
|
+
clearTimeout(timeout);
|
|
26
|
+
if (res.ok) return { mcpName, status: "ok", message: "Autenticado com sucesso", durationMs: Date.now() - startTime };
|
|
27
|
+
return { mcpName, status: "fail", message: `HTTP ${res.status}: ${res.statusText}`, durationMs: Date.now() - startTime };
|
|
28
|
+
}
|
|
29
|
+
case "hetzner": {
|
|
30
|
+
const token = env.HETZNER_API_TOKEN;
|
|
31
|
+
if (!token) return { mcpName, status: "skip", message: "Token n\xE3o configurado" };
|
|
32
|
+
const controller = new AbortController();
|
|
33
|
+
const timeout = setTimeout(() => controller.abort(), 5e3);
|
|
34
|
+
const res = await fetch("https://api.hetzner.cloud/v1/servers", {
|
|
35
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
36
|
+
signal: controller.signal
|
|
37
|
+
});
|
|
38
|
+
clearTimeout(timeout);
|
|
39
|
+
if (res.ok) return { mcpName, status: "ok", message: "Autenticado com sucesso", durationMs: Date.now() - startTime };
|
|
40
|
+
return { mcpName, status: "fail", message: `HTTP ${res.status}: ${res.statusText}`, durationMs: Date.now() - startTime };
|
|
41
|
+
}
|
|
42
|
+
case "coolify": {
|
|
43
|
+
const url = env.COOLIFY_BASE_URL;
|
|
44
|
+
const token = env.COOLIFY_ACCESS_TOKEN;
|
|
45
|
+
if (!url || !token) return { mcpName, status: "skip", message: "URL ou token n\xE3o configurado" };
|
|
46
|
+
const controller = new AbortController();
|
|
47
|
+
const timeout = setTimeout(() => controller.abort(), 5e3);
|
|
48
|
+
const res = await fetch(`${url}/api/v1/healthcheck`, {
|
|
49
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
50
|
+
signal: controller.signal
|
|
51
|
+
});
|
|
52
|
+
clearTimeout(timeout);
|
|
53
|
+
if (res.ok) return { mcpName, status: "ok", message: "Inst\xE2ncia acess\xEDvel", durationMs: Date.now() - startTime };
|
|
54
|
+
return { mcpName, status: "fail", message: `HTTP ${res.status}`, durationMs: Date.now() - startTime };
|
|
55
|
+
}
|
|
56
|
+
case "figma":
|
|
57
|
+
case "linear":
|
|
58
|
+
case "slack":
|
|
59
|
+
case "clickup":
|
|
60
|
+
case "sentry":
|
|
61
|
+
return { mcpName, status: "skip", message: "OAuth \u2014 configurar ap\xF3s instala\xE7\xE3o" };
|
|
62
|
+
case "context7":
|
|
63
|
+
case "n8n-docs":
|
|
64
|
+
case "semgrep":
|
|
65
|
+
case "playwright":
|
|
66
|
+
return { mcpName, status: "ok", message: "Sem autentica\xE7\xE3o necess\xE1ria" };
|
|
67
|
+
default:
|
|
68
|
+
return { mcpName, status: "skip", message: "Health check n\xE3o dispon\xEDvel" };
|
|
69
|
+
}
|
|
70
|
+
} catch (error) {
|
|
71
|
+
if (error.name === "AbortError") {
|
|
72
|
+
return { mcpName, status: "timeout", message: "Timeout (5s)", durationMs: Date.now() - startTime };
|
|
73
|
+
}
|
|
74
|
+
return { mcpName, status: "fail", message: error.message, durationMs: Date.now() - startTime };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function checkAllHealth(mcpNames, env) {
|
|
78
|
+
const results = await Promise.allSettled(
|
|
79
|
+
mcpNames.map((name) => checkMcp(name, env))
|
|
80
|
+
);
|
|
81
|
+
return results.map((result, i) => {
|
|
82
|
+
if (result.status === "fulfilled") return result.value;
|
|
83
|
+
return { mcpName: mcpNames[i], status: "fail", message: result.reason?.message || "Erro desconhecido" };
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// src/commands/validate.ts
|
|
88
|
+
import chalk from "chalk";
|
|
89
|
+
async function validateCommand(options) {
|
|
90
|
+
logger.info("Validando configura\xE7\xE3o do ambiente...\n");
|
|
91
|
+
const envResult = loadEnv();
|
|
92
|
+
if (!envResult.success) {
|
|
93
|
+
logger.error(envResult.error || "Falha ao carregar .env");
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
logger.success(`Arquivo .env carregado: ${envResult.path}`);
|
|
97
|
+
const templates = ["minimal", "base", "saas", "agents", "full"];
|
|
98
|
+
console.log("");
|
|
99
|
+
logger.info("Valida\xE7\xE3o de credenciais por template:\n");
|
|
100
|
+
for (const template of templates) {
|
|
101
|
+
const required = getRequiredVars(template);
|
|
102
|
+
const presence = validatePresence(envResult.vars, required);
|
|
103
|
+
const validations = validateAllCredentials(template, envResult.vars);
|
|
104
|
+
const formatFailures = validations.filter((v) => !v.valid);
|
|
105
|
+
const presenceIcon = presence.valid ? chalk.green("\u2713") : chalk.red("\u2717");
|
|
106
|
+
const formatIcon = formatFailures.length === 0 ? chalk.green("\u2713") : chalk.yellow("!");
|
|
107
|
+
console.log(` ${template.padEnd(10)} Presen\xE7a: ${presenceIcon} (${presence.present.length}/${required.length}) Formato: ${formatIcon}`);
|
|
108
|
+
if (presence.missing.length > 0) {
|
|
109
|
+
for (const m of presence.missing) {
|
|
110
|
+
console.log(chalk.red(` \u2717 ${m.name} \u2014 ${m.description} (${m.mcpName})`));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (formatFailures.length > 0) {
|
|
114
|
+
for (const f of formatFailures) {
|
|
115
|
+
if (!presence.missing.some((m) => m.name === f.variable)) {
|
|
116
|
+
console.log(chalk.yellow(` ! ${f.variable} \u2014 ${f.error}`));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (options.health) {
|
|
122
|
+
console.log("");
|
|
123
|
+
const spinner = logger.spinner("Executando health check...");
|
|
124
|
+
const allMcps = [
|
|
125
|
+
"github",
|
|
126
|
+
"context7",
|
|
127
|
+
"figma",
|
|
128
|
+
"stitch",
|
|
129
|
+
"linear",
|
|
130
|
+
"slack",
|
|
131
|
+
"clickup",
|
|
132
|
+
"hetzner",
|
|
133
|
+
"coolify",
|
|
134
|
+
"n8n-docs",
|
|
135
|
+
"semgrep",
|
|
136
|
+
"sentry",
|
|
137
|
+
"playwright"
|
|
138
|
+
];
|
|
139
|
+
const results = await checkAllHealth(allMcps, envResult.vars);
|
|
140
|
+
spinner.stop();
|
|
141
|
+
renderHealthReport(results);
|
|
142
|
+
}
|
|
143
|
+
console.log("");
|
|
144
|
+
logger.success("Valida\xE7\xE3o conclu\xEDda");
|
|
145
|
+
}
|
|
146
|
+
function renderHealthReport(results) {
|
|
147
|
+
logger.info("Health Check:\n");
|
|
148
|
+
const statusIcon = {
|
|
149
|
+
ok: chalk.green("\u2713"),
|
|
150
|
+
fail: chalk.red("\u2717"),
|
|
151
|
+
timeout: chalk.yellow("\u23F1"),
|
|
152
|
+
skip: chalk.gray("\u2014")
|
|
153
|
+
};
|
|
154
|
+
for (const r of results) {
|
|
155
|
+
const icon = statusIcon[r.status];
|
|
156
|
+
const duration = r.durationMs ? chalk.gray(` (${r.durationMs}ms)`) : "";
|
|
157
|
+
console.log(` ${icon} ${r.mcpName.padEnd(16)} ${r.message}${duration}`);
|
|
158
|
+
}
|
|
159
|
+
const ok = results.filter((r) => r.status === "ok").length;
|
|
160
|
+
const fail = results.filter((r) => r.status === "fail").length;
|
|
161
|
+
const skip = results.filter((r) => r.status === "skip").length;
|
|
162
|
+
console.log("");
|
|
163
|
+
console.log(` ${ok} OK | ${fail} falhas | ${skip} ignorados`);
|
|
164
|
+
}
|
|
165
|
+
export {
|
|
166
|
+
validateCommand
|
|
167
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@edilsonfjdev/mcp-setup",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Solução padronizada para instalação e configuração de MCP Servers no Claude Code",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Edilson de Freitas Júnior",
|
|
7
|
+
"email": "edilson.desenvolved@gmail.com"
|
|
8
|
+
},
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"type": "module",
|
|
11
|
+
"bin": {
|
|
12
|
+
"mcp-setup": "./bin/mcp-setup.js"
|
|
13
|
+
},
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=18.0.0"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"bin/",
|
|
19
|
+
"dist/",
|
|
20
|
+
"templates/",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"dev": "tsx src/index.ts",
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"test": "vitest",
|
|
28
|
+
"test:unit": "vitest run tests/unit/",
|
|
29
|
+
"test:integration": "vitest run tests/integration/",
|
|
30
|
+
"test:smoke": "vitest run tests/smoke/",
|
|
31
|
+
"test:ci": "vitest run --coverage",
|
|
32
|
+
"test:watch": "vitest --watch",
|
|
33
|
+
"lint": "tsc --noEmit",
|
|
34
|
+
"prepublishOnly": "npm run lint && npm run test:ci && npm run build"
|
|
35
|
+
},
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public",
|
|
38
|
+
"registry": "https://registry.npmjs.org/"
|
|
39
|
+
},
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "git+https://github.com/edilsonfj/mcp-setup.git"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://github.com/edilsonfj/mcp-setup#readme",
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/edilsonfj/mcp-setup/issues"
|
|
47
|
+
},
|
|
48
|
+
"keywords": [
|
|
49
|
+
"mcp",
|
|
50
|
+
"claude-code",
|
|
51
|
+
"model-context-protocol",
|
|
52
|
+
"cli",
|
|
53
|
+
"setup",
|
|
54
|
+
"configuration",
|
|
55
|
+
"anthropic",
|
|
56
|
+
"ai"
|
|
57
|
+
],
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"commander": "^12.1.0",
|
|
60
|
+
"chalk": "^5.3.0",
|
|
61
|
+
"ora": "^8.1.0",
|
|
62
|
+
"dotenv": "^16.4.5",
|
|
63
|
+
"zod": "^3.24.2",
|
|
64
|
+
"deepmerge-ts": "^7.1.0"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"typescript": "^5.6.0",
|
|
68
|
+
"tsup": "^8.3.0",
|
|
69
|
+
"tsx": "^4.19.0",
|
|
70
|
+
"vitest": "^2.1.0",
|
|
71
|
+
"@vitest/coverage-v8": "^2.1.0",
|
|
72
|
+
"@types/node": "^22.0.0"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "clickup",
|
|
3
|
+
"displayName": "ClickUp",
|
|
4
|
+
"category": "gestão",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "oauth",
|
|
7
|
+
"envVar": null,
|
|
8
|
+
"required": false,
|
|
9
|
+
"headless": {
|
|
10
|
+
"type": "api-key",
|
|
11
|
+
"envVar": "CLICKUP_API_KEY",
|
|
12
|
+
"required": true
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"config": {
|
|
16
|
+
"type": "http",
|
|
17
|
+
"url": "https://mcp.clickup.com/mcp"
|
|
18
|
+
},
|
|
19
|
+
"headlessConfig": {
|
|
20
|
+
"type": "stdio",
|
|
21
|
+
"command": "npx",
|
|
22
|
+
"args": ["-y", "@taazkareem/clickup-mcp-server@latest"],
|
|
23
|
+
"env": {
|
|
24
|
+
"CLICKUP_API_KEY": "${CLICKUP_API_KEY}",
|
|
25
|
+
"CLICKUP_TEAM_ID": "${CLICKUP_TEAM_ID}"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"metadata": {
|
|
29
|
+
"description": "Tarefas, time tracking e documentos",
|
|
30
|
+
"docsUrl": "https://developer.clickup.com",
|
|
31
|
+
"credentialUrl": "https://app.clickup.com/settings/apps",
|
|
32
|
+
"credentialInstructions": "Settings > Apps > API Token (pk_...). Team ID na URL do workspace.",
|
|
33
|
+
"version": "1.0.0"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "context7",
|
|
3
|
+
"displayName": "Context7",
|
|
4
|
+
"category": "documentação",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "none",
|
|
7
|
+
"envVar": null,
|
|
8
|
+
"required": false
|
|
9
|
+
},
|
|
10
|
+
"config": {
|
|
11
|
+
"type": "http",
|
|
12
|
+
"url": "https://mcp.context7.com/mcp"
|
|
13
|
+
},
|
|
14
|
+
"metadata": {
|
|
15
|
+
"description": "Documentação atualizada de bibliotecas e frameworks",
|
|
16
|
+
"docsUrl": "https://context7.com",
|
|
17
|
+
"version": "1.0.0"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "coolify",
|
|
3
|
+
"displayName": "Coolify",
|
|
4
|
+
"category": "infraestrutura",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "api-key",
|
|
7
|
+
"envVar": "COOLIFY_ACCESS_TOKEN",
|
|
8
|
+
"required": true
|
|
9
|
+
},
|
|
10
|
+
"config": {
|
|
11
|
+
"type": "stdio",
|
|
12
|
+
"command": "npx",
|
|
13
|
+
"args": ["-y", "@masonator/coolify-mcp@latest"],
|
|
14
|
+
"env": {
|
|
15
|
+
"COOLIFY_BASE_URL": "${COOLIFY_BASE_URL}",
|
|
16
|
+
"COOLIFY_ACCESS_TOKEN": "${COOLIFY_ACCESS_TOKEN}"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"metadata": {
|
|
20
|
+
"description": "Deploy, apps, bancos de dados, logs e variáveis de ambiente",
|
|
21
|
+
"docsUrl": "https://coolify.io/docs",
|
|
22
|
+
"version": "1.0.0"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "figma",
|
|
3
|
+
"displayName": "Figma",
|
|
4
|
+
"category": "design",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "oauth",
|
|
7
|
+
"envVar": null,
|
|
8
|
+
"required": false
|
|
9
|
+
},
|
|
10
|
+
"config": {
|
|
11
|
+
"type": "http",
|
|
12
|
+
"url": "https://mcp.figma.com/mcp"
|
|
13
|
+
},
|
|
14
|
+
"metadata": {
|
|
15
|
+
"description": "Design-to-code, tokens de design e captura de UI",
|
|
16
|
+
"docsUrl": "https://www.figma.com/developers",
|
|
17
|
+
"version": "1.0.0"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "github",
|
|
3
|
+
"displayName": "GitHub",
|
|
4
|
+
"category": "desenvolvimento",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "bearer",
|
|
7
|
+
"envVar": "GITHUB_TOKEN",
|
|
8
|
+
"required": true
|
|
9
|
+
},
|
|
10
|
+
"config": {
|
|
11
|
+
"type": "http",
|
|
12
|
+
"url": "https://api.githubcopilot.com/mcp",
|
|
13
|
+
"headers": {
|
|
14
|
+
"Authorization": "Bearer ${GITHUB_TOKEN}"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"metadata": {
|
|
18
|
+
"description": "Repositórios, PRs, issues e busca de código",
|
|
19
|
+
"docsUrl": "https://docs.github.com",
|
|
20
|
+
"version": "1.0.0"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hetzner",
|
|
3
|
+
"displayName": "Hetzner",
|
|
4
|
+
"category": "infraestrutura",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "api-key",
|
|
7
|
+
"envVar": "HETZNER_API_TOKEN",
|
|
8
|
+
"required": true
|
|
9
|
+
},
|
|
10
|
+
"config": {
|
|
11
|
+
"type": "stdio",
|
|
12
|
+
"command": "npx",
|
|
13
|
+
"args": ["-y", "hetzner-mcp-server"],
|
|
14
|
+
"env": {
|
|
15
|
+
"HETZNER_API_TOKEN": "${HETZNER_API_TOKEN}"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"metadata": {
|
|
19
|
+
"description": "VPS, firewalls, chaves SSH e volumes",
|
|
20
|
+
"docsUrl": "https://docs.hetzner.com",
|
|
21
|
+
"version": "1.0.0"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "linear",
|
|
3
|
+
"displayName": "Linear",
|
|
4
|
+
"category": "gestão",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "oauth",
|
|
7
|
+
"envVar": null,
|
|
8
|
+
"required": false,
|
|
9
|
+
"headless": {
|
|
10
|
+
"type": "api-key",
|
|
11
|
+
"envVar": "LINEAR_API_KEY",
|
|
12
|
+
"required": true
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"config": {
|
|
16
|
+
"type": "http",
|
|
17
|
+
"url": "https://mcp.linear.app/mcp"
|
|
18
|
+
},
|
|
19
|
+
"headlessConfig": {
|
|
20
|
+
"type": "http",
|
|
21
|
+
"url": "https://mcp.linear.app/mcp",
|
|
22
|
+
"headers": {
|
|
23
|
+
"Authorization": "${LINEAR_API_KEY}"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"metadata": {
|
|
27
|
+
"description": "Issues, projetos e sprints",
|
|
28
|
+
"docsUrl": "https://linear.app/developers",
|
|
29
|
+
"credentialUrl": "https://linear.app/settings/account/security",
|
|
30
|
+
"credentialInstructions": "Settings > Account > Security & Access > Personal API Keys",
|
|
31
|
+
"version": "1.0.0"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "n8n-docs",
|
|
3
|
+
"displayName": "N8N Docs",
|
|
4
|
+
"category": "workflow",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "none",
|
|
7
|
+
"envVar": null,
|
|
8
|
+
"required": false
|
|
9
|
+
},
|
|
10
|
+
"config": {
|
|
11
|
+
"type": "stdio",
|
|
12
|
+
"command": "npx",
|
|
13
|
+
"args": ["-y", "n8n-mcp"]
|
|
14
|
+
},
|
|
15
|
+
"metadata": {
|
|
16
|
+
"description": "Referência de 1200+ nodes do N8N",
|
|
17
|
+
"docsUrl": "https://docs.n8n.io",
|
|
18
|
+
"version": "1.0.0"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "n8n-instance",
|
|
3
|
+
"displayName": "N8N Instance",
|
|
4
|
+
"category": "workflow",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "bearer",
|
|
7
|
+
"envVar": "N8N_MCP_TOKEN",
|
|
8
|
+
"required": true
|
|
9
|
+
},
|
|
10
|
+
"config": {
|
|
11
|
+
"type": "http",
|
|
12
|
+
"url": "${N8N_URL}/mcp",
|
|
13
|
+
"headers": {
|
|
14
|
+
"Authorization": "Bearer ${N8N_MCP_TOKEN}"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"metadata": {
|
|
18
|
+
"description": "Acesso direto a workflows da instância N8N",
|
|
19
|
+
"docsUrl": "https://docs.n8n.io",
|
|
20
|
+
"version": "1.0.0"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "playwright",
|
|
3
|
+
"displayName": "Playwright",
|
|
4
|
+
"category": "testes",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "none",
|
|
7
|
+
"envVar": null,
|
|
8
|
+
"required": false
|
|
9
|
+
},
|
|
10
|
+
"config": {
|
|
11
|
+
"type": "stdio",
|
|
12
|
+
"command": "npx",
|
|
13
|
+
"args": ["-y", "@anthropic/playwright-mcp"]
|
|
14
|
+
},
|
|
15
|
+
"metadata": {
|
|
16
|
+
"description": "Testes E2E e automação de browser",
|
|
17
|
+
"docsUrl": "https://playwright.dev/docs",
|
|
18
|
+
"version": "1.0.0"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "postgres",
|
|
3
|
+
"displayName": "PostgreSQL",
|
|
4
|
+
"category": "banco-de-dados",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "dsn",
|
|
7
|
+
"envVar": "DATABASE_URL",
|
|
8
|
+
"required": true
|
|
9
|
+
},
|
|
10
|
+
"config": {
|
|
11
|
+
"type": "stdio",
|
|
12
|
+
"command": "npx",
|
|
13
|
+
"args": ["-y", "@bytebase/dbhub", "--dsn", "${DATABASE_URL}"]
|
|
14
|
+
},
|
|
15
|
+
"metadata": {
|
|
16
|
+
"description": "Consultas diretas ao banco de dados PostgreSQL",
|
|
17
|
+
"docsUrl": "https://www.postgresql.org/docs",
|
|
18
|
+
"version": "1.0.0"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "semgrep",
|
|
3
|
+
"displayName": "Semgrep",
|
|
4
|
+
"category": "segurança",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "none",
|
|
7
|
+
"envVar": null,
|
|
8
|
+
"required": false
|
|
9
|
+
},
|
|
10
|
+
"config": {
|
|
11
|
+
"type": "http",
|
|
12
|
+
"url": "https://mcp.semgrep.ai/mcp"
|
|
13
|
+
},
|
|
14
|
+
"metadata": {
|
|
15
|
+
"description": "SAST e análise estática de código",
|
|
16
|
+
"docsUrl": "https://semgrep.dev/docs",
|
|
17
|
+
"version": "1.0.0"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sentry",
|
|
3
|
+
"displayName": "Sentry",
|
|
4
|
+
"category": "monitoramento",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "oauth",
|
|
7
|
+
"envVar": null,
|
|
8
|
+
"required": false,
|
|
9
|
+
"headless": {
|
|
10
|
+
"type": "api-key",
|
|
11
|
+
"envVar": "SENTRY_ACCESS_TOKEN",
|
|
12
|
+
"required": true
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"config": {
|
|
16
|
+
"type": "http",
|
|
17
|
+
"url": "https://mcp.sentry.dev/mcp"
|
|
18
|
+
},
|
|
19
|
+
"headlessConfig": {
|
|
20
|
+
"type": "stdio",
|
|
21
|
+
"command": "npx",
|
|
22
|
+
"args": ["-y", "@sentry/mcp-server@latest"],
|
|
23
|
+
"env": {
|
|
24
|
+
"SENTRY_ACCESS_TOKEN": "${SENTRY_ACCESS_TOKEN}"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"metadata": {
|
|
28
|
+
"description": "Erros, stack traces e performance",
|
|
29
|
+
"docsUrl": "https://docs.sentry.io",
|
|
30
|
+
"credentialUrl": "https://sentry.io/settings/account/api/auth-tokens/",
|
|
31
|
+
"credentialInstructions": "sentry.io > Settings > Auth Tokens > Create New Token",
|
|
32
|
+
"version": "1.0.0"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "slack",
|
|
3
|
+
"displayName": "Slack",
|
|
4
|
+
"category": "comunicação",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "oauth",
|
|
7
|
+
"envVar": null,
|
|
8
|
+
"required": false,
|
|
9
|
+
"headless": {
|
|
10
|
+
"type": "api-key",
|
|
11
|
+
"envVar": "SLACK_BOT_TOKEN",
|
|
12
|
+
"required": true
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"config": {
|
|
16
|
+
"type": "http",
|
|
17
|
+
"url": "https://mcp.slack.com/mcp"
|
|
18
|
+
},
|
|
19
|
+
"headlessConfig": {
|
|
20
|
+
"type": "stdio",
|
|
21
|
+
"command": "npx",
|
|
22
|
+
"args": ["-y", "slack-mcp-server@latest", "--transport", "stdio"],
|
|
23
|
+
"env": {
|
|
24
|
+
"SLACK_BOT_TOKEN": "${SLACK_BOT_TOKEN}"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"metadata": {
|
|
28
|
+
"description": "Mensagens, busca e canais",
|
|
29
|
+
"docsUrl": "https://api.slack.com",
|
|
30
|
+
"credentialUrl": "https://api.slack.com/apps",
|
|
31
|
+
"credentialInstructions": "api.slack.com/apps > Create App > OAuth & Permissions > Bot Token Scopes > Install > Copy Bot Token (xoxb-...)",
|
|
32
|
+
"version": "1.0.0"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "stitch",
|
|
3
|
+
"displayName": "Stitch",
|
|
4
|
+
"category": "design",
|
|
5
|
+
"auth": {
|
|
6
|
+
"type": "api-key",
|
|
7
|
+
"envVar": "STITCH_API_KEY",
|
|
8
|
+
"required": true
|
|
9
|
+
},
|
|
10
|
+
"config": {
|
|
11
|
+
"type": "http",
|
|
12
|
+
"url": "https://stitch.googleapis.com/mcp",
|
|
13
|
+
"headers": {
|
|
14
|
+
"X-Goog-Api-Key": "${STITCH_API_KEY}"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"metadata": {
|
|
18
|
+
"description": "Geração de UI via texto (Google)",
|
|
19
|
+
"docsUrl": "https://stitch.withgoogle.com",
|
|
20
|
+
"version": "1.0.0"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agents",
|
|
3
|
+
"displayName": "Agents",
|
|
4
|
+
"description": "Projetos com agentes IA, workflows N8N e automação",
|
|
5
|
+
"mcps": ["github", "context7", "figma", "stitch", "linear", "slack", "clickup", "coolify", "semgrep", "postgres", "sentry", "hetzner", "n8n-docs", "n8n-instance", "playwright"],
|
|
6
|
+
"version": "1.0.0"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "full",
|
|
3
|
+
"displayName": "Full",
|
|
4
|
+
"description": "Setup global completo com todos os MCPs de escopo user",
|
|
5
|
+
"mcps": ["github", "context7", "figma", "stitch", "linear", "slack", "clickup", "hetzner", "coolify", "n8n-docs", "semgrep", "sentry", "playwright"],
|
|
6
|
+
"version": "1.0.0"
|
|
7
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "headless",
|
|
3
|
+
"displayName": "Headless",
|
|
4
|
+
"description": "Servidores e VPS sem browser — todos os MCPs via token ou API key (exceto Figma)",
|
|
5
|
+
"mcps": [
|
|
6
|
+
"github",
|
|
7
|
+
"context7",
|
|
8
|
+
"stitch",
|
|
9
|
+
"linear",
|
|
10
|
+
"slack",
|
|
11
|
+
"clickup",
|
|
12
|
+
"hetzner",
|
|
13
|
+
"coolify",
|
|
14
|
+
"n8n-docs",
|
|
15
|
+
"semgrep",
|
|
16
|
+
"sentry",
|
|
17
|
+
"playwright"
|
|
18
|
+
],
|
|
19
|
+
"version": "1.0.0"
|
|
20
|
+
}
|