iflow-mcp_labeveryday_mcp_pdf_reader 0.1.1
MCP server for reading PDFs with text extraction, image extraction, and OCR
License: MIT
Requires Python: >=3.11
Keywords: fastmcp, mcp, ocr, pdf, text-extraction

# MCP PDF Reader Server (Python + FastMCP)

A powerful Model Context Protocol (MCP) server built with FastMCP that provides comprehensive PDF processing capabilities including text extraction, image extraction, and OCR for reading text within images.

## Features

- **Text Extraction**: Extract text content from PDF pages
- **Image Extraction**: Extract all images from PDF files
- **OCR Capabilities**: Read text from images using Tesseract OCR
- **Comprehensive Analysis**: Get detailed PDF structure and metadata
- **Page Range Support**: Process specific page ranges
- **Multiple Languages**: OCR support for multiple languages

## Prerequisites

### System Dependencies

#### Tesseract OCR
You need to install Tesseract OCR on your system:

**Ubuntu/Debian:**
```bash
sudo apt update
sudo apt install tesseract-ocr tesseract-ocr-eng
```

**macOS:**
```bash
brew install tesseract
```

**Windows:**
1. Download from: https://github.com/UB-Mannheim/tesseract/wiki
2. Install and add to PATH
3. Or use: `conda install -c conda-forge tesseract`

#### Additional Language Packs (Optional)
```bash
# For multiple languages
sudo apt install tesseract-ocr-fra tesseract-ocr-deu tesseract-ocr-spa
```

## Installation

### Quick Start with UV

1. **Install UV (if not already installed):**
```bash
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
```

2. **Clone/Create the project:**
```bash
mkdir mcp-pdf-reader-server
cd mcp-pdf-reader-server
```

3. **Initialize and install with UV:**
```bash
# Copy the files (pdf_reader_server.py and pyproject.toml)
# Then install dependencies
uv sync
```

4. **Verify installation:**
```bash
uv run python -c "import pytesseract; print(pytesseract.get_tesseract_version())"
```

### Alternative: Manual Setup

If you prefer traditional setup:

1. **Create virtual environment:**
```bash
python -m venv .venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate
```

2. **Install dependencies:**
```bash
pip install fastmcp PyMuPDF pytesseract Pillow
```

## Usage

### Running the Server

With UV:
```bash
uv run python pdf_reader_server.py
```

Or if you have the environment activated:
```bash
python pdf_reader_server.py
```

The server will start and listen for MCP requests on stdin/stdout.

### Available Tools

#### 1. `read_pdf_text`
Extract text content from PDF pages.

**Parameters:**
- `file_path` (string, required): Path to the PDF file
- `page_range` (object, optional): Dict with `start` and `end` page numbers

**Example:**
```json
{
  "file_path": "/path/to/document.pdf",
  "page_range": {"start": 1, "end": 5}
}
```

#### 2. `extract_pdf_images`
Extract all images from a PDF file.

**Parameters:**
- `file_path` (string, required): Path to the PDF file
- `output_dir` (string, optional): Directory to save images
- `page_range` (object, optional): Page range to process

**Example:**
```json
{
  "file_path": "/path/to/document.pdf",
  "output_dir": "/path/to/images/",
  "page_range": {"start": 1, "end": 3}
}
```

#### 3. `read_pdf_with_ocr`
Extract text from both regular text and images using OCR.

**Parameters:**
- `file_path` (string, required): Path to the PDF file
- `page_range` (object, optional): Page range to process
- `ocr_language` (string, optional): OCR language code (default: "eng")

**Example:**
```json
{
  "file_path": "/path/to/document.pdf",
  "ocr_language": "eng+fra",
  "page_range": {"start": 1, "end": 10}
}
```

**Supported OCR Languages:**
- `eng` - English
- `fra` - French
- `deu` - German
- `spa` - Spanish
- `eng+fra` - Multiple languages

#### 4. `get_pdf_info`
Get comprehensive metadata and statistics about a PDF.

**Parameters:**
- `file_path` (string, required): Path to the PDF file

#### 5. `analyze_pdf_structure`
Analyze the structure and content distribution of a PDF.

**Parameters:**
- `file_path` (string, required): Path to the PDF file

## Configuration with Claude Desktop

### With UV
Add this to your `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "pdf-reader": {
      "command": "uv",
      "args": ["run", "python", "/path/to/your/pdf_reader_server.py"],
      "cwd": "/path/to/your/mcp-pdf-reader-server"
    }
  }
}
```

### With Virtual Environment
```json
{
  "mcpServers": {
    "pdf-reader": {
      "command": "/path/to/your/.venv/bin/python",
      "args": ["/path/to/your/pdf_reader_server.py"]
    }
  }
}
```

### System Python
```json
{
  "mcpServers": {
    "pdf-reader": {
      "command": "python",
      "args": ["/path/to/your/pdf_reader_server.py"],
      "env": {
        "PYTHONPATH": "/path/to/your/.venv/lib/python3.x/site-packages"
      }
    }
  }
}
```

## Example Responses

### Text Extraction Response
```json
{
  "success": true,
  "file_path": "/path/to/document.pdf",
  "pages_processed": "1-3",
  "total_pages": 10,
  "pages_text": [
    {
      "page_number": 1,
      "text": "Page 1 content...",
      "word_count": 125
    }
  ],
  "combined_text": "All text combined...",
  "total_word_count": 1250,
  "total_character_count": 8750
}
```

### OCR Response
```json
{
  "success": true,
  "file_path": "/path/to/document.pdf",
  "pages_processed": "1-2",
  "ocr_language": "eng",
  "pages_data": [
    {
      "page_number": 1,
      "text": "Regular text from PDF...",
      "ocr_text": "Text extracted from images...",
      "images_with_text": [
        {
          "image_index": 1,
          "ocr_text": "Text from image 1",
          "confidence": "high"
        }
      ],
      "combined_text": "Combined text and OCR...",
      "text_word_count": 100,
      "ocr_word_count": 25
    }
  ],
  "summary": {
    "total_text_word_count": 200,
    "total_ocr_word_count": 50,
    "combined_word_count": 250,
    "images_processed": 3
  },
  "all_text_combined": "All extracted text..."
}
```

## Performance Considerations

### OCR Performance
- OCR processing can be slow for large images
- Consider processing smaller page ranges for faster results
- Images smaller than 50x50 pixels are automatically skipped

### Memory Usage
- Large PDFs with many images may consume significant memory
- The server processes pages sequentially to manage memory usage
- Extracted images are saved to disk to reduce memory pressure

### Optimization Tips
1. **Use page ranges** for large documents
2. **Specify output directories** for image extraction to avoid temp file buildup
3. **Choose appropriate OCR languages** to improve accuracy and speed
4. **Preprocess images** if OCR quality is poor (consider adding OpenCV)

## Troubleshooting

### Common Issues

1. **Tesseract not found:**
   ```
   TesseractNotFoundError: tesseract is not installed
   ```
   - Install Tesseract OCR system package
   - Ensure it's in your PATH

2. **Permission errors:**
   - Ensure the Python process has read access to PDF files
   - Ensure write access to output directories

3. **Poor OCR results:**
   - Try different OCR language codes
   - Consider image preprocessing
   - Check if images are high enough resolution

4. **Memory errors:**
   - Process smaller page ranges
   - Close other applications
   - Consider increasing available RAM

### Debug Mode

Run with debug logging using UV:
```bash
PYTHONUNBUFFERED=1 uv run python pdf_reader_server.py
```

Or with regular Python:
```bash
PYTHONUNBUFFERED=1 python pdf_reader_server.py
```

### Testing OCR
Test Tesseract directly:
```bash
tesseract --list-langs
tesseract image.png output.txt
```

## Dependencies

- **fastmcp**: Modern MCP server framework
- **PyMuPDF**: Fast PDF processing and rendering
- **pytesseract**: Python wrapper for Tesseract OCR
- **Pillow**: Image processing library
- **tesseract-ocr**: System OCR engine

## Advanced Features

### Custom OCR Configuration
You can modify the OCR configuration in the code:
```python
ocr_text = pytesseract.image_to_string(
    pil_image, 
    lang=ocr_language,
    config='--psm 6 -c tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz '
)
```

### Image Preprocessing
For better OCR results, consider adding image preprocessing:
```python
# Add to requirements: opencv-python, numpy
import cv2
import numpy as np

# Preprocessing example
def preprocess_image(image):
    gray = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2GRAY)
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
    return Image.fromarray(thresh)
```

## Contributing

1. Fork the repository
2. Create a feature branch
3. Add tests for new functionality
4. Submit a pull request

## License

MIT License - see LICENSE file for details.