Doc Ingestor — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Doc Ingestor (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP (Model Context Protocol) server that provides intelligent document ingestion capabilities using the Docling toolkit. Convert any document (PDF, DOCX, images, HTML, etc.) into clean Markdown for AI processing and RAG pipelines.
git clone <repository-url>
cd doc-ingestor-mcp
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt# Core Docling with MLX acceleration for Apple Silicon
pip install docling
# For MLX support (Apple Silicon only):
pip install docling[mlx]
# Optional: additional OCR engines
pip install easyocr
# Install tesseract via homebrew: brew install tesseractpython -m doc_ingestor_mcpThe server will start and listen for MCP connections using stdio transport.
The server provides the following MCP tools:
convert_documentConverts any supported document to Markdown.
Parameters:
source (required): File path or URL to the documentpipeline (optional): Processing pipeline - "standard", "vlm", or "asr"options (optional): Additional processing optionsExample:
{
"name": "convert_document",
"arguments": {
"source": "https://arxiv.org/pdf/2408.09869",
"pipeline": "standard"
}
}Response:
{
"content": [
{
"type": "text",
"text": "# Document Title\n\nConverted markdown content here..."
}
]
}convert_document_advancedAdvanced conversion with detailed configuration options.
Parameters:
source (required): File path or URLpipeline (optional): "standard", "vlm", "asr"ocr_enabled (optional): Enable/disable OCR (default: auto-detect)ocr_language (optional): OCR language codes (e.g., "eng,spa")table_mode (optional): "fast" or "accurate"pdf_backend (optional): "dlparse_v4" or "pypdfium2"enable_enrichments (optional): Enable code/formula/picture enrichmentsExample:
{
"name": "convert_document_advanced",
"arguments": {
"source": "./scanned-document.pdf",
"pipeline": "standard",
"ocr_enabled": true,
"ocr_language": "eng",
"table_mode": "accurate"
}
}get_processing_statusCheck the status of ongoing conversions (useful for large files).
Parameters:
job_id (required): Job identifier returned from conversion requestslist_supported_formatsReturns all supported input and output formats.
Response:
{
"input_formats": ["pdf", "docx", "xlsx", "pptx", "png", "jpeg", "html", "md", "csv", "mp3", "wav"],
"output_formats": ["markdown", "html", "json", "text", "doctags"],
"pipelines": ["standard", "vlm", "asr"]
}{
"name": "convert_document",
"arguments": {
"source": "./research-paper.pdf"
}
}{
"name": "convert_document",
"arguments": {
"source": "https://example.com/complex-document.pdf",
"pipeline": "vlm"
}
}{
"name": "convert_document",
"arguments": {
"source": "./meeting-recording.mp3",
"pipeline": "asr"
}
}{
"name": "convert_document_advanced",
"arguments": {
"source": "./scanned-invoice.pdf",
"ocr_enabled": true,
"ocr_language": "eng",
"table_mode": "accurate"
}
}The server automatically selects optimal settings:
# Environment variables for optimization
export DOCLING_MAX_MEMORY_GB=6 # Limit memory usage
export DOCLING_QUEUE_SIZE=3 # Max concurrent jobs
export DOCLING_ENABLE_MLX=true # Enable MLX acceleration{
"error": {
"type": "ConversionError",
"message": "Failed to process document",
"details": "Specific error information",
"suggestions": ["Try VLM pipeline", "Enable OCR"]
}
}| Issue | Cause | Solution |
|---|---|---|
| Memory error with large PDF | Insufficient RAM | Split document or reduce queue size |
| Poor OCR quality | Wrong language/engine | Specify language with ocr_language |
| Scrambled text order | PDF parsing issues | Try "pdf_backend": "pypdfium2" |
| Tables not detected | Layout complexity | Use "table_mode": "accurate" |
| Slow processing | Large/complex document | Try "pipeline": "standard" first |
Add this to your Claude Desktop configuration file (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"doc-ingestor": {
"command": "python",
"args": ["-m", "doc_ingestor_mcp"],
"cwd": "/path/to/doc-ingestor-mcp"
}
}
}# Start the server in debug mode
python -m doc_ingestor_mcp --debug
# In another terminal, test with a sample file
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "convert_document", "arguments": {"source": "test.pdf"}}}' | python -m doc_ingestor_mcp# Test with different pipelines
python test_server.pyCreate test_server.py:
import asyncio
import json
from doc_ingestor_mcp.server import DocIngestorMCPServer
from doc_ingestor_mcp.config import load_config
async def test_conversion():
config = load_config("config.yaml")
server = DocIngestorMCPServer(config)
# Test basic conversion
result = await server._handle_convert_document({
"source": "https://arxiv.org/pdf/2408.09869",
"pipeline": "standard"
})
print("Conversion successful!")
print(f"Output length: {len(result[0].text)} characters")
if __name__ == "__main__":
asyncio.run(test_conversion())python -m doc_ingestor_mcp --debugtail -f ./logs/server.logpython test_server.py"ModuleNotFoundError: No module named 'docling'"
pip install docling"MLX not available" warnings
"Queue is full" errors
max_queue_size in config.yaml"Download failed" for URLs
Memory errors with large files
max_memory_gb in config.yamlpipeline: "standard" instead of vlmOCR not working
brew install tesseractpip install easyocrMIT License - see LICENSE file for details.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.