@christopher_dondici/mcp-gen 2.1.2
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/CHANGELOG.md +217 -0
- package/LICENSE +21 -0
- package/README.md +439 -0
- package/README.pt-BR.md +320 -0
- package/RELEASE_NOTES.md +98 -0
- package/SECURITY.md +75 -0
- package/SECURITY.pt-BR.md +77 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +685 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/generator.d.ts +4 -0
- package/dist/core/generator.d.ts.map +1 -0
- package/dist/core/generator.js +275 -0
- package/dist/core/generator.js.map +1 -0
- package/dist/core/incremental.d.ts +25 -0
- package/dist/core/incremental.d.ts.map +1 -0
- package/dist/core/incremental.js +91 -0
- package/dist/core/incremental.js.map +1 -0
- package/dist/core/parser.d.ts +3 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +372 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/registry.d.ts +13 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +107 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/security-lint.d.ts +53 -0
- package/dist/core/security-lint.d.ts.map +1 -0
- package/dist/core/security-lint.js +470 -0
- package/dist/core/security-lint.js.map +1 -0
- package/dist/core/security.d.ts +41 -0
- package/dist/core/security.d.ts.map +1 -0
- package/dist/core/security.js +150 -0
- package/dist/core/security.js.map +1 -0
- package/dist/core/templating.d.ts +5 -0
- package/dist/core/templating.d.ts.map +1 -0
- package/dist/core/templating.js +211 -0
- package/dist/core/templating.js.map +1 -0
- package/dist/core/types.d.ts +104 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/templates/go/Dockerfile.hbs +16 -0
- package/dist/templates/go/README.md.hbs +77 -0
- package/dist/templates/go/ci.yml.hbs +28 -0
- package/dist/templates/go/client.go.hbs +86 -0
- package/dist/templates/go/go.mod.hbs +5 -0
- package/dist/templates/go/models.go.hbs +28 -0
- package/dist/templates/go/server.go.hbs +220 -0
- package/dist/templates/python/Dockerfile.hbs +12 -0
- package/dist/templates/python/README.md.hbs +115 -0
- package/dist/templates/python/ci.yml.hbs +24 -0
- package/dist/templates/python/models.py.hbs +20 -0
- package/dist/templates/python/requirements.txt.hbs +3 -0
- package/dist/templates/python/server.py.hbs +195 -0
- package/dist/templates/typescript/Dockerfile.hbs +18 -0
- package/dist/templates/typescript/README.md.hbs +91 -0
- package/dist/templates/typescript/ci.yml.hbs +28 -0
- package/dist/templates/typescript/client.hbs +49 -0
- package/dist/templates/typescript/models.hbs +23 -0
- package/dist/templates/typescript/package.json.hbs +26 -0
- package/dist/templates/typescript/server.hbs +337 -0
- package/dist/templates/typescript/tsconfig.json.hbs +17 -0
- package/examples/petstore.json +130 -0
- package/examples/petstore.yaml +131 -0
- package/examples/week3.json +47 -0
- package/package.json +64 -0
package/README.pt-BR.md
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
# MCP-Generator
|
|
2
|
+
|
|
3
|
+
> **Também disponível em:** [English (English Version)](README.md)
|
|
4
|
+
|
|
5
|
+
Gere servidores MCP a partir de specs OpenAPI.
|
|
6
|
+
|
|
7
|
+
> **Status**: `@christopher_dondici/mcp-gen` 2.1.2 está preparado para release e ainda não foi publicado no npm. Esta versão inclui correções de build, empacotamento, CI e dependências, sem novas funcionalidades de runtime. Use o início rápido pelo código-fonte abaixo. Veja as [notas de release](RELEASE_NOTES.md).
|
|
8
|
+
|
|
9
|
+
`mcp-gen` transforma uma spec OpenAPI v3 em um servidor [Model Context Protocol](https://modelcontextprotocol.io) em TypeScript, Python ou Go. Cada rota vira uma tool, e a geração incremental preserva o código customizado entre os marcadores indicados.
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
## Início rápido
|
|
13
|
+
|
|
14
|
+
Com Git, Node.js 20+ e npm 9+ instalados, execute:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
git clone https://github.com/ChristopherDond/MCP-Generator.git
|
|
18
|
+
cd MCP-Generator
|
|
19
|
+
npm ci
|
|
20
|
+
npm run build
|
|
21
|
+
node dist/cli/index.js --version
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Gerar um servidor a partir de uma spec local:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
node dist/cli/index.js generate -i examples/petstore.yaml -l typescript -o ./my-server
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Validar uma spec sem gerar arquivos:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
node dist/cli/index.js validate -i examples/petstore.yaml
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Execute esses comandos na raiz do repositório, na branch `main`. As correções de build e empacotamento fazem parte da 2.1.2. A geração cria um scaffold; não instala dependências, compila ou inicia o servidor gerado.
|
|
37
|
+
|
|
38
|
+
Use a CLI interativa se preferir prompts:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm run dev
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## O que a ferramenta faz
|
|
45
|
+
|
|
46
|
+
```mermaid
|
|
47
|
+
sequenceDiagram
|
|
48
|
+
participant User
|
|
49
|
+
participant CLI
|
|
50
|
+
participant Parser
|
|
51
|
+
participant Generator
|
|
52
|
+
participant Output
|
|
53
|
+
|
|
54
|
+
User->>CLI: mcp-gen generate --input api.yaml --lang python
|
|
55
|
+
CLI->>Parser: valida e faz parse de OpenAPI v3 (JSON ou YAML)
|
|
56
|
+
Parser->>Generator: AST interna (tools, models, examples)
|
|
57
|
+
Generator->>Output: renderiza templates Handlebars
|
|
58
|
+
Output-->>User: projeto MCP em TypeScript, Python ou Go
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Cada rota vira uma tool MCP com:
|
|
62
|
+
|
|
63
|
+
- entrada tipada a partir de parâmetros e request body
|
|
64
|
+
- respostas de exemplo da spec
|
|
65
|
+
- preservação opcional de código incremental
|
|
66
|
+
|
|
67
|
+
## Requisitos
|
|
68
|
+
|
|
69
|
+
- Node.js 20+
|
|
70
|
+
- npm 9+ (o início rápido usa o lockfile do repositório)
|
|
71
|
+
- Git para clonar o repositório
|
|
72
|
+
- (Opcional) Python 3.8+ para projetos Python
|
|
73
|
+
- (Opcional) Go 1.22+ para projetos Go
|
|
74
|
+
|
|
75
|
+
## Instalação local e comandos abreviados
|
|
76
|
+
|
|
77
|
+
Use o build do código-fonte em [Início rápido](#início-rápido) enquanto a publicação no npm não estiver verificada. Quando a versão 2.1.2 for publicada e sua disponibilidade no npm for confirmada, você poderá instalá-la com `npm install -g @christopher_dondici/mcp-gen@2.1.2`.
|
|
78
|
+
Neste README, `mcp-gen` é uma abreviação de `node dist/cli/index.js`, executado na raiz do repositório. Por exemplo, `mcp-gen validate -i examples/petstore.yaml` equivale a `node dist/cli/index.js validate -i examples/petstore.yaml`.
|
|
79
|
+
|
|
80
|
+
Opcionalmente, execute `npm link` na raiz após o build para disponibilizar o comando `mcp-gen` apontando para seu checkout local. Isso altera os links globais do npm; não baixa um pacote `@christopher_dondici/mcp-gen` publicado. O nome npm mudou porque `mcp-gen` foi recusado por similaridade com `mcpgen`; o comando continua sendo `mcp-gen`.
|
|
81
|
+
|
|
82
|
+
Para instalar um tarball produzido localmente sem publicar:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
npm install ./christopher_dondici-mcp-gen-2.1.2.tgz
|
|
86
|
+
./node_modules/.bin/mcp-gen --version
|
|
87
|
+
./node_modules/.bin/mcp-gen validate -i node_modules/@christopher_dondici/mcp-gen/examples/petstore.yaml
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## CLI
|
|
91
|
+
|
|
92
|
+
### Comandos
|
|
93
|
+
|
|
94
|
+
- `mcp-gen generate` ou `mcp-gen g` cria um servidor a partir de uma spec.
|
|
95
|
+
- `mcp-gen validate` ou `mcp-gen v` confere uma spec sem gerar arquivos.
|
|
96
|
+
- `mcp-gen init` baixa uma spec pública conhecida e pode gerar um projeto.
|
|
97
|
+
- `mcp-gen watch` observa um arquivo ou URL e regenera quando houver mudança.
|
|
98
|
+
|
|
99
|
+
### Gerar
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
mcp-gen generate -i ./api/openapi.yaml -l typescript -o ./my-server
|
|
103
|
+
mcp-gen generate -i ./api/openapi.yaml -l python -o ./my-server
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Flags úteis:
|
|
107
|
+
|
|
108
|
+
- `--force`, `-f` sobrescreve arquivos existentes.
|
|
109
|
+
- `--incremental` mantém o código entre `@@mcp-gen:start` e `@@mcp-gen:end`.
|
|
110
|
+
- `--name <name>` define o nome do servidor.
|
|
111
|
+
- `--server-version <version>` define a versão do servidor.
|
|
112
|
+
- `--plugin <path>` carrega um plugin.
|
|
113
|
+
|
|
114
|
+
### Validar
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
mcp-gen validate -i ./api/openapi.yaml
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Formatos aceitos: `.json`, `.yaml`, `.yml` ou uma URL.
|
|
121
|
+
|
|
122
|
+
### Segurança e lint (v2.1.1)
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
node dist/cli/index.js security -p ./my-server
|
|
126
|
+
node dist/cli/index.js security -p ./my-server --fail-on-warn
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Analisa arquivos gerados buscando padrões semelhantes a credenciais, identificadores ligados à autorização, nomes, descrições e marcadores incrementais. `--json` imprime um relatório JSON, mas a CLI também imprime um cabeçalho; stdout não é um documento JSON puro. Erros resultam em código de saída 1; `--fail-on-warn` também falha com avisos. É análise estática, não garantia de segurança.
|
|
130
|
+
|
|
131
|
+
### Init
|
|
132
|
+
|
|
133
|
+
`init` usa o registry interno:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
mcp-gen init --from list
|
|
137
|
+
mcp-gen init --from stripe
|
|
138
|
+
mcp-gen init --from stripe --generate -o ./stripe-mcp
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Chaves disponíveis no registry:
|
|
142
|
+
|
|
143
|
+
| Chave | Descrição |
|
|
144
|
+
|-----|-------------|
|
|
145
|
+
| `stripe` | Stripe Payment API |
|
|
146
|
+
| `github` | GitHub REST API |
|
|
147
|
+
| `slack` | Slack Web API |
|
|
148
|
+
| `openai` | OpenAI API |
|
|
149
|
+
| `petstore` | Exemplo Swagger Petstore |
|
|
150
|
+
| `twilio` | Twilio Communications API |
|
|
151
|
+
| `shopify` | Shopify Admin API |
|
|
152
|
+
| `kubernetes` | Kubernetes API |
|
|
153
|
+
| `digitalocean` | DigitalOcean API |
|
|
154
|
+
| `azure` | Azure Resource Manager API |
|
|
155
|
+
|
|
156
|
+
### Watch
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
mcp-gen watch -i ./api/openapi.yaml -o ./my-server
|
|
160
|
+
mcp-gen watch -i https://example.com/spec.json --interval 60000
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Para entradas via URL, `--interval <ms>` controla o polling. `--once` gera uma vez e encerra após a primeira mudança.
|
|
164
|
+
|
|
165
|
+
## Plugins
|
|
166
|
+
|
|
167
|
+
Plugins podem sobrescrever templates e registrar helpers extras do Handlebars.
|
|
168
|
+
|
|
169
|
+
Estrutura básica:
|
|
170
|
+
|
|
171
|
+
- `templates/typescript/...` ou `templates/python/...` para sobrescrever templates `.hbs`
|
|
172
|
+
- `index.js` que exporta `registerHandlebars(handlebars)` para helpers customizados
|
|
173
|
+
|
|
174
|
+
Exemplo:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
mcp-gen generate -i ./api/openapi.yaml --plugin ./meu-plugin
|
|
178
|
+
mcp-gen watch -i ./api/openapi.yaml --plugin ./meu-plugin
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Os templates do plugin substituem os do core quando usam o mesmo caminho em `templates/<lang>/`.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Estrutura do projeto gerado
|
|
186
|
+
|
|
187
|
+
**TypeScript:**
|
|
188
|
+
```
|
|
189
|
+
my-server/
|
|
190
|
+
├── src/
|
|
191
|
+
│ ├── server.ts # MCP server — definições de tools + handlers
|
|
192
|
+
│ └── models.ts # Interfaces TypeScript geradas a partir dos schemas OpenAPI
|
|
193
|
+
├── .github/
|
|
194
|
+
│ └── workflows/
|
|
195
|
+
│ └── ci.yml
|
|
196
|
+
├── Dockerfile
|
|
197
|
+
├── package.json
|
|
198
|
+
├── tsconfig.json
|
|
199
|
+
└── README.md
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Python:**
|
|
203
|
+
```
|
|
204
|
+
my-server/
|
|
205
|
+
├── server.py # Servidor FastMCP — definições de tools + handlers
|
|
206
|
+
├── models.py # Modelos Pydantic gerados a partir dos schemas OpenAPI
|
|
207
|
+
├── requirements.txt
|
|
208
|
+
├── .github/
|
|
209
|
+
│ └── workflows/
|
|
210
|
+
│ └── ci.yml
|
|
211
|
+
├── Dockerfile
|
|
212
|
+
└── README.md
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Conectar ao Claude Desktop
|
|
218
|
+
|
|
219
|
+
**TypeScript:**
|
|
220
|
+
```json
|
|
221
|
+
{
|
|
222
|
+
"mcpServers": {
|
|
223
|
+
"my-server": {
|
|
224
|
+
"command": "node",
|
|
225
|
+
"args": ["/absolute/path/to/my-server/dist/server.js"]
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Python:**
|
|
232
|
+
```json
|
|
233
|
+
{
|
|
234
|
+
"mcpServers": {
|
|
235
|
+
"my-server": {
|
|
236
|
+
"command": "python",
|
|
237
|
+
"args": ["/absolute/path/to/my-server/server.py"]
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Reinicie o Claude Desktop. As tools da sua API vão aparecer automaticamente.
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Implementar handlers
|
|
248
|
+
|
|
249
|
+
Os arquivos gerados retornam exemplos da spec por padrão. Substitua os stubs pela lógica real.
|
|
250
|
+
|
|
251
|
+
**TypeScript** (`src/server.ts`):
|
|
252
|
+
```typescript
|
|
253
|
+
case "get_users_id": {
|
|
254
|
+
// @@mcp-gen:start:get_users_id
|
|
255
|
+
const user = await db.users.findById(args.id);
|
|
256
|
+
return { content: [{ type: "text", text: JSON.stringify(user) }] };
|
|
257
|
+
// @@mcp-gen:end:get_users_id
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Python** (`server.py`):
|
|
262
|
+
```python
|
|
263
|
+
@mcp.tool()
|
|
264
|
+
async def get_users_id(id: float) -> Any:
|
|
265
|
+
# @@mcp-gen:start:get_users_id
|
|
266
|
+
user = await db.users.find_by_id(id)
|
|
267
|
+
return user
|
|
268
|
+
# @@mcp-gen:end:get_users_id
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Código entre os marcadores `@@mcp-gen:start` e `@@mcp-gen:end` é preservado quando você roda `generate --incremental` novamente.
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Desenvolvimento
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
npm test
|
|
279
|
+
npx tsc --noEmit
|
|
280
|
+
|
|
281
|
+
# Exemplo TypeScript
|
|
282
|
+
node dist/cli/index.js generate --input examples/petstore.json --out /tmp/ts-test --force
|
|
283
|
+
|
|
284
|
+
# Exemplo Python
|
|
285
|
+
node dist/cli/index.js generate --input examples/petstore.yaml --lang python --out /tmp/py-test --force
|
|
286
|
+
|
|
287
|
+
# Exemplo incremental
|
|
288
|
+
node dist/cli/index.js generate --input examples/petstore.json --out /tmp/ts-test --incremental
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Roadmap
|
|
294
|
+
|
|
295
|
+
| Etapa | Status | Escopo |
|
|
296
|
+
|-------|--------|-------|
|
|
297
|
+
| Recursos existentes | Implementados | CLI, parser OpenAPI v3, geração TypeScript/Python, geração incremental, modo interativo, registry de specs, plugins |
|
|
298
|
+
| v2.1.0 | Com tag | Target Go, modo HTTP, enums, parâmetros header/cookie, API de biblioteca, validação detalhada |
|
|
299
|
+
| v2.1.1 | Com tag | Análise estática de segurança/lint e verificações no template de servidor Go; templates TypeScript/Python sem alterações desde v2.1.0 |
|
|
300
|
+
| v2.1.2 | Preparada para release | Cópia portátil de templates, lockfile, allowlist do pacote, build no prepack, workflow de release corrigido, smoke test do tarball na CI, atualização de dependências |
|
|
301
|
+
| Distribuição | Não verificada | A publicação da 2.1.2 no npm precisa ser confirmada antes da instalação pelo registry; publicação via pip não comprovada. Python é um target de geração, não uma forma de instalar esta CLI via pip |
|
|
302
|
+
| Futuro | Planejado | Streaming/resources/prompts, OpenAPI v2, mais registries |
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## Limitações conhecidas
|
|
307
|
+
|
|
308
|
+
- OpenAPI v2 (Swagger) não é suportado — apenas v3.x
|
|
309
|
+
- `oneOf` / `anyOf` / `discriminator` são parcialmente tratados
|
|
310
|
+
- A análise de segurança/lint usa padrões estáticos de texto e pode gerar falsos positivos ou deixar problemas passar. Um relatório aprovado não garante segurança nem verifica autorização, revogação, gastos ou auditoria em execução
|
|
311
|
+
- As verificações de autorização geradas são scaffolding, não um backend completo de segurança; revise e teste antes do deploy
|
|
312
|
+
- Streaming/resources/prompts ainda não estão implementados
|
|
313
|
+
|
|
314
|
+
A correção de `copy-templates` incluída na 2.1.2 usa `fs.cpSync` do Node.js no Windows, Linux e macOS; não depende mais de `cp` ou `xcopy`. A CI atual executa apenas no Ubuntu.
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
## Licença
|
|
319
|
+
|
|
320
|
+
MIT © 2026 - Christopher D.
|
package/RELEASE_NOTES.md
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Notas de release
|
|
2
|
+
|
|
3
|
+
## Estado e fontes
|
|
4
|
+
|
|
5
|
+
A versão `2.1.2` do pacote `@christopher_dondici/mcp-gen` está preparada para release e ainda não foi publicada, com `package.json` e `package-lock.json` alinhados. O npm recusou `mcp-gen` por similaridade com `mcpgen`; a renomeação mantém a versão, o binário `mcp-gen` e o repositório. A publicação no npm não foi verificada; estas notas não confirmam publicação nem criação de tag. Uma tag Git ou um workflow de publicação não comprova disponibilidade no registry.
|
|
6
|
+
|
|
7
|
+
A 2.1.2 reúne correções de build, empacotamento, CI e dependências, sem novas funcionalidades de runtime. Estas notas preservam o histórico da 2.1.1, confrontando o [CHANGELOG](CHANGELOG.md) com os diffs `v2.1.0..v2.1.1` e `v2.1.1..1629696`, e descrevem separadamente a preparação da 2.1.2. As seções históricas do changelog não foram alteradas; suas afirmações sobre publicação e segurança não confirmam o estado atual.
|
|
8
|
+
|
|
9
|
+
## Funcionalidade histórica da v2.1.1
|
|
10
|
+
|
|
11
|
+
Comparação: `v2.1.0..v2.1.1`.
|
|
12
|
+
|
|
13
|
+
- Inclusão de `src/core/security-lint.ts`, com análise estática de padrões semelhantes a credenciais, referências a `authContext`, identificadores de políticas, nomes, descrições, TODO/FIXME e marcadores incrementais. Também há verificações de descrições e exemplos de uma spec encontrada no projeto; isso não equivale a validar integralmente seus schemas.
|
|
14
|
+
- Novo comando `security` (alias `sec`) e opção no menu interativo. A sintaxe real exige `-p` ou `--project`, não o caminho posicional mostrado no changelog.
|
|
15
|
+
- `--json` imprime o relatório em JSON; a CLI ainda imprime um cabeçalho antes dele, portanto stdout não é JSON puro. Erros encerram com código 1; `--fail-on-warn` também encerra com código 1 quando há avisos.
|
|
16
|
+
- Exports de biblioteca: `scanProject`, `formatReport` e os tipos `SecurityRule` e `SecurityReport`.
|
|
17
|
+
- Inclusão de 11 testes em `tests/security-lint.test.ts` e configuração explícita de transformação via `ts-jest`.
|
|
18
|
+
- Ajustes nos textos e prompts da CLI, com remoção de textos bilíngues em diversos pontos.
|
|
19
|
+
- O workflow de release passou a tentar condicionar `npm publish` à presença de `NPM_TOKEN`; a correção atual dessa condição é descrita separadamente abaixo.
|
|
20
|
+
|
|
21
|
+
Exemplo após compilar o checkout local:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
node dist/cli/index.js security -p ./my-server
|
|
25
|
+
node dist/cli/index.js security -p ./my-server --fail-on-warn
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Templates: correção em relação ao changelog
|
|
29
|
+
|
|
30
|
+
**Os templates TypeScript e Python não mudaram entre `v2.1.0` e `v2.1.1`.** As melhorias atribuídas a eles na seção 2.1.1 do changelog não aparecem nesse diff e não são novidades dessa tag.
|
|
31
|
+
|
|
32
|
+
O template alterado foi `src/templates/go/server.go.hbs`: recebeu `RAW_CREDENTIAL_KEYS`, `TOOL_POLICIES`, `hasRawCredentialKey`, `requireSecurity` e a chamada de verificação nos handlers. Esses elementos são scaffolding e não comprovam uma implementação completa de autorização, auditoria ou revogação.
|
|
33
|
+
|
|
34
|
+
Go, modo HTTP, enums, parâmetros header/cookie, API de biblioteca e validação detalhada já pertenciam à v2.1.0; não são novidades da v2.1.1.
|
|
35
|
+
|
|
36
|
+
## Alterações após a tag até 1629696
|
|
37
|
+
|
|
38
|
+
Comparação: `v2.1.1..1629696`.
|
|
39
|
+
|
|
40
|
+
- `690de37`: remoção de comentários em `src/cli/index.ts`, `src/core/generator.ts` e `src/core/incremental.ts`, sem mudança de lógica executável nesse diff.
|
|
41
|
+
- `1629696`: alteração da sintaxe do `if` referente a `NPM_TOKEN` no workflow de release. Ainda era uma referência direta a `secrets` na condição; a correção incluída na 2.1.2 abaixo substitui essa abordagem.
|
|
42
|
+
- Nenhum template mudou nesse intervalo. Esses commits posteriores à tag não constituem uma nova versão publicada.
|
|
43
|
+
|
|
44
|
+
## Correções incluídas na 2.1.2
|
|
45
|
+
|
|
46
|
+
As alterações abaixo fazem parte da preparação da 2.1.2 e abrangem build, empacotamento, automação e dependências. Não adicionam funcionalidades aos servidores gerados e não fazem parte do conteúdo histórico da tag `v2.1.1`.
|
|
47
|
+
|
|
48
|
+
### Build e pacote
|
|
49
|
+
|
|
50
|
+
- `publishConfig.access` é `public` para o pacote scoped. O tarball da 2.1.2 se chama `christopher_dondici-mcp-gen-2.1.2.tgz` e a instalação local usa `node_modules/@christopher_dondici/mcp-gen`.
|
|
51
|
+
- Para o pacote final, use um clone ou worktree limpo fora do checkout de desenvolvimento; `prepack` não remove arquivos antigos nem caches já existentes em `dist/`.
|
|
52
|
+
- `copy-templates` usa uma chamada inline de Node.js a `fs.cpSync`, com cópia recursiva de `src/templates` para `dist/templates`. Não depende mais de `xcopy` nem de comandos de cópia específicos do shell.
|
|
53
|
+
- A allowlist `files` inclui `dist/`, `examples/`, `README.md`, `README.pt-BR.md`, `CHANGELOG.md`, `RELEASE_NOTES.md`, `SECURITY.md`, `SECURITY.pt-BR.md` e `LICENSE`. O npm também inclui seu manifesto automaticamente.
|
|
54
|
+
- `prepack` executa `npm run build`, preparando o código compilado e os templates antes do empacotamento.
|
|
55
|
+
- `package-lock.json` deixa de ser ignorado e passa a ser versionado com metadados alinhados a `2.1.2`, permitindo o fluxo `npm ci` com dependências fixadas pelo lockfile.
|
|
56
|
+
- `repository.url` usa o formato normalizado `git+https://github.com/ChristopherDond/MCP-Generator.git`.
|
|
57
|
+
- `npm run release` agora executa somente build e testes, removendo a chamada ao inexistente `scripts/release.js`. Esse comando não aumenta versão nem faz push.
|
|
58
|
+
- **Os comandos explícitos `release:patch` e `release:rc` continuam presentes e podem aumentar a versão e fazer push de commits/tags.** `scripts/release.sh` e `scripts/release.bat` também permanecem, com operações de atualização de versão, push e criação de release no GitHub. Não são comandos de verificação local e não foram executados nesta tarefa.
|
|
59
|
+
|
|
60
|
+
### CI e release
|
|
61
|
+
|
|
62
|
+
- A nova CI é acionada por pushes em qualquer branch e por pull requests, em `ubuntu-latest` com Node.js 20.
|
|
63
|
+
- Executa `npm ci`, `npx tsc --noEmit`, testes, build e `npm pack` real. Instala o tarball em um diretório temporário e verifica `--version` e `validate` usando o exemplo Petstore incluído no pacote.
|
|
64
|
+
- O smoke test verifica instalação e execução básica do tarball; não compila nem executa servidores gerados em todas as linguagens. A CI não publica no npm e não testa Windows/macOS.
|
|
65
|
+
- O workflow separado de release mantém o mesmo gatilho de tags estáveis (`v[0-9]+.[0-9]+.[0-9]+`). Verifica nome scoped, acesso público e correspondência entre tag e versão; executa typecheck, testes, build, pack e smoke test antes da publicação.
|
|
66
|
+
- A publicação usa `--access public` sobre o mesmo tarball validado, também anexado à release GitHub. A lógica de RC inalcançável foi removida. Uma release GitHub sem publicação npm continua possível quando o segredo não está disponível; não comprova publicação no registry.
|
|
67
|
+
- A variável de ambiente booleana `HAS_NPM_TOKEN` representa apenas a presença do segredo. O passo de publicação usa `if: env.HAS_NPM_TOKEN == 'true'`, em vez de consultar `secrets` diretamente no `if`. Isso não confirma que o pacote já foi publicado.
|
|
68
|
+
|
|
69
|
+
### Dependências
|
|
70
|
+
|
|
71
|
+
- Atualizações fixadas no lockfile da 2.1.2: `fast-uri` 3.1.8, `hono` 4.13.8, `js-yaml` 4.3.2 e `qs` 6.16.0. Resultados de auditoria dependem da data da consulta; essas versões não são uma garantia de ausência de vulnerabilidades.
|
|
72
|
+
|
|
73
|
+
## Uso local
|
|
74
|
+
|
|
75
|
+
Com Git, Node.js 20+ e npm 9+ instalados:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
git clone https://github.com/ChristopherDond/MCP-Generator.git
|
|
79
|
+
cd MCP-Generator
|
|
80
|
+
npm ci
|
|
81
|
+
npm run build
|
|
82
|
+
node dist/cli/index.js --version
|
|
83
|
+
node dist/cli/index.js generate -i examples/petstore.yaml -l typescript -o ./my-server
|
|
84
|
+
node dist/cli/index.js validate -i examples/petstore.yaml
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
O fluxo acima usa a branch `main`, com as correções de build e empacotamento incluídas na 2.1.2, não um checkout isolado da tag histórica `v2.1.1`. A geração cria arquivos; não instala dependências nem inicia o servidor gerado.
|
|
88
|
+
|
|
89
|
+
Quando a versão 2.1.2 for publicada e sua disponibilidade no npm for confirmada, a instalação pelo registry poderá ser feita com `npm install -g @christopher_dondici/mcp-gen@2.1.2`. Até essa confirmação, use o fluxo pelo código-fonte.
|
|
90
|
+
|
|
91
|
+
Nos READMEs, `mcp-gen` é uma abreviação de `node dist/cli/index.js` na raiz do repositório. Opcionalmente, `npm link` após o build cria o comando apontando para o checkout local, alterando os links globais do npm sem depender de uma publicação de `@christopher_dondici/mcp-gen` no registry. Não há fluxo de instalação desta CLI via pip confirmado.
|
|
92
|
+
|
|
93
|
+
## Limitações
|
|
94
|
+
|
|
95
|
+
- A análise de segurança é estática, baseada em padrões de texto: pode gerar falsos positivos e deixar problemas passar. Um relatório aprovado não garante segurança nem prontidão para produção.
|
|
96
|
+
- Encontrar nomes de políticas ou funções no texto não comprova sua execução nem valida autorização, TTL, limites financeiros, revogação ou persistência de auditoria. Esses controles precisam de revisão e integração com um backend confiável.
|
|
97
|
+
- Os servidores gerados são scaffolds e exigem testes e revisão antes do deploy; não há garantia de segurança ou de equivalência entre os targets.
|
|
98
|
+
- OpenAPI v2 não é suportado. Unions geradas de `oneOf`/`anyOf`/`discriminator` não fornecem validação completa em runtime. Streaming/resources/prompts ainda não estão implementados.
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This document outlines the security measures and practices implemented in the MCP Generator project.
|
|
6
|
+
|
|
7
|
+
## Security Features
|
|
8
|
+
|
|
9
|
+
### 1. Path Traversal Protection
|
|
10
|
+
- All output file paths are validated to prevent directory traversal attacks
|
|
11
|
+
- Uses `validateOutputPath()` to ensure files are written only to the intended output directory
|
|
12
|
+
- Rejects paths that attempt to access parent directories
|
|
13
|
+
|
|
14
|
+
### 2. Plugin Security
|
|
15
|
+
- By default, dynamic plugin code loading is **disabled**
|
|
16
|
+
- Plugins can only provide templates, not arbitrary code execution
|
|
17
|
+
- To enable plugin code loading (not recommended for untrusted sources):
|
|
18
|
+
```bash
|
|
19
|
+
MCP_GEN_ALLOW_PLUGINS=true mcp-gen generate --plugin ./my-plugin ...
|
|
20
|
+
```
|
|
21
|
+
- Plugin modules are validated for safe exports
|
|
22
|
+
- Symbolic links are rejected to prevent symlink attacks
|
|
23
|
+
|
|
24
|
+
### 3. Remote URL Validation
|
|
25
|
+
- Only HTTPS URLs are allowed for fetching OpenAPI specs
|
|
26
|
+
- Private/local IP addresses and localhost are blocked (SSRF prevention)
|
|
27
|
+
- Content-Type validation (only JSON/YAML allowed)
|
|
28
|
+
- Content-Length validation (max 50MB)
|
|
29
|
+
- 30-second timeout on remote fetches
|
|
30
|
+
|
|
31
|
+
### 4. Input Sanitization
|
|
32
|
+
- User inputs are sanitized to remove null bytes and control characters
|
|
33
|
+
- Length limits enforced on user-provided strings
|
|
34
|
+
|
|
35
|
+
## Vulnerability Fixes
|
|
36
|
+
|
|
37
|
+
### Fixed Issues
|
|
38
|
+
- ✅ Remote Code Execution via plugin loading - **MITIGATED**: Dynamic code loading disabled by default
|
|
39
|
+
- ✅ Path traversal - **FIXED**: All output paths validated
|
|
40
|
+
- ✅ SSRF attacks - **FIXED**: URL validation and IP filtering
|
|
41
|
+
- ✅ Dependency vulnerabilities - **FIXED**: All packages audited and updated
|
|
42
|
+
|
|
43
|
+
## Best Practices
|
|
44
|
+
|
|
45
|
+
### For Users
|
|
46
|
+
1. Keep the project updated: `npm audit fix`
|
|
47
|
+
2. Do not enable `MCP_GEN_ALLOW_PLUGINS` with untrusted sources
|
|
48
|
+
3. Validate OpenAPI specs from unknown sources before generation
|
|
49
|
+
4. Use `--force` carefully when overwriting existing projects
|
|
50
|
+
|
|
51
|
+
### For Developers
|
|
52
|
+
1. Run `npm audit` before committing
|
|
53
|
+
2. Add security tests for new features
|
|
54
|
+
3. Never suppress security warnings
|
|
55
|
+
4. Review security.ts for validation functions before adding new file operations
|
|
56
|
+
|
|
57
|
+
## Security Audit Checklist
|
|
58
|
+
|
|
59
|
+
- [x] Path traversal protection
|
|
60
|
+
- [x] Plugin execution control
|
|
61
|
+
- [x] Remote URL validation
|
|
62
|
+
- [x] Dependency vulnerability scanning
|
|
63
|
+
- [x] Input sanitization
|
|
64
|
+
- [ ] Code signing (future)
|
|
65
|
+
- [ ] Security headers (future)
|
|
66
|
+
|
|
67
|
+
## Reporting Security Issues
|
|
68
|
+
|
|
69
|
+
If you discover a security vulnerability, please email security@example.com instead of using the issue tracker.
|
|
70
|
+
|
|
71
|
+
## References
|
|
72
|
+
|
|
73
|
+
- [OWASP Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal)
|
|
74
|
+
- [OWASP SSRF](https://owasp.org/www-community/attacks/Server-Side_Request_Forgery)
|
|
75
|
+
- [OWASP Code Injection](https://owasp.org/www-community/attacks/Code_Injection)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Política de Segurança
|
|
2
|
+
|
|
3
|
+
## Visão Geral
|
|
4
|
+
|
|
5
|
+
Este documento descreve as medidas e práticas de segurança implementadas no projeto MCP Generator.
|
|
6
|
+
|
|
7
|
+
## Recursos de Segurança
|
|
8
|
+
|
|
9
|
+
### 1. Proteção contra Path Traversal
|
|
10
|
+
- Todos os caminhos de arquivo de saída são validados para prevenir ataques de travessia de diretório
|
|
11
|
+
- Usa `validateOutputPath()` para garantir que os arquivos sejam gravados apenas no diretório de saída pretendido
|
|
12
|
+
- Rejeita caminhos que tentam acessar diretórios pai
|
|
13
|
+
|
|
14
|
+
### 2. Segurança de Plugins
|
|
15
|
+
- Por padrão, o carregamento dinâmico de código de plugin está **desabilitado**
|
|
16
|
+
- Os plugins podem fornecer apenas templates, não execução arbitrária de código
|
|
17
|
+
- Para ativar o carregamento de código de plugin (não recomendado para fontes não confiáveis):
|
|
18
|
+
```bash
|
|
19
|
+
MCP_GEN_ALLOW_PLUGINS=true mcp-gen generate --plugin ./meu-plugin ...
|
|
20
|
+
```
|
|
21
|
+
- Módulos de plugin são validados para exportações seguras
|
|
22
|
+
- Links simbólicos são rejeitados para prevenir ataques de symlink
|
|
23
|
+
|
|
24
|
+
### 3. Validação de URL Remota
|
|
25
|
+
- Apenas URLs HTTPS são permitidas para buscar specs OpenAPI
|
|
26
|
+
- Endereços IP privados e localhost são bloqueados (prevenção de SSRF)
|
|
27
|
+
- Validação de Content-Type (apenas JSON/YAML permitidos)
|
|
28
|
+
- Validação de Content-Length (máximo 50MB)
|
|
29
|
+
- Timeout de 30 segundos em buscas remotas
|
|
30
|
+
|
|
31
|
+
### 4. Sanitização de Entrada
|
|
32
|
+
- Entradas do usuário são sanitizadas para remover bytes nulos e caracteres de controle
|
|
33
|
+
- Limites de comprimento aplicados em strings fornecidas pelo usuário
|
|
34
|
+
|
|
35
|
+
## Correções de Vulnerabilidades
|
|
36
|
+
|
|
37
|
+
### Problemas Corrigidos
|
|
38
|
+
- ✅ Execução Remota de Código via carregamento de plugin - **MITIGADO**: Carregamento dinâmico desabilitado por padrão
|
|
39
|
+
- ✅ Path traversal - **CORRIGIDO**: Todos os caminhos de saída validados
|
|
40
|
+
- ✅ Ataques SSRF - **CORRIGIDO**: Validação de URL e filtragem de IP
|
|
41
|
+
- ✅ Vulnerabilidades de dependência - **CORRIGIDO**: Todos os pacotes auditados e atualizados
|
|
42
|
+
|
|
43
|
+
## Melhores Práticas
|
|
44
|
+
|
|
45
|
+
### Para Usuários
|
|
46
|
+
1. Mantenha o projeto atualizado: `npm audit fix`
|
|
47
|
+
2. Não ative `MCP_GEN_ALLOW_PLUGINS` com fontes não confiáveis
|
|
48
|
+
3. Valide specs OpenAPI de fontes desconhecidas antes de gerar
|
|
49
|
+
4. Use `--force` com cuidado ao sobrescrever projetos existentes
|
|
50
|
+
|
|
51
|
+
### Para Desenvolvedores
|
|
52
|
+
1. Execute `npm audit` antes de fazer commit
|
|
53
|
+
2. Adicione testes de segurança para novas funcionalidades
|
|
54
|
+
3. Nunca suprima avisos de segurança
|
|
55
|
+
4. Revise security.ts para funções de validação antes de adicionar novas operações de arquivo
|
|
56
|
+
|
|
57
|
+
## Lista de Verificação de Auditoria de Segurança
|
|
58
|
+
|
|
59
|
+
- [x] Proteção contra path traversal
|
|
60
|
+
- [x] Controle de execução de plugins
|
|
61
|
+
- [x] Validação de URL remota
|
|
62
|
+
- [x] Verificação de vulnerabilidades de dependência
|
|
63
|
+
- [x] Sanitização de entrada
|
|
64
|
+
- [ ] Assinatura de código (futuro)
|
|
65
|
+
- [ ] Headers de segurança (futuro)
|
|
66
|
+
|
|
67
|
+
## Reportando Problemas de Segurança
|
|
68
|
+
|
|
69
|
+
Se você descobrir uma vulnerabilidade de segurança, por favor envie um email para security@example.com em vez de usar o rastreador de problemas.
|
|
70
|
+
|
|
71
|
+
## Referências
|
|
72
|
+
|
|
73
|
+
- [OWASP Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal)
|
|
74
|
+
- [OWASP SSRF](https://owasp.org/www-community/attacks/Server-Side_Request_Forgery)
|
|
75
|
+
- [OWASP Injeção de Código](https://owasp.org/www-community/attacks/Code_Injection)
|
|
76
|
+
- [CWE-22: Improper Limitation of a Pathname to a Restricted Directory](https://cwe.mitre.org/data/definitions/22.html)
|
|
77
|
+
- [CWE-918: Server-Side Request Forgery (SSRF)](https://cwe.mitre.org/data/definitions/918.html)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|