使用说明
mcp-go-pdf-tools
Suite en Go para manipular PDFs mediante servidor MCP stdio, API HTTP y CLI. Incluye información, división, compresión, eliminación/extracción de páginas y fusión.
Estado: herramientas MCP, endpoints HTTP y comandos CLI disponibles. Consulta la sección de seguridad para límites y requisitos de despliegue.
Estructura importante
cmd/server: servidor HTTP (endpointsGET /health,POST /api/v1/pdf/split,POST /api/v1/pdf/compress,POST /api/v1/pdf/remove-pages,POST /api/v1/pdf/extract-pages,POST /api/v1/pdf/merge).cmd/mcp-server: servidor stdio MCP con herramientaspdf_split,pdf_info,pdf_compress,pdf_remove_pages,pdf_extract_pages,pdf_merge.cmd/cli: herramienta de linea de comandos con subcomandossplit,remove-pages,extract-pagesymerge.internal/pdf: logica para manipular PDFs (usapdfcpu). Incluye funciones para split, compresion y eliminacion de paginas.examples: cliente de ejemplo para subir un PDF y guardarsplit.zip.mcp: notas y ejemplos para integrar con Claude Desktop.
Funcionalidades
pdf_merge
Combina múltiples PDFs en uno. Soporta dos formatos de request:
Nuevo formato con copias:
{"files":[{"path":"pakinglist.pdf","copies":1},{"path":"albaran.pdf","copies":3}],"output_filename":"combined.pdf"}
Formato legacy (1 copia por archivo):
{"paths":["file1.pdf","file2.pdf"],"output_filename":"combined.pdf"}
pdf_split
Divide un PDF en archivos de una pagina cada uno. Puede crear un ZIP con las paginas.
pdf_info
Devuelve informacion basica del PDF (paginas, tamano).
pdf_compress
Reescribe y optimiza un PDF con pdfcpu. El tamaño final y los cambios de metadatos dependen del documento.
pdf_remove_pages
Elimina o conserva paginas especificas de un PDF. Soporta rangos de paginas con la sintaxis 2,5-8,11.
Dos modos de operacion:
remove(por defecto): elimina las paginas indicadas y conserva el resto.keep: conserva solo las paginas indicadas y elimina el resto.
Ejemplos de seleccion:
"5"— solo la pagina 5"1-3"— paginas 1, 2 y 3"2,5-8,11"— paginas 2, 5, 6, 7, 8 y 11"7-10,61-66,77,80"— paginas 7-10, 61-66, 77 y 80
pdf_extract_pages
Crea un PDF nuevo con solo las paginas del original que elijas (el original no se modifica). Equivale a pdf_remove_pages con mode=keep, pero como herramienta independiente pensada para extraccion. Soporta la misma sintaxis de rangos que pdf_remove_pages; el orden de salida sigue siempre el orden original y las paginas repetidas en la seleccion se ignoran.
Guía de uso para MCP
El servidor MCP stdio opera sobre archivos locales accesibles para el proceso que lo ejecuta; úsalo solo con clientes de confianza y proporciona rutas absolutas.
- Usa
pdf_infopara consultar el total de páginas antes de elegir rangos si no lo conoces. - Usa
pdf_remove_pagespara generar una copia quitando páginas (remove) o conservando solo las seleccionadas (keep). Usapdf_extract_pagespara crear un PDF nuevo y conservar el original. - Los rangos son inclusivos, por ejemplo
1,3-5; los duplicados se ignoran y el resultado conserva el orden original. - Todas las salidas deben ser distintas de las entradas y no existir previamente. El servidor no sobrescribe archivos.
pdf_splitcrea una salida por página. Sinoutput_dir, devuelve las rutas de una carpeta temporal;zip_namees solo un nombre de archivo.zip_b64admite ZIP de hasta 32 MiB.pdf_mergecombina de 2 a 50 PDFs, con un máximo agregado predeterminado de 500 MiB. El límite por PDF es 200 MiB y el de páginas es 10 000 por defecto.pdf_compressoptimiza con pdfcpu; la reducción de tamaño y los cambios de metadatos dependen del documento.
Dependencias clave
github.com/pdfcpu/pdfcpu— usado para manipulacion de PDFs (split, compresion, informacion, eliminacion de paginas).
Quick Start (desarrollo)
Build y run (desarrollo):
cd C:\MCPs\clone\mcp-go-pdf-tools\cmd\server
go run .
Build de todos los binarios:
go build -o bin/server.exe ./cmd/server/
go build -o bin/mcp-server.exe ./cmd/mcp-server/
go build -o bin/cli.exe ./cmd/cli/
Endpoints HTTP
Split
curl -F "file=@test.pdf" http://localhost:8080/api/v1/pdf/split --output split.zip
Compress
curl -F "file=@test.pdf" http://localhost:8080/api/v1/pdf/compress --output compressed.pdf
Ver informacion de compresion en headers:
curl -I -F "file=@test.pdf" http://localhost:8080/api/v1/pdf/compress
# Mostrara X-Original-Size, X-Compressed-Size, X-Reduction-Percent
Remove Pages
Eliminar paginas 2, 5-8 y 11:
curl -F "file=@test.pdf" -F "pages=2,5-8,11" -F "mode=remove" http://localhost:8080/api/v1/pdf/remove-pages --output result.pdf
Conservar solo paginas 1-3 y 10:
curl -F "file=@test.pdf" -F "pages=1-3,10" -F "mode=keep" http://localhost:8080/api/v1/pdf/remove-pages --output result.pdf
Extract Pages
Crear un PDF nuevo solo con las paginas 1, 3 y 10:
curl -F "file=@test.pdf" -F "pages=1,3,10" http://localhost:8080/api/v1/pdf/extract-pages --output seleccion.pdf
CLI
Split
.\bin\cli.exe split -i test.pdf -outdir output
.\bin\cli.exe split -i test.pdf -zip split.zip
Remove Pages
Eliminar paginas 2, 5-8 y 11:
.\bin\cli.exe remove-pages -i test.pdf -o result.pdf -pages "2,5-8,11"
Conservar solo paginas 1, 3 y 5 (eliminar el resto):
.\bin\cli.exe remove-pages -i test.pdf -o result.pdf -pages "1,3,5" -mode keep
Ejemplo real — conservar solo paginas especificas de un libro:
.\bin\cli.exe remove-pages -i libro.pdf -o seleccion.pdf -pages "7-10,61-66,77,80,119-124" -mode keep
Extract Pages
Crear un PDF nuevo solo con las paginas 1, 3 y 5:
.\bin\cli.exe extract-pages -i test.pdf -o seleccion.pdf -pages "1,3,5"
Ejemplo real — extraer paginas especificas de un libro a un PDF nuevo:
.\bin\cli.exe extract-pages -i libro.pdf -o seleccion.pdf -pages "7-10,61-66,77,80,119-124"
Docker
Construir imagen local:
docker build -t mcp-pdf-server:local .
Ejecutar contenedor:
$token = [guid]::NewGuid().ToString("N")
$workDir = (Get-Location).Path
$cert = Join-Path $workDir "certs\server.crt"
$key = Join-Path $workDir "certs\server.key"
docker run --rm -p 8080:8080 -v "${workDir}:/data:ro" -v "${cert}:/run/tls/server.crt:ro" -v "${key}:/run/tls/server.key:ro" -e "HTTP_AUTH_TOKEN=$token" -e HTTP_ALLOWED_DIR=/data -e HTTP_TLS_CERT_FILE=/run/tls/server.crt -e HTTP_TLS_KEY_FILE=/run/tls/server.key mcp-pdf-server:local
Configuracion y seguridad del servidor HTTP
- Por defecto escucha solo en
127.0.0.1. - Para escuchar en una interfaz no local, configura obligatoriamente
HTTP_AUTH_TOKEN,HTTP_ALLOWED_DIR,HTTP_TLS_CERT_FILEyHTTP_TLS_KEY_FILE; las rutas de entrada depdf_mergedeben resolver dentro de ese directorio. HTTP_MAX_UPLOAD_SIZElimita el cuerpo completo de las peticiones;HTTP_MAX_CONCURRENTlimita las solicitudes simultaneas.PDF_MAX_FILE_SIZE(200 MiB por defecto) yPDF_MAX_PAGES(10 000) limitan cada PDF;PDF_MAX_MERGE_SIZE(500 MiB) limita el tamaño agregado de los merges;PDF_TEMP_DIRconfigura los temporales depdf_split.- El MCP stdio tiene acceso al sistema de archivos local del usuario que lo ejecuta; úsalo solo con clientes de confianza. El núcleo PDF rechaza destinos iguales a la entrada o que ya existan.
Tests
Ejecutar tests:
go test ./...
Las pruebas de integración usan PDFs de examples/ cuando están disponibles y se omiten si esos documentos no están presentes en el checkout.
Integracion con Claude Desktop (MCP)
Para integrar con Claude Desktop tienes dos opciones principales:
- stdio (recomendado para Claude Desktop): ejecutar un proceso
mcp-server.exeque hable porstdin/stdoutcon Claude Desktop. Esto es lo que Claude espera para registrar herramientas automaticamente. - HTTP (alternativa): ejecutar el servidor HTTP y usar un adaptador desde Claude (menos directo).
Ejemplo de fragmento para pegar en claude_desktop_config.json (Windows):
{
"mcpServers": {
"pdftools": {
"command": "C:\\MCPs\\clone\\mcp-go-pdf-tools\\bin\\mcp-server.exe",
"args": [],
"env": {}
}
}
}
Herramientas disponibles via MCP: pdf_split, pdf_info, pdf_compress, pdf_remove_pages, pdf_extract_pages, pdf_merge.
Integración con OpenCode
El servidor PDF usa MCP por stdio, compatible con OpenCode. Desde la raíz del repositorio, compila el ejecutable:
New-Item -ItemType Directory -Force bin | Out-Null
go build -o bin/mcp-server.exe ./cmd/mcp-server
Añade esta entrada a tu opencode.json global o al del proyecto. Si ya tienes un objeto mcp, incorpora solo la entrada pdf-tools sin reemplazar las demás:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"pdf-tools": {
"type": "local",
"command": ["C:\\MCPs\\clone\\mcp-go-pdf-tools\\bin\\mcp-server.exe"],
"enabled": true
}
}
}
Ajusta command para que apunte a la ruta real del ejecutable. Reinicia OpenCode y comprueba la conexión con:
opencode mcp list
Las herramientas pdf_info, pdf_split, pdf_compress, pdf_remove_pages, pdf_extract_pages y pdf_merge estarán disponibles para el modelo. Para más opciones, consulta la documentación de servidores MCP de OpenCode.
Ejemplos de uso MCP (stdio)
Ejemplo de llamada a pdf_remove_pages con PowerShell (modo keep):
'{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"pdf_remove_pages","arguments":{"pdf_path":"C:\\\\tmp\\\\libro.pdf","output_path":"C:\\\\tmp\\\\seleccion.pdf","pages":"7-10,61-66,77,80","mode":"keep"}}}' | .\bin\mcp-server.exe
Ejemplo de llamada a pdf_extract_pages (crea un PDF nuevo con solo esas paginas):
'{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"pdf_extract_pages","arguments":{"pdf_path":"C:\\\\tmp\\\\libro.pdf","output_path":"C:\\\\tmp\\\\seleccion.pdf","pages":"7-10,61-66,77,80"}}}' | .\bin\mcp-server.exe
Ejemplo de llamada a pdf_compress:
'{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"pdf_compress","arguments":{"pdf_path":"C:\\\\tmp\\\\test.pdf","output_path":"C:\\\\tmp\\\\test-compressed.pdf"}}}' | .\bin\mcp-server.exe
Respuesta MCP (ejemplo):
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\"original_pages\":357,\"removed_pages\":[1,2,3,...],\"removed_count\":301,\"remaining_pages\":56,\"mode\":\"keep\",\"output_path\":\"C:\\\\tmp\\\\seleccion.pdf\"}"
}
]
}
}
Roadmap y proximos pasos
Ver Roadmap.md en la raiz del repo para ver lo completado y lo pendiente.
Contacto / ayuda
Para reportar issues o solicitar nuevas funcionalidades, abre un issue en el repositorio.
