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.
- docgen_mcp_server-0.1.0/PKG-INFO +154 -0
- docgen_mcp_server-0.1.0/README.md +137 -0
- docgen_mcp_server-0.1.0/config.py +21 -0
- docgen_mcp_server-0.1.0/docgen_mcp_server.egg-info/PKG-INFO +154 -0
- docgen_mcp_server-0.1.0/docgen_mcp_server.egg-info/SOURCES.txt +12 -0
- docgen_mcp_server-0.1.0/docgen_mcp_server.egg-info/dependency_links.txt +1 -0
- docgen_mcp_server-0.1.0/docgen_mcp_server.egg-info/entry_points.txt +2 -0
- docgen_mcp_server-0.1.0/docgen_mcp_server.egg-info/requires.txt +10 -0
- docgen_mcp_server-0.1.0/docgen_mcp_server.egg-info/top_level.txt +4 -0
- docgen_mcp_server-0.1.0/pyproject.toml +28 -0
- docgen_mcp_server-0.1.0/security.py +69 -0
- docgen_mcp_server-0.1.0/server.py +187 -0
- docgen_mcp_server-0.1.0/services.py +925 -0
- docgen_mcp_server-0.1.0/setup.cfg +4 -0
|
@@ -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 @@
|
|
|
1
|
+
|
|
@@ -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
|