Skip to main content
Glama
koraynar

doc-extract-mcp

by koraynar

doc-extract-mcp

Un servidor MCP (Model Context Protocol) que proporciona a un LLM herramientas deterministas para trabajar con documentos en flujos de extracción de datos estructurados. El LLM hace la lectura y el razonamiento de extracción; este servidor proporciona las partes que nunca deberían delegarse en un modelo de lenguaje: acceso fiable a archivos, análisis sintáctico, fragmentación en chunks, validación de JSON Schema y salida de archivos protegida.

Construido por Koray Nar como un proyecto de portafolio para los flujos de trabajo de automatización documental con IA que está desarrollando. El caso de uso objetivo es convertir PDFs desordenados (órdenes de compra, facturas, informes) en JSON validado contra esquema. Publicado como parte de un portafolio público. Se integra con Claude Code y Claude Desktop, y con cualquier otro cliente MCP.

Por qué

Un agente de extracción falla en lugares predecibles: alucina contenidos de archivos, pierde la pista de documentos largos, produce silenciosamente JSON que casi coincide con el esquema objetivo y escribe la salida donde le parece. Este servidor elimina estos modos de fallo:

  • El acceso a archivos está confinado a una única raíz permitida (DOC_EXTRACT_ROOT).

  • El texto de los PDF llega con marcadores explícitos --- page N ---, de modo que las citas de «page 3» significan página 3.

  • Los documentos largos se dividen en chunks de forma determinista, con solapamiento y pistas de página.

  • El JSON extraído se valida contra un JSON Schema (Draft 2020-12) y se notifican todos los errores con su ruta JSON Pointer — no solo el primero — para que el modelo pueda corregir todos los fallos en una sola pasada.

  • La salida la escribe el servidor (JSON o CSV), dentro de la misma raíz, con un recuento verificable de filas y bytes.

Related MCP server: BigContext MCP

Herramientas

Herramienta

Argumentos

Qué hace

list_documents

directory, glob_pattern='*'

Lista los archivos de un directorio dentro de la raíz permitida, con tamaño y hora de modificación. Admite globs recursivos como **/*.pdf. Los patrones deben ser relativos y no contener ..; las coincidencias que se resuelven fuera de la raíz se descartan.

read_document

path, pages=''

Devuelve el texto de un documento. .pdf mediante pypdf con marcadores --- page N --- y selección opcional de páginas con índice empezando en 1 ('3', '1-5', '1-3,7'); .txt/.md/.json se leen directamente; .csv se muestra como una tabla de texto alineada. Error claro para tipos no admitidos.

document_info

path

Metadatos sin el contenido completo: tipo, tamaño, hora de modificación; número de páginas y metadatos PDF para PDFs; número de líneas para archivos de texto.

chunk_document

path, max_chars=4000, overlap=200

Divide un documento en chunks ordenados y solapados, cada uno con un índice, un desplazamiento inicial y (para PDFs) una pista de página.

validate_json

data, json_schema

Valida una cadena JSON contra un JSON Schema (Draft 2020-12). Devuelve todos los errores de validación con una ruta JSON Pointer mediante Draft202012Validator.iter_errors.

save_structured

path, data, format='json'|'csv'

Escribe los datos extraídos dentro de la raíz permitida. CSV espera un array JSON de objetos planos. Devuelve la ruta escrita, el número de filas y el número de bytes.

Todos los argumentos de ruta se resuelven y se rechazan si se salen de la raíz permitida (protección contra path traversal). El argumento glob_pattern está confinado de la misma manera: se rechazan los patrones absolutos y los que contienen .., y cualquier coincidencia que se resuelva fuera de la raíz (por ejemplo mediante un symlink) se descarta silenciosamente del listado. Los fallos de protección se lanzan como errores de herramienta MCP, de modo que el modelo que llama de la llamada vea el motivo real y no un error genérico enmascarado.

Inicio rápido

Requiere Python 3.11+ y uv.

git clone https://github.com/koraynar/doc-extract-mcp.git
cd doc-extract-mcp
uv venv
uv pip install -e .

Ejecución independiente (transporte stdio):

DOC_EXTRACT_ROOT=/path/to/your/documents uv run doc-extract-mcp

Claude Code

claude mcp add doc-extract --env DOC_EXTRACT_ROOT=/path/to/your/documents \
  -- uv run --directory /absolute/path/to/doc-extract-mcp doc-extract-mcp

Claude Desktop

Añade a claude_desktop_config.json:

{
  "mcpServers": {
    "doc-extract": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/absolute/path/to/doc-extract-mcp",
        "doc-extract-mcp"
      ],
      "env": {
        "DOC_EXTRACT_ROOT": "/path/to/your/documents"
      }
    }
  }
}

DOC_EXTRACT_ROOT adopta el directorio de trabajo del servidor si no se define. Pero debe apuntar a la carpeta donde están tus documentos; nada fuera de ella se puede leer ni escribir.

Flujo de trabajo típico

  1. list_documents("", "*.pdf") — encuentra las facturas.

  2. document_info("invoice.pdf") — comprueba el número de páginas.

  3. read_document("invoice.pdf", "1-3") or chunk_document(...) — obtén el texto.

  4. El LLM extrae los campos a JSON.

  5. validate_json(data, json_schema) — corrige todos los errores notificados y vuelve a validar.

  6. save_structured("out/invoice.json", data, "json") — escribe el resultado exacto.

Limitaciones (honestas)

  • Solo PDFs con una plantilla de texto. La extracción usa pypdf; los PDF escaneados o solo de imagen devuelven texto vacío. No hay OCR.

  • La calidad de extracción varía con la forma de balancear el PDF. Los resúmenes complejos (multiples columnas, tablas pesadas) pueden tener un orden de lectura no perfecto: se hereda de pypdf.

  • No hay soporte para .docx/.xlsx. Son compatibles .pdf, .txt, .md, .csv, .json.

  • El servidor no hace razonamiento de extracción. No va a encontrar el total de tu factura; solo se asegura de que el modelo que lo haga trabaje con texto real y que el resultado coincida con tu esquema.

  • Es una herramienta funcional, pensada para el trabajo de automatización con IA que estoy montando, y publicada como parte de mi portafolio — es nueva y todavía no tiene recorrido en producción. Tiene lituratura de pruebas y una baruna de confinamiento de rutas, pero no ha sido endurecida más allá de eso — revísala antes de poner directorios sensibles.

Desarrollo

uv venv
uv pip install -e '.[dev]'
uv run pytest

El suite de pruebas construye en memoria un fixture PDF de dos páginas (aparato PDF mínimo construido a mano, sin dependencias extra) y cubre las seis herramientas, la protección de path traversal, el confinamiento del glob pattern (incluidos los escapes via symlink), los rangos de página, la validación de esquema con múltiples errores, un round-trip de CSV, y el registro de herramientas y la propagación de errores a través del archivo objeto del servidor MCP.

Licencia

MIT © 2026 Kurt Langer

A
license - permissive license
A
quality
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables working with large documents of any size by intelligently segmenting them and using TF-IDF search to retrieve only relevant fragments, preventing context window saturation. Provides 31 domain-agnostic tools for document ingestion, semantic analysis, epistemological validation, and extraction verification across formats like PDF, EPUB, and HTML.
    31
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides AI agents with comprehensive document parsing capabilities including PDF text extraction, OCR, HTML-to-markdown conversion, table extraction, and summarization, optimized for agent workflows.
    101
    MIT

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/koraynar/doc-extract-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server