项目简介
这是一个实现了Model Context Protocol (MCP) 的服务器,专注于提供安全、灵活的PDF文件读取和内容提取能力。它允许MCP客户端(如AI代理)通过JSON-RPC请求,方便地访问项目目录内的本地PDF文件或通过URL访问远程PDF,提取文本、元数据和页数。
主要功能点
- 读取PDF全文: 提取PDF文件的全部文本内容。
- 读取指定页面文本: 仅提取PDF中特定页面或页码范围的文本。
- 获取PDF元数据: 提取PDF的作者、标题、创建日期等信息。
- 获取PDF页数: 获取PDF文件的总页码。
- 支持多来源处理: 可在单个请求中处理一个或多个本地文件或URL来源的PDF。
- 安全的文件访问: 对本地文件访问严格限制在服务器启动时指定的项目根目录内,防止路径穿越。
- 结构化输出: 将提取的数据以统一的JSON格式返回,便于AI代理解析和使用。
- 易于部署: 提供NPM包和Docker镜像两种便捷的安装和运行方式。
安装步骤
该MCP服务器主要通过NPM包或Docker镜像的方式进行安装和使用,通常作为另一个MCP主机环境的依赖或服务运行。
-
使用 npm (推荐):
- 在您的MCP主机环境或项目目录中,通过 npm 或 pnpm 安装软件包:
pnpm add @sylphlab/pdf-reader-mcp # 或 npm install / yarn add
- 在您的MCP主机环境或项目目录中,通过 npm 或 pnpm 安装软件包:
-
使用 Docker:
- 直接从 Docker Hub 拉取镜像:
docker pull sylphlab/pdf-reader-mcp:latest
- 直接从 Docker Hub 拉取镜像:
服务器配置
要让您的MCP客户端或MCP主机环境使用此PDF阅读器服务器,您需要在客户端或主机的配置文件中添加该服务器的配置信息。配置通常采用JSON格式,包含服务器的名称、启动命令及其参数。
以下是配置时所需的主要信息说明:
- '"pdf-reader-mcp"': 您为该服务器指定的标识名称,可自定义。
- '"name"': 在客户端界面中显示的服务器名称(例如:"PDF Reader (npx)" 或 "PDF Reader (Docker)")。
- '"command"': 启动服务器进程的命令(例如:"npx" 或 "docker")。
- '"args"': 传递给启动命令的参数数组。
- 如果使用 'npx' 安装,参数通常是 '@sylphlab/pdf-reader-mcp'。确保MCP主机在正确的项目目录下启动命令,以便服务器能够解析相对路径。
- 如果使用 'docker' 镜像,参数包括 'run', '-i', '--rm' 以及卷映射 '-v /path/to/your/project:/app' (将您的项目目录挂载到容器内部的 '/app' 目录),最后是镜像名称 'sylphlab/pdf-reader-mcp:latest'。
配置示例(非实际JSON代码块,仅说明关键信息):
-
使用 npm/npx 方式的配置信息:
- 服务器标识名称: 'pdf-reader-mcp'
- 显示名称: 'PDF Reader (npx)'
- 命令: 'npx'
- 参数: '["@sylphlab/pdf-reader-mcp"]'
-
使用 Docker 方式的配置信息:
- 服务器标识名称: 'pdf-reader-mcp'
- 显示名称: 'PDF Reader (Docker)'
- 命令: 'docker'
- 参数: '["run", "-i", "--rm", "-v", "/您的项目路径:/app", "sylphlab/pdf-reader-mcp:latest"]' (请将 '/您的项目路径' 替换为实际路径)
基本使用方法
一旦服务器配置并成功运行,您的MCP客户端就可以通过发送JSON-RPC请求来调用其提供的 'read_pdf' 工具。
典型的工具调用请求参数结构如下:
- 'tool_name': 必须是 '"read_pdf"'。
- 'arguments': 一个JSON对象,包含PDF处理的详细选项:
- 'sources': 必需,一个数组,包含要处理的PDF来源。
- 每个来源是一个对象,必须包含 'path' (本地相对路径) 或 'url' (远程URL),但不能同时包含两者。
- 每个来源对象可选包含 'pages' 字段,指定要提取的页码(可以是数字数组或逗号分隔的页码/范围字符串,如 '"1,3-5,7"')。如果指定了 'pages',该来源将只提取指定页的文本,忽略顶层的 'include_full_text' 设置。
- 'include_full_text': 可选,布尔值,默认为 'false'。如果为 'true' 且来源未指定 'pages',则提取PDF全文。
- 'include_metadata': 可选,布尔值,默认为 'true'。是否包含PDF的元数据和信息。
- 'include_page_count': 可选,布尔值,默认为 'true'。是否包含PDF的总页数。
- 'sources': 必需,一个数组,包含要处理的PDF来源。
示例请求(假设请求一个本地文件 'my_report.pdf' 的元数据和第2页文本):
- 请求的 'tool_name' 是 '"read_pdf"'。
- 请求的 'arguments' 是一个 JSON 对象,其内容类似于:
- 'sources': 包含一个对象 '{ "path": "./documents/my_report.pdf", "pages": [2] }'
- 'include_metadata': 'true'
- 'include_page_count': 'false'
- 'include_full_text': 'false' (对于此来源,由于指定了 pages,此项被忽略)
服务器将返回一个JSON-RPC响应,成功时包含 'result' 字段。 'result' 内容包含一个 'content' 数组,其中一个条目的 'text' 字段是一个JSON字符串,解析后结构类似于:
- 一个包含 'results' 数组的对象。
- 'results': 数组中每个元素对应一个来源的处理结果。
- 每个来源结果是一个对象,包含:
- 'source': 描述来源(原路径或URL)。
- 'success': 布尔值,指示该来源是否成功处理。
- 'data': 如果成功,包含提取的数据对象,可能包含 'info', 'metadata', 'num_pages', 'full_text', 'page_texts' (特定页面文本列表), 'warnings' (警告信息数组)。
- 'error': 如果失败,包含一个描述错误信息的字符串。
信息
分类
数据库与文件