Skip to main content
Glama

Simple Document Processing MCP Server

pdf_merger

Combine multiple PDF files into a single document using the Simple Document Processing MCP Server. Specify input PDF paths and output directory for efficient file management.

Instructions

Merge multiple PDF files into one

Input Schema

NameRequiredDescriptionDefault
inputPathsYesPaths to the input PDF files
outputDirYesDirectory where merged PDFs should be saved

Input Schema (JSON Schema)

{ "properties": { "inputPaths": { "description": "Paths to the input PDF files", "items": { "type": "string" }, "type": "array" }, "outputDir": { "description": "Directory where merged PDFs should be saved", "type": "string" } }, "required": [ "inputPaths", "outputDir" ], "type": "object" }

Implementation Reference

  • The core handler function `mergePDFs` that implements the PDF merging logic using pdf-lib. It reads multiple PDF files, copies all pages into a new PDFDocument, generates a unique filename, and saves the result.
    export async function mergePDFs(inputPaths: string[], outputDir: string) { try { console.error(`Starting PDF merge operation...`); console.error(`Input files:`, inputPaths); console.error(`Output directory: ${outputDir}`); // 確保輸出目錄存在 try { await fs.access(outputDir); console.error(`Output directory exists: ${outputDir}`); } catch { console.error(`Creating output directory: ${outputDir}`); await fs.mkdir(outputDir, { recursive: true }); console.error(`Created output directory: ${outputDir}`); } const uniqueId = generateUniqueId(); console.error(`Generated unique ID for this batch: ${uniqueId}`); // 修改輸出檔案名稱,加入 uniqueId const outputPath = path.join(outputDir, `merged_${uniqueId}.pdf`); console.error(`New output path with unique ID: ${outputPath}`); const mergedPdf = await PDFDocument.create(); for (const filePath of inputPaths) { console.error(`Processing input file: ${filePath}`); const pdfBytes = await fs.readFile(filePath); console.error(`Read ${pdfBytes.length} bytes from ${filePath}`); const pdf = await PDFDocument.load(pdfBytes); const pageCount = pdf.getPageCount(); console.error(`Loaded PDF with ${pageCount} pages from ${filePath}`); const copiedPages = await mergedPdf.copyPages(pdf, pdf.getPageIndices()); console.error(`Copied ${copiedPages.length} pages from ${filePath}`); copiedPages.forEach((page, index) => { mergedPdf.addPage(page); console.error(`Added page ${index + 1} from ${filePath}`); }); } const mergedPdfBytes = await mergedPdf.save(); console.error(`Generated merged PDF: ${mergedPdfBytes.length} bytes`); await fs.writeFile(outputPath, mergedPdfBytes); console.error(`Successfully wrote merged PDF to ${outputPath}`); return { success: true, data: `Successfully merged ${inputPaths.length} PDFs into ${outputPath}`, }; } catch (error) { console.error(`Error in mergePDFs:`); console.error(error); if (error instanceof Error) { console.error(`Error name: ${error.name}`); console.error(`Error message: ${error.message}`); console.error(`Error stack: ${error.stack}`); } return { success: false, error: error instanceof Error ? error.message : "Unknown error", }; } }
  • The `PDF_MERGE_TOOL` definition providing the tool's name, description, and input schema for validation.
    export const PDF_MERGE_TOOL: Tool = { name: "pdf_merger", description: "Merge multiple PDF files into one", inputSchema: { type: "object", properties: { inputPaths: { type: "array", items: { type: "string" }, description: "Paths to the input PDF files", }, outputDir: { type: "string", description: "Directory where merged PDFs should be saved", }, }, required: ["inputPaths", "outputDir"], }, };
  • src/index.ts:95-111 (registration)
    Dispatch logic in the main server request handler for CallToolRequestSchema that matches tool name 'pdf_merger' and invokes the mergePDFs handler.
    if (name === "pdf_merger") { const { inputPaths, outputDir } = args as { inputPaths: string[]; outputDir: string; }; const result = await mergePDFs(inputPaths, outputDir); if (!result.success) { return { content: [{ type: "text", text: `Error: ${result.error}` }], isError: true, }; } return { content: [{ type: "text", text: fileOperationResponse(result.data) }], isError: false, }; }
  • Re-export and inclusion of PDF_MERGE_TOOL in the central tools array used for ListTools response and server capabilities.
    import { PDF_MERGE_TOOL, PDF_SPLIT_TOOL } from "./pdfTools.js"; import { TEXT_DIFF_TOOL, TEXT_ENCODING_CONVERT_TOOL, TEXT_FORMAT_TOOL, TEXT_SPLIT_TOOL } from "./txtTools.js"; export const tools = [DOCUMENT_READER_TOOL, PDF_MERGE_TOOL, PDF_SPLIT_TOOL, DOCX_TO_PDF_TOOL, DOCX_TO_HTML_TOOL, HTML_CLEAN_TOOL, HTML_TO_TEXT_TOOL, HTML_TO_MARKDOWN_TOOL, HTML_EXTRACT_RESOURCES_TOOL, HTML_FORMAT_TOOL, TEXT_DIFF_TOOL, TEXT_SPLIT_TOOL, TEXT_FORMAT_TOOL, TEXT_ENCODING_CONVERT_TOOL, EXCEL_READ_TOOL, FORMAT_CONVERTER_TOOL];
  • Helper function generateUniqueId used to create unique filenames for merged PDFs.
    function generateUniqueId(): string { return randomBytes(9).toString("hex"); }

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/cablate/mcp-doc-forge'

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