EEager/pdf-mcp-server
If you are the rightful owner of pdf-mcp-server and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
A practical PDF parsing tool wrapped as an MCP (Model Context Protocol) server for Cursor IDE integration.
PDF MCP 서버
|
PDF 파싱 도구를 MCP(Model Context Protocol) 서버로 래핑해서 Cursor IDE와 연동하는 실용적인 프로젝트입니다.
✅아키텍처 개요

PDF MCP 서버는 MCP 프로토콜을 통해 Cursor IDE와 PDF 파일 사이의 다리 역할을 합니다.
✅왜 만들었나?
Cursor IDE의 AI는 기본적으로 PDF 파일을 읽지 못합니다. 문서나 논문, PDF 자료를 분석하려고 할 때마다 답답했죠. 이 MCP 서버가 그 문제를 해결해줍니다.
현실적 고백: 혁신적인 건 아닙니다. 기존 PDF 파싱 라이브러리를 MCP 인터페이스로 감싼 것뿐이에요. 하지만 때로는 가장 실용적인 해결책이 가장 지루한 해결책이기도 하죠.
✅현재 상태
🔧완성된 것들:
- McpServer API 기반 MCP 서버 구조
- pdf-parse 라이브러리를 이용한 PDF 텍스트 추출
- PDF 메타데이터 추출
- PDF 파일 검증 기능
- 페이지별 텍스트 추출 (범위 지정, 특정 페이지 선택)
- 완전한 테스트 스위트 (8/8 테스트 통과)
- TypeScript 빌드 시스템
- Docker 기반 개발 환경
- Cursor IDE 연동 완료 및 실제 동작 확인
🔧 다음 단계:
- 표 데이터 추출
- 이미지 추출
- GitHub Actions CI/CD 설정
✅기능
현재 구현된 기능
- extract_pdf_text: PDF 파일에서 전체 텍스트 추출 (크기 제한: 100KB)
- extract_pdf_pages: PDF 특정 페이지 또는 페이지 범위 텍스트 추출 (크기 제한: 200KB)
- get_pdf_metadata: PDF 메타데이터 추출 (제목, 작성자, 생성일 등 + 텍스트 미리보기 200자)
- validate_pdf: PDF 파일 형식 및 크기 제한 검증
✅기술 스택
- TypeScript - 래퍼 프로젝트라도 타입 안정성은 중요하니까
- pdf-parse - 검증된 PDF 파싱 라이브러리
- @modelcontextprotocol/sdk v1.15.1 - 최신 MCP SDK
- zod - MCP 도구 스키마 검증
- Jest - 테스트 프레임워크
- Docker - 크로스 플랫폼 개발 환경
✅설치
필수 요구사항
- Docker Desktop (WSL 통합 활성화)
- Cursor IDE
개발 환경 설정
- 리포지토리 클론:
git clone https://github.com/EEager/pdf-mcp-server.git
cd pdf-mcp-server
- 의존성 설치:
docker run -it --rm -v ~/workspace/pdf-mcp-server:/app -w /app node:20 npm install
- 프로젝트 빌드:
docker run --rm -v ~/workspace/pdf-mcp-server:/app -w /app node:20 npx tsc
- 프로젝트 테스트(선택사항):
# 실행해보고 docker ps -a에서 잘 돌아가는지 확인하세요
docker run -it --rm -v ~/workspace/pdf-mcp-server:/app -w /app node:20 node dist/index.js
✅Cursor IDE 설정
[Cursor Settings] - [Tools & Integrations] - [Add Custom MCP] 를 통해 mcp.json 설정 파일을 수정할 수 있습니다.
중요: 파일 접근 권한 설정
PDF MCP 서버는 Docker 볼륨 마운트를 통해 파일에 접근합니다. 마운트된 디렉토리의 파일만 읽을 수 있습니다.
Cursor MCP 설정 파일(~/.cursor/mcp.json 또는 ~/.config/cursor/mcp.json)에 추가:
(설정파일은 cursor update 상황에 따라 바뀔 수 있슴둥)
{
"mcpServers": {
"pdf-parser": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
// !본인의 pdf-mcp-server 설치 경로로 수정하세요. 아래의 경우 wsl환경의 workspace 경로입니다.
"-v", "\\\\wsl$\\Ubuntu\\home\\eager\\workspace\\pdf-mcp-server:/app",
// !PDF 파일들이 저장된 폴더 경로로 수정하세요. 아래의 경우 cursor_mcp_dir 폴더 밑에 pdf 파일들이 존재합니다.
"-v", "D:\\cursor_mcp_dir:/workspace",
"-w", "/app",
"node:20",
"node",
"dist/index.js"
]
}
}
}
설정 설명:
\\\\wsl$\\Ubuntu\\home\\eager\\workspace\\pdf-mcp-server:/app: MCP 서버 코드 마운트D:\\cursor_mcp_dir:/workspace: PDF 파일이 있는 디렉토리 마운트 (필수!)- PDF 파일은
/workspace/경로로만 접근 가능
⚠️ 중요: D:\\cursor_mcp_dir를 실제 PDF 파일들이 있는 Windows 디렉토리로 변경하세요.
실행 중인 MCP 서버 확인
Cursor IDE는 자동으로 Docker 컨테이너를 실행합니다:
# 실행 중인 컨테이너 확인
docker ps
# 예시 출력:
# CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
# abc123def456 node:20 "node dist/index.js" 2 minutes ago Up 2 minutes suspicious_turing
✅cursor IDE에서 정상적으로 mcp등록이 된 경우
mcp.json를 저장한 후, 바로 mcp 등록이 된것을 확인할 수 있습니다.

✅사용법
설정이 완료되면 Cursor IDE에서 다음과 같이 사용할 수 있습니다:
1. PDF 전체 텍스트 추출 (extract_pdf_text)
사용자: "/workspace/document.pdf 파일의 내용을 읽어줄 수 있어?"
응답: PDF 파일에서 추출된 전체 텍스트(최대 100KB)와 페이지 수, 기본 메타데이터가 함께 제공됩니다.
큰 파일은 자동으로 잘림 처리됩니다.
2. PDF 페이지별 텍스트 추출 (extract_pdf_pages) ⭐ 신기능
사용자: "/workspace/document.pdf 파일의 5-10페이지만 읽어줄 수 있어?"
또는: "/workspace/document.pdf 파일의 1, 3, 5페이지만 추출해줘"
응답: 지정된 페이지들의 텍스트(최대 200KB)가 페이지별로 구분되어 제공됩니다.
페이지별 추출 옵션:
- 페이지 범위:
startPage: 5, endPage: 10(5-10페이지) - 특정 페이지:
pageNumbers: [1, 3, 5, 7](1, 3, 5, 7페이지) - 시작 페이지부터:
startPage: 10(10페이지부터 끝까지)
3. PDF 메타데이터 확인 (get_pdf_metadata)
사용자: "/workspace/document.pdf 파일의 메타데이터가 뭐야?"
응답: 제목, 작성자, 생성일, 수정일, 페이지 수와 텍스트 미리보기(200자)가 제공됩니다.
4. PDF 파일 검증 (validate_pdf)
사용자: "/workspace/document.pdf 파일이 유효한 PDF인가?"
응답: 파일 형식, 크기 제한, 접근 가능성을 확인한 검증 결과가 제공됩니다.
MCP 도구 목록
서버가 제공하는 MCP 도구들:
| 도구명 | 설명 | 입력 파라미터 | 출력 |
|---|---|---|---|
extract_pdf_text | PDF 전체 텍스트 추출 | filePath: string | 텍스트, 페이지수, 메타데이터 |
extract_pdf_pages | 특정 페이지 텍스트 추출 | filePath, startPage?, endPage?, pageNumbers? | 페이지별 텍스트, 추출된 페이지 목록 |
get_pdf_metadata | 메타데이터 추출 | filePath: string | 제목, 작성자, 생성일 등 |
validate_pdf | PDF 검증 | filePath: string | 유효성 여부, 오류 메시지 |
✅실제 시험 결과
예시: 962페이지 딥러닝 교재 분석
1. validate_pdf
입력:
{
"filePath": "/workspace/01_study/ai_ml/pytorch_deep_learning_Intro.pdf"
}
결과:
{
"isValid": true,
"filePath": "/workspace/01_study/ai_ml/pytorch_deep_learning_Intro.pdf",
"message": "PDF file is valid"
}
2. get_pdf_metadata
입력:
{
"filePath": "/workspace/01_study/ai_ml/pytorch_deep_learning_Intro.pdf"
}
결과:
{
"text": "Contents\n문서정보1\n00. 입문자들을위한조언(Q&A)2\n00.교육문의8\n00.\n유료\nE‑book\n안내\n9\n00.책과저자소개하기10\n01. [기초] ‑딥러닝을시작하기전에11\n01‑01코랩(Colab)과아나콘다12\n1.아나콘다(Anaconda)설치...",
"pageCount": 962,
"title": "딥 러닝 파이토치 교과서 - 입문부터 파인튜닝까지",
"author": "이 책은 ...님이 구매하신 전자책입니다.",
"creator": "WikiDocs",
"producer": "xdvipdfmx (20210609)",
"creationDate": "D:20250521134136+09'00'"
}
3. extract_pdf_text
입력:
{
"filePath": "/workspace/01_study/ai_ml/pytorch_deep_learning_Intro.pdf"
}
결과:
{
"text": "Contents\n문서정보1\n00. 입문자들을위한조언(Q&A)2...[100KB 제한으로 잘림]",
"pageCount": 962,
"metadata": { "title": "딥 러닝 파이토치 교과서...", "author": "..." },
"truncated": true,
"originalLength": 868068
}
4. extract_pdf_pages (신기능!) ⭐
입력 - 특정 챕터 읽기:
{
"filePath": "/workspace/01_study/ai_ml/pytorch_deep_learning_Intro.pdf",
"startPage": 50,
"endPage": 60
}
입력 - 특정 페이지들만:
{
"filePath": "/workspace/01_study/ai_ml/pytorch_deep_learning_Intro.pdf",
"pageNumbers": [1, 5, 10, 100]
}
결과:
{
"text": "--- 페이지 50 ---\n파이토치 기초 설명...\n\n--- 페이지 51 ---\n텐서 연산에 대한 내용...\n\n--- 페이지 52 ---\n...",
"pageCount": 962,
"extractedPages": [50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60],
"metadata": { "title": "딥 러닝 파이토치 교과서...", "author": "..." },
"truncated": false,
"originalLength": 15420
}
Cursor IDE의 채팅에서 MCP 도구 사용 결과

✅개발
프로젝트 구조
pdf-mcp-server/
├── src/
│ ├── index.ts # MCP 서버 진입점
│ ├── pdf-parser.ts # PDF 파싱 로직
│ └── types.ts # TypeScript 타입 정의
├── tests/
│ └── pdf-parser.test.ts # Jest 테스트 스위트
├── docs/
│ └── images/ # 문서 이미지
├── dist/ # 빌드 결과물
├── package.json
├── tsconfig.json
└── README.md
개발 스크립트
# 빌드 (필수)
docker run --rm -v ~/workspace/pdf-mcp-server:/app -w /app node:20 npx tsc
# 테스트
docker run -it --rm -v ~/workspace/pdf-mcp-server:/app -w /app node:20 npm test
# 서버 실행 테스트 (선택사항 - Cursor가 자동으로 실행함)
docker run -it --rm -v ~/workspace/pdf-mcp-server:/app -w /app node:20 node dist/index.js
참고: Cursor IDE가 MCP 서버를 자동으로 Docker 컨테이너로 실행하므로, 개발 시에는 빌드만 하면 됩니다.
디버깅 및 로그 확인
Docker 컨테이너 로그 확인
# 실행 중인 컨테이너 확인
docker ps
# 컨테이너 로그 확인 (컨테이너 이름으로)
docker logs <CONTAINER_NAME>
# 실시간 로그 확인
docker logs -f <CONTAINER_NAME>
예시 로그 출력
{"result":{"content":[{"type":"text","text":"{\n \"isValid\": true,\n \"filePath\": \"/workspace/01_study/ai_ml/pytorch_deep_learning_Intro.pdf\",\n \"message\": \"PDF file is valid\"\n}"}]},"jsonrpc":"2.0","id":16}
MCP Inspector로 테스트
# MCP 서버 기능 테스트
cd ~/workspace/pdf-mcp-server
npx @modelcontextprotocol/inspector node dist/index.js
✅구현 노트
해결된 환경 문제들
- WSL/Windows 경로 충돌: Docker 컨테이너화로 해결
- npm 권한 문제: Docker 격리로 파일 시스템 충돌 방지
- MCP SDK 버전 불일치: 존재하지 않는 0.2.0에서 최신 1.15.1로 업데이트
- API 변경: 레거시 Server에서 새로운 McpServer API로 마이그레이션
- 대용량 텍스트 처리: Cursor IDE 터짐 방지를 위한 텍스트 크기 제한
- 날짜 타입 오류: 안전한 날짜 변환 함수로 해결
아키텍처 결정사항
- 모듈러 설계: PDF 파싱 로직과 MCP 서버 로직 분리
- 포괄적 테스트: 목킹된 의존성으로 완전한 테스트 커버리지
- 타입 안전성: zod 검증과 함께 엄격한 TypeScript 설정
- 에러 핸들링: 파일 작업과 PDF 파싱에 대한 우아한 에러 처리
- 성능 최적화: 텍스트 크기 제한으로 클라이언트 안정성 확보
- 페이지별 처리: pdf-parse의 pagerender 콜백으로 페이지 단위 텍스트 추출
✅문제 해결
일반적인 문제들
PDF 파일을 읽을 수 없음:
- Docker 볼륨 마운트 설정 확인:
"D:\\your_pdf_dir:/workspace" - 파일 경로가
/workspace/로 시작하는지 확인 - Docker Desktop WSL 통합이 활성화되어 있는지 확인
MCP 서버 연결 실패:
- Docker Desktop이 실행 중인지 확인
- Cursor MCP 설정 파일 경로가 올바른지 확인
- Cursor IDE 재시작
빌드 오류:
- WSL에서 빌드:
docker run --rm -v ~/workspace/pdf-mcp-server:/app -w /app node:20 npx tsc - 의존성 재설치:
docker run -it --rm -v ~/workspace/pdf-mcp-server:/app -w /app node:20 npm install
제한사항
- 파일 접근: Docker 볼륨 마운트된 디렉토리의 파일만 접근 가능
- 파일 크기: 큰 PDF(100MB 이상)는 성능상 이유로 거부됨
- 텍스트 크기: 전체 텍스트는 100KB, 페이지별 텍스트는 200KB로 제한 (Cursor IDE 안정성)
- 메타데이터: 텍스트 미리보기는 200자로 제한
- 복잡한 레이아웃: 표나 다단 레이아웃은 완벽하게 파싱되지 않을 수 있음
- 스캔된 PDF: OCR 지원은 계획 중이지만 아직 미구현
라이선스
MIT 라이선스 - 공유가 배려니까, 그리고 어차피 래퍼일 뿐이니까.
감사의 말
- pdf-parse - 실제 PDF 파싱의 무거운 작업을 담당
- MCP Protocol - 이런 연동을 가능하게 해준
- Cursor IDE - 확장할 가치가 있는 IDE를 만들어준
- Docker 커뮤니티 - 환경 호환성 악몽을 해결해준