docgen-mcp-server 0.1.0__tar.gz

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.
@@ -0,0 +1,154 @@
1
+ Metadata-Version: 2.4
2
+ Name: docgen-mcp-server
3
+ Version: 0.1.0
4
+ Summary: Add your description here
5
+ Requires-Python: >=3.11
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: beautifulsoup4>=4.14.3
8
+ Requires-Dist: mammoth>=1.12.0
9
+ Requires-Dist: markdownify>=1.2.2
10
+ Requires-Dist: mcp>=1.27.2
11
+ Requires-Dist: openpyxl>=3.1.5
12
+ Requires-Dist: playwright>=1.60.0
13
+ Requires-Dist: pypdf>=6.12.2
14
+ Requires-Dist: python-docx>=1.2.0
15
+ Requires-Dist: python-dotenv>=1.2.2
16
+ Requires-Dist: reportlab>=4.5.1
17
+
18
+ # DocGen MCP Server
19
+
20
+ ## O que é
21
+
22
+ Servidor [Model Context Protocol (MCP)](https://modelcontextprotocol.io) via **stdio** para leitura e escrita de documentos, planilhas, renderização HTML→PDF (Puppeteer) e utilitários de arquivo. Está publicado no npm como **`docgen-mcp-server`** e requer **Node.js 18+**.
23
+
24
+ Recomenda-se executar com **`npx -y docgen-mcp-server@latest`** para o `npx` resolver sempre o dist-tag **latest** (evita reutilizar cache de instalação antiga). Para travar em uma versão: `docgen-mcp-server@<versão>` no lugar de `@latest`.
25
+
26
+ Na primeira execução, **Puppeteer** pode baixar Chromium (tools `render_slide` e `render_page`).
27
+
28
+ ## Ferramentas
29
+
30
+ | Módulo | Ferramenta | Descrição resumida |
31
+ |--------|------------|-------------------|
32
+ | **read_** | `read_doc` | `.docx`/`.pdf`/`.odt` → Markdown; `previewOnly` / `maxChars` limitam saída. |
33
+ | | `read_sheet` | Planilhas → JSON ou Markdown; `range` tipo `A1:D10`; `previewOnly` / `maxRows`. |
34
+ | | `read_archive` | Lista árvore de entradas em `.zip`. |
35
+ | **write_** | `write_doc` | `.docx`/`.pdf`; **Markdown** (`#`, listas, \`\`\`) ou `contentFormat: plain`; template `{{campo}}`. |
36
+ | | `write_sheet` | `.xlsx` ou `.csv`; `append` em `.xlsx` para logs. |
37
+ | **render_** | `render_slide` | HTML/CSS → PDF ou ZIP de slides (use `.slide` por página). |
38
+ | | `render_page` | HTML/CSS → PDF A4 (índice opcional). |
39
+ | **patch_** | `patch_doc` | PDF: merge, split, watermark; DOCX: `replace_text` em XML. |
40
+ | | `patch_sheet` | Atualiza células em `.xlsx`. |
41
+ | **system_** | `scan_dir` | Busca por regex em diretório ou em arquivos/ZIPs. |
42
+ | | `diff_file` | Diff texto ou dados (planilhas). |
43
+ | | `bundle_zip` | Compacta lista de arquivos em um ZIP. |
44
+
45
+ ### Segurança
46
+
47
+ - Sem `..` nos caminhos; leitura limitada por tamanho de ficheiro.
48
+ - **Escrita bloqueada** em pastas do sistema (ex.: `Windows`, `Program Files`, `.ssh`, `.aws` no home).
49
+ - Opcional: **`DOCGEN_ALLOWED_ROOTS`** — lista separada por vírgulas de pastas absolutas; só é permitido ler/escrever dentro delas (útil em monorepos/CI).
50
+
51
+ ### Variáveis de ambiente (opcional)
52
+
53
+ | Variável | Efeito |
54
+ |----------|--------|
55
+ | `DOCGEN_ALLOWED_ROOTS` | Ex.: `C:\repo\my-app,C:\tmp` — restrição de caminhos. |
56
+ | `DOCGEN_SCAN_MAX_MATCHES` | Máximo de correspondências em `scan_dir` (padrão 500). |
57
+ | `DOCGEN_READ_SHEET_MAX_ROWS` | Teto de linhas de dados em `read_sheet` quando não usas `maxRows` (padrão 10000). |
58
+
59
+ Erros das tools devolvem **`structuredContent`** com `ok: false`, `code`, `tool`, `message` e às vezes `hint`.
60
+
61
+ ## Como usar nos clientes (recomendado: npm publicado)
62
+
63
+ Em qualquer cliente MCP com transporte **stdio**:
64
+
65
+ - **Comando**: `npx` (no Windows, se necessário, use o caminho completo de `npx.cmd`).
66
+ - **Argumentos**: `["-y", "docgen-mcp-server@latest"]` (ou versão fixa: `["-y", "docgen-mcp-server@3.0.0"]`).
67
+ - **Variáveis de ambiente**: opcional; veja variáveis do Puppeteer/Chromium se precisar de proxy ou caminho de browser.
68
+
69
+ Exemplo (Cursor, VS Code com MCP, Claude Desktop, etc.):
70
+
71
+ ```json
72
+ {
73
+ "mcpServers": {
74
+ "docgen": {
75
+ "command": "npx",
76
+ "args": ["-y", "docgen-mcp-server@latest"],
77
+ "env": {}
78
+ }
79
+ }
80
+ }
81
+ ```
82
+
83
+ No repositório há um exemplo em [`.cursor/mcp.json.example`](.cursor/mcp.json.example).
84
+
85
+ ### Cursor
86
+
87
+ **Configurações → MCP** (ou JSON de MCP do projeto): use `command`, `args` e `env` como acima.
88
+
89
+ ### Claude Desktop
90
+
91
+ Mesmo esquema de `command`, `args` e `env`. Detalhes de caminho do arquivo de configuração variam por SO; veja a [documentação da Anthropic sobre MCP](https://docs.anthropic.com/en/docs/agents-and-tools/mcp).
92
+
93
+ ### Problemas comuns no Windows com `npx`
94
+
95
+ Se aparecer **`EPERM`**, **`TAR_ENTRY_ERROR`** ou erros tipo **`Cannot find package '...\node_modules\yauzl\index.js'`**, o cache do **`npx`** costuma estar **corrompido** (extração interrompida quando o Cursor recarrega o MCP no meio do `npm install`).
96
+
97
+ 1. Desligue ou desative temporariamente o servidor Docgen no MCP.
98
+ 2. Apague **`%LocalAppData%\npm-cache\_npx`** (pasta inteira ou só o subdiretório do pacote).
99
+ 3. Suba o MCP de novo com `npx -y docgen-mcp-server@latest`.
100
+
101
+ Alternativa estável: `npm install -g docgen-mcp-server` e no MCP use **`command`: `docgen-mcp-server`** (sem `npx`), ou **`node`** com o caminho absoluto do `cli.js` global.
102
+
103
+ ## Desenvolvimento a partir do clone
104
+
105
+ ```bash
106
+ git clone <repo>
107
+ cd docgen-mcp-server
108
+ npm install
109
+ npm run build
110
+ npm start
111
+ ```
112
+
113
+ Sem build prévio (local):
114
+
115
+ ```bash
116
+ npm install
117
+ npm run dev
118
+ ```
119
+
120
+ | Script | Ação |
121
+ |--------|------|
122
+ | `npm run build` | Compila `src/` → `dist/` (`tsc`) |
123
+ | `npm start` | `node dist/cli.js` |
124
+ | `npm run dev` | `tsx src/cli.ts` |
125
+
126
+ ## Publicação no npm (mantenedores)
127
+
128
+ O pacote não inclui `node_modules`; o tarball contém só `dist/` + `README.md` + `package.json` (dependências são instaladas pelo cliente ao rodar `npx`).
129
+
130
+ ```bash
131
+ npm whoami
132
+ npm publish --dry-run
133
+ npm publish
134
+ ```
135
+
136
+ Se a conta tiver **2FA “Auth and writes”**, o npm exige OTP:
137
+
138
+ ```bash
139
+ npm publish --otp=123456
140
+ ```
141
+
142
+ Erro **403 Forbidden** com nome livre costuma ser: OTP ausente, `npm login` em outra conta, ou registro apontando para outro servidor (`npm config get registry` deve ser `https://registry.npmjs.org/`).
143
+
144
+ Versões subsequentes (como no Nautilus):
145
+
146
+ ```bash
147
+ npm run release # patch
148
+ npm run release:minor
149
+ npm run release:major
150
+ ```
151
+
152
+ ## Licença
153
+
154
+ ISC
@@ -0,0 +1,137 @@
1
+ # DocGen MCP Server
2
+
3
+ ## O que é
4
+
5
+ Servidor [Model Context Protocol (MCP)](https://modelcontextprotocol.io) via **stdio** para leitura e escrita de documentos, planilhas, renderização HTML→PDF (Puppeteer) e utilitários de arquivo. Está publicado no npm como **`docgen-mcp-server`** e requer **Node.js 18+**.
6
+
7
+ Recomenda-se executar com **`npx -y docgen-mcp-server@latest`** para o `npx` resolver sempre o dist-tag **latest** (evita reutilizar cache de instalação antiga). Para travar em uma versão: `docgen-mcp-server@<versão>` no lugar de `@latest`.
8
+
9
+ Na primeira execução, **Puppeteer** pode baixar Chromium (tools `render_slide` e `render_page`).
10
+
11
+ ## Ferramentas
12
+
13
+ | Módulo | Ferramenta | Descrição resumida |
14
+ |--------|------------|-------------------|
15
+ | **read_** | `read_doc` | `.docx`/`.pdf`/`.odt` → Markdown; `previewOnly` / `maxChars` limitam saída. |
16
+ | | `read_sheet` | Planilhas → JSON ou Markdown; `range` tipo `A1:D10`; `previewOnly` / `maxRows`. |
17
+ | | `read_archive` | Lista árvore de entradas em `.zip`. |
18
+ | **write_** | `write_doc` | `.docx`/`.pdf`; **Markdown** (`#`, listas, \`\`\`) ou `contentFormat: plain`; template `{{campo}}`. |
19
+ | | `write_sheet` | `.xlsx` ou `.csv`; `append` em `.xlsx` para logs. |
20
+ | **render_** | `render_slide` | HTML/CSS → PDF ou ZIP de slides (use `.slide` por página). |
21
+ | | `render_page` | HTML/CSS → PDF A4 (índice opcional). |
22
+ | **patch_** | `patch_doc` | PDF: merge, split, watermark; DOCX: `replace_text` em XML. |
23
+ | | `patch_sheet` | Atualiza células em `.xlsx`. |
24
+ | **system_** | `scan_dir` | Busca por regex em diretório ou em arquivos/ZIPs. |
25
+ | | `diff_file` | Diff texto ou dados (planilhas). |
26
+ | | `bundle_zip` | Compacta lista de arquivos em um ZIP. |
27
+
28
+ ### Segurança
29
+
30
+ - Sem `..` nos caminhos; leitura limitada por tamanho de ficheiro.
31
+ - **Escrita bloqueada** em pastas do sistema (ex.: `Windows`, `Program Files`, `.ssh`, `.aws` no home).
32
+ - Opcional: **`DOCGEN_ALLOWED_ROOTS`** — lista separada por vírgulas de pastas absolutas; só é permitido ler/escrever dentro delas (útil em monorepos/CI).
33
+
34
+ ### Variáveis de ambiente (opcional)
35
+
36
+ | Variável | Efeito |
37
+ |----------|--------|
38
+ | `DOCGEN_ALLOWED_ROOTS` | Ex.: `C:\repo\my-app,C:\tmp` — restrição de caminhos. |
39
+ | `DOCGEN_SCAN_MAX_MATCHES` | Máximo de correspondências em `scan_dir` (padrão 500). |
40
+ | `DOCGEN_READ_SHEET_MAX_ROWS` | Teto de linhas de dados em `read_sheet` quando não usas `maxRows` (padrão 10000). |
41
+
42
+ Erros das tools devolvem **`structuredContent`** com `ok: false`, `code`, `tool`, `message` e às vezes `hint`.
43
+
44
+ ## Como usar nos clientes (recomendado: npm publicado)
45
+
46
+ Em qualquer cliente MCP com transporte **stdio**:
47
+
48
+ - **Comando**: `npx` (no Windows, se necessário, use o caminho completo de `npx.cmd`).
49
+ - **Argumentos**: `["-y", "docgen-mcp-server@latest"]` (ou versão fixa: `["-y", "docgen-mcp-server@3.0.0"]`).
50
+ - **Variáveis de ambiente**: opcional; veja variáveis do Puppeteer/Chromium se precisar de proxy ou caminho de browser.
51
+
52
+ Exemplo (Cursor, VS Code com MCP, Claude Desktop, etc.):
53
+
54
+ ```json
55
+ {
56
+ "mcpServers": {
57
+ "docgen": {
58
+ "command": "npx",
59
+ "args": ["-y", "docgen-mcp-server@latest"],
60
+ "env": {}
61
+ }
62
+ }
63
+ }
64
+ ```
65
+
66
+ No repositório há um exemplo em [`.cursor/mcp.json.example`](.cursor/mcp.json.example).
67
+
68
+ ### Cursor
69
+
70
+ **Configurações → MCP** (ou JSON de MCP do projeto): use `command`, `args` e `env` como acima.
71
+
72
+ ### Claude Desktop
73
+
74
+ Mesmo esquema de `command`, `args` e `env`. Detalhes de caminho do arquivo de configuração variam por SO; veja a [documentação da Anthropic sobre MCP](https://docs.anthropic.com/en/docs/agents-and-tools/mcp).
75
+
76
+ ### Problemas comuns no Windows com `npx`
77
+
78
+ Se aparecer **`EPERM`**, **`TAR_ENTRY_ERROR`** ou erros tipo **`Cannot find package '...\node_modules\yauzl\index.js'`**, o cache do **`npx`** costuma estar **corrompido** (extração interrompida quando o Cursor recarrega o MCP no meio do `npm install`).
79
+
80
+ 1. Desligue ou desative temporariamente o servidor Docgen no MCP.
81
+ 2. Apague **`%LocalAppData%\npm-cache\_npx`** (pasta inteira ou só o subdiretório do pacote).
82
+ 3. Suba o MCP de novo com `npx -y docgen-mcp-server@latest`.
83
+
84
+ Alternativa estável: `npm install -g docgen-mcp-server` e no MCP use **`command`: `docgen-mcp-server`** (sem `npx`), ou **`node`** com o caminho absoluto do `cli.js` global.
85
+
86
+ ## Desenvolvimento a partir do clone
87
+
88
+ ```bash
89
+ git clone <repo>
90
+ cd docgen-mcp-server
91
+ npm install
92
+ npm run build
93
+ npm start
94
+ ```
95
+
96
+ Sem build prévio (local):
97
+
98
+ ```bash
99
+ npm install
100
+ npm run dev
101
+ ```
102
+
103
+ | Script | Ação |
104
+ |--------|------|
105
+ | `npm run build` | Compila `src/` → `dist/` (`tsc`) |
106
+ | `npm start` | `node dist/cli.js` |
107
+ | `npm run dev` | `tsx src/cli.ts` |
108
+
109
+ ## Publicação no npm (mantenedores)
110
+
111
+ O pacote não inclui `node_modules`; o tarball contém só `dist/` + `README.md` + `package.json` (dependências são instaladas pelo cliente ao rodar `npx`).
112
+
113
+ ```bash
114
+ npm whoami
115
+ npm publish --dry-run
116
+ npm publish
117
+ ```
118
+
119
+ Se a conta tiver **2FA “Auth and writes”**, o npm exige OTP:
120
+
121
+ ```bash
122
+ npm publish --otp=123456
123
+ ```
124
+
125
+ Erro **403 Forbidden** com nome livre costuma ser: OTP ausente, `npm login` em outra conta, ou registro apontando para outro servidor (`npm config get registry` deve ser `https://registry.npmjs.org/`).
126
+
127
+ Versões subsequentes (como no Nautilus):
128
+
129
+ ```bash
130
+ npm run release # patch
131
+ npm run release:minor
132
+ npm run release:major
133
+ ```
134
+
135
+ ## Licença
136
+
137
+ ISC
@@ -0,0 +1,21 @@
1
+ import os
2
+
3
+ def get_scan_max_matches() -> int:
4
+ raw = os.environ.get("DOCGEN_SCAN_MAX_MATCHES")
5
+ if not raw:
6
+ return 500
7
+ try:
8
+ n = int(raw)
9
+ return min(max(1, n), 50000)
10
+ except ValueError:
11
+ return 500
12
+
13
+ def get_read_sheet_max_rows() -> int:
14
+ raw = os.environ.get("DOCGEN_READ_SHEET_MAX_ROWS")
15
+ if not raw:
16
+ return 10000
17
+ try:
18
+ n = int(raw)
19
+ return min(max(1, n), 100000)
20
+ except ValueError:
21
+ return 10000
@@ -0,0 +1,154 @@
1
+ Metadata-Version: 2.4
2
+ Name: docgen-mcp-server
3
+ Version: 0.1.0
4
+ Summary: Add your description here
5
+ Requires-Python: >=3.11
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: beautifulsoup4>=4.14.3
8
+ Requires-Dist: mammoth>=1.12.0
9
+ Requires-Dist: markdownify>=1.2.2
10
+ Requires-Dist: mcp>=1.27.2
11
+ Requires-Dist: openpyxl>=3.1.5
12
+ Requires-Dist: playwright>=1.60.0
13
+ Requires-Dist: pypdf>=6.12.2
14
+ Requires-Dist: python-docx>=1.2.0
15
+ Requires-Dist: python-dotenv>=1.2.2
16
+ Requires-Dist: reportlab>=4.5.1
17
+
18
+ # DocGen MCP Server
19
+
20
+ ## O que é
21
+
22
+ Servidor [Model Context Protocol (MCP)](https://modelcontextprotocol.io) via **stdio** para leitura e escrita de documentos, planilhas, renderização HTML→PDF (Puppeteer) e utilitários de arquivo. Está publicado no npm como **`docgen-mcp-server`** e requer **Node.js 18+**.
23
+
24
+ Recomenda-se executar com **`npx -y docgen-mcp-server@latest`** para o `npx` resolver sempre o dist-tag **latest** (evita reutilizar cache de instalação antiga). Para travar em uma versão: `docgen-mcp-server@<versão>` no lugar de `@latest`.
25
+
26
+ Na primeira execução, **Puppeteer** pode baixar Chromium (tools `render_slide` e `render_page`).
27
+
28
+ ## Ferramentas
29
+
30
+ | Módulo | Ferramenta | Descrição resumida |
31
+ |--------|------------|-------------------|
32
+ | **read_** | `read_doc` | `.docx`/`.pdf`/`.odt` → Markdown; `previewOnly` / `maxChars` limitam saída. |
33
+ | | `read_sheet` | Planilhas → JSON ou Markdown; `range` tipo `A1:D10`; `previewOnly` / `maxRows`. |
34
+ | | `read_archive` | Lista árvore de entradas em `.zip`. |
35
+ | **write_** | `write_doc` | `.docx`/`.pdf`; **Markdown** (`#`, listas, \`\`\`) ou `contentFormat: plain`; template `{{campo}}`. |
36
+ | | `write_sheet` | `.xlsx` ou `.csv`; `append` em `.xlsx` para logs. |
37
+ | **render_** | `render_slide` | HTML/CSS → PDF ou ZIP de slides (use `.slide` por página). |
38
+ | | `render_page` | HTML/CSS → PDF A4 (índice opcional). |
39
+ | **patch_** | `patch_doc` | PDF: merge, split, watermark; DOCX: `replace_text` em XML. |
40
+ | | `patch_sheet` | Atualiza células em `.xlsx`. |
41
+ | **system_** | `scan_dir` | Busca por regex em diretório ou em arquivos/ZIPs. |
42
+ | | `diff_file` | Diff texto ou dados (planilhas). |
43
+ | | `bundle_zip` | Compacta lista de arquivos em um ZIP. |
44
+
45
+ ### Segurança
46
+
47
+ - Sem `..` nos caminhos; leitura limitada por tamanho de ficheiro.
48
+ - **Escrita bloqueada** em pastas do sistema (ex.: `Windows`, `Program Files`, `.ssh`, `.aws` no home).
49
+ - Opcional: **`DOCGEN_ALLOWED_ROOTS`** — lista separada por vírgulas de pastas absolutas; só é permitido ler/escrever dentro delas (útil em monorepos/CI).
50
+
51
+ ### Variáveis de ambiente (opcional)
52
+
53
+ | Variável | Efeito |
54
+ |----------|--------|
55
+ | `DOCGEN_ALLOWED_ROOTS` | Ex.: `C:\repo\my-app,C:\tmp` — restrição de caminhos. |
56
+ | `DOCGEN_SCAN_MAX_MATCHES` | Máximo de correspondências em `scan_dir` (padrão 500). |
57
+ | `DOCGEN_READ_SHEET_MAX_ROWS` | Teto de linhas de dados em `read_sheet` quando não usas `maxRows` (padrão 10000). |
58
+
59
+ Erros das tools devolvem **`structuredContent`** com `ok: false`, `code`, `tool`, `message` e às vezes `hint`.
60
+
61
+ ## Como usar nos clientes (recomendado: npm publicado)
62
+
63
+ Em qualquer cliente MCP com transporte **stdio**:
64
+
65
+ - **Comando**: `npx` (no Windows, se necessário, use o caminho completo de `npx.cmd`).
66
+ - **Argumentos**: `["-y", "docgen-mcp-server@latest"]` (ou versão fixa: `["-y", "docgen-mcp-server@3.0.0"]`).
67
+ - **Variáveis de ambiente**: opcional; veja variáveis do Puppeteer/Chromium se precisar de proxy ou caminho de browser.
68
+
69
+ Exemplo (Cursor, VS Code com MCP, Claude Desktop, etc.):
70
+
71
+ ```json
72
+ {
73
+ "mcpServers": {
74
+ "docgen": {
75
+ "command": "npx",
76
+ "args": ["-y", "docgen-mcp-server@latest"],
77
+ "env": {}
78
+ }
79
+ }
80
+ }
81
+ ```
82
+
83
+ No repositório há um exemplo em [`.cursor/mcp.json.example`](.cursor/mcp.json.example).
84
+
85
+ ### Cursor
86
+
87
+ **Configurações → MCP** (ou JSON de MCP do projeto): use `command`, `args` e `env` como acima.
88
+
89
+ ### Claude Desktop
90
+
91
+ Mesmo esquema de `command`, `args` e `env`. Detalhes de caminho do arquivo de configuração variam por SO; veja a [documentação da Anthropic sobre MCP](https://docs.anthropic.com/en/docs/agents-and-tools/mcp).
92
+
93
+ ### Problemas comuns no Windows com `npx`
94
+
95
+ Se aparecer **`EPERM`**, **`TAR_ENTRY_ERROR`** ou erros tipo **`Cannot find package '...\node_modules\yauzl\index.js'`**, o cache do **`npx`** costuma estar **corrompido** (extração interrompida quando o Cursor recarrega o MCP no meio do `npm install`).
96
+
97
+ 1. Desligue ou desative temporariamente o servidor Docgen no MCP.
98
+ 2. Apague **`%LocalAppData%\npm-cache\_npx`** (pasta inteira ou só o subdiretório do pacote).
99
+ 3. Suba o MCP de novo com `npx -y docgen-mcp-server@latest`.
100
+
101
+ Alternativa estável: `npm install -g docgen-mcp-server` e no MCP use **`command`: `docgen-mcp-server`** (sem `npx`), ou **`node`** com o caminho absoluto do `cli.js` global.
102
+
103
+ ## Desenvolvimento a partir do clone
104
+
105
+ ```bash
106
+ git clone <repo>
107
+ cd docgen-mcp-server
108
+ npm install
109
+ npm run build
110
+ npm start
111
+ ```
112
+
113
+ Sem build prévio (local):
114
+
115
+ ```bash
116
+ npm install
117
+ npm run dev
118
+ ```
119
+
120
+ | Script | Ação |
121
+ |--------|------|
122
+ | `npm run build` | Compila `src/` → `dist/` (`tsc`) |
123
+ | `npm start` | `node dist/cli.js` |
124
+ | `npm run dev` | `tsx src/cli.ts` |
125
+
126
+ ## Publicação no npm (mantenedores)
127
+
128
+ O pacote não inclui `node_modules`; o tarball contém só `dist/` + `README.md` + `package.json` (dependências são instaladas pelo cliente ao rodar `npx`).
129
+
130
+ ```bash
131
+ npm whoami
132
+ npm publish --dry-run
133
+ npm publish
134
+ ```
135
+
136
+ Se a conta tiver **2FA “Auth and writes”**, o npm exige OTP:
137
+
138
+ ```bash
139
+ npm publish --otp=123456
140
+ ```
141
+
142
+ Erro **403 Forbidden** com nome livre costuma ser: OTP ausente, `npm login` em outra conta, ou registro apontando para outro servidor (`npm config get registry` deve ser `https://registry.npmjs.org/`).
143
+
144
+ Versões subsequentes (como no Nautilus):
145
+
146
+ ```bash
147
+ npm run release # patch
148
+ npm run release:minor
149
+ npm run release:major
150
+ ```
151
+
152
+ ## Licença
153
+
154
+ ISC
@@ -0,0 +1,12 @@
1
+ README.md
2
+ config.py
3
+ pyproject.toml
4
+ security.py
5
+ server.py
6
+ services.py
7
+ docgen_mcp_server.egg-info/PKG-INFO
8
+ docgen_mcp_server.egg-info/SOURCES.txt
9
+ docgen_mcp_server.egg-info/dependency_links.txt
10
+ docgen_mcp_server.egg-info/entry_points.txt
11
+ docgen_mcp_server.egg-info/requires.txt
12
+ docgen_mcp_server.egg-info/top_level.txt
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ docgen-mcp-server = server:main
@@ -0,0 +1,10 @@
1
+ beautifulsoup4>=4.14.3
2
+ mammoth>=1.12.0
3
+ markdownify>=1.2.2
4
+ mcp>=1.27.2
5
+ openpyxl>=3.1.5
6
+ playwright>=1.60.0
7
+ pypdf>=6.12.2
8
+ python-docx>=1.2.0
9
+ python-dotenv>=1.2.2
10
+ reportlab>=4.5.1
@@ -0,0 +1,4 @@
1
+ config
2
+ security
3
+ server
4
+ services
@@ -0,0 +1,28 @@
1
+ [project]
2
+ name = "docgen-mcp-server"
3
+ version = "0.1.0"
4
+ description = "Add your description here"
5
+ readme = "README.md"
6
+ requires-python = ">=3.11"
7
+ dependencies = [
8
+ "beautifulsoup4>=4.14.3",
9
+ "mammoth>=1.12.0",
10
+ "markdownify>=1.2.2",
11
+ "mcp>=1.27.2",
12
+ "openpyxl>=3.1.5",
13
+ "playwright>=1.60.0",
14
+ "pypdf>=6.12.2",
15
+ "python-docx>=1.2.0",
16
+ "python-dotenv>=1.2.2",
17
+ "reportlab>=4.5.1",
18
+ ]
19
+
20
+ [project.scripts]
21
+ docgen-mcp-server = "server:main"
22
+
23
+ [tool.setuptools]
24
+ py-modules = ["server", "config", "security", "services"]
25
+
26
+
27
+
28
+
@@ -0,0 +1,69 @@
1
+ import os
2
+ import sys
3
+
4
+ MAX_FILE_SIZE_BYTES = 50 * 1024 * 1024
5
+
6
+ BLOCKED_DIR_NAMES = {
7
+ ".ssh", ".aws", ".gnupg", ".credentials", ".kube", ".docker", ".azure"
8
+ }
9
+
10
+ def get_blocked_roots() -> list:
11
+ blocked = []
12
+ is_win = sys.platform == "win32"
13
+ if is_win:
14
+ sys_root = os.environ.get("SystemRoot", "C:\\Windows")
15
+ blocked.append(os.path.abspath(sys_root))
16
+ blocked.append(os.path.abspath("C:/Program Files"))
17
+ blocked.append(os.path.abspath("C:/Program Files (x86)"))
18
+ else:
19
+ for p in ["/bin", "/sbin", "/usr", "/etc", "/boot", "/sys", "/proc"]:
20
+ try:
21
+ blocked.append(os.path.abspath(p))
22
+ except Exception:
23
+ pass
24
+ home = os.path.expanduser("~")
25
+ for name in BLOCKED_DIR_NAMES:
26
+ blocked.append(os.path.abspath(os.path.join(home, name)))
27
+ return blocked
28
+
29
+ def get_allowed_roots() -> list:
30
+ raw = os.environ.get("DOCGEN_ALLOWED_ROOTS", "").strip()
31
+ if not raw:
32
+ return []
33
+ return [os.path.abspath(s.strip()) for s in raw.split(",") if s.strip()]
34
+
35
+ def enforce_allowed_roots(resolved: str) -> None:
36
+ roots = get_allowed_roots()
37
+ if not roots:
38
+ return
39
+ norm = os.path.normpath(resolved)
40
+ ok = False
41
+ for r in roots:
42
+ if norm == r or norm.startswith(r + os.sep):
43
+ ok = True
44
+ break
45
+ if not ok:
46
+ raise ValueError(f"Caminho fora de DOCGEN_ALLOWED_ROOTS. Recebido: {resolved}")
47
+
48
+ def validate_path(file_path: str, must_exist: bool) -> str:
49
+ if ".." in file_path:
50
+ raise ValueError(f"Path traversal detectado: {file_path}")
51
+ resolved = os.path.abspath(file_path)
52
+ enforce_allowed_roots(resolved)
53
+ if must_exist and not os.path.exists(resolved):
54
+ raise ValueError(f"Arquivo nao encontrado: {file_path}")
55
+ if must_exist:
56
+ if os.path.isfile(resolved):
57
+ sz = os.path.getsize(resolved)
58
+ if sz > MAX_FILE_SIZE_BYTES:
59
+ raise ValueError(f"Arquivo excede limite de {MAX_FILE_SIZE_BYTES / (1024*1024)}MB: {sz / (1024*1024):.1f}MB")
60
+ return resolved
61
+
62
+ def validate_write_path(file_path: str) -> str:
63
+ resolved = validate_path(file_path, False)
64
+ norm = os.path.normpath(resolved)
65
+ for b in get_blocked_roots():
66
+ nb = os.path.normpath(b)
67
+ if norm == nb or norm.startswith(nb + os.sep):
68
+ raise PermissionError(f"Escrita bloqueada em diretorio protegido: {b}")
69
+ return resolved